trl.h
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:14k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  trl.h  - interface of tree library of GNU SQL precompiler
  3.  *
  4.  *  This file is a part of GNU SQL Server
  5.  *
  6.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  *  Developed at the Institute of System Programming, Russia
  8.  *  This file is written by Michael Kimelman
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  *  Contact:  gss@ispras.ru
  25.  *
  26.  */
  27. /* $Id: trl.h,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. #ifndef __TRL_H__
  29. #define __TRL_H__
  30. #ifndef CHECK_TRL
  31. #  define CHECK_TRL
  32. #endif
  33. #include "setup_os.h"
  34. #include "vmemory.h"
  35. #include "liter.h"
  36. typedef enum {          
  37.   SQL_SUCCESS  = 0,                 
  38.   SQL_ERROR    = 1,                 
  39.   SQL_WARNING  =-1                  
  40. } CODERT;                        /* general purpose return code */
  41. /*******==================================================*******
  42. *******            Type descriptions                       *******
  43. *******==================================================*******/
  44. #include "sql_type.h"
  45. /*******==================================================*******
  46. *******            Position descriptions                   *******
  47. *******==================================================*******/
  48. typedef i4_t POSITION;        /* line number in source SQL code */
  49. /*******==================================================*******
  50. *******====================================================*******
  51. *******               TREE  NODES                          *******
  52. *******====================================================*******
  53. *******==================================================*******/
  54. typedef union node *PNODE;
  55. #define VCBREF  TXTREF
  56. #define TXTREF  VADR
  57. #define TNULL   (TXTREF)(VNULL)
  58. PNODE Pnode __P((TXTREF n));
  59. /*******==================================================*******
  60. *******             tree  node codes                       *******
  61. *******==================================================*******/
  62. #define DEF_TOKEN(CODE,NAME,FORMAT,STRUCT,FLAGS)   CODE ,
  63. enum token
  64. {
  65. #include "treecode.def"
  66.   LAST_TOKEN};
  67. #define NUM_TRN_CODE  ((i4_t)LAST_TOKEN+1)
  68. struct tkn_info{
  69.   char *name,
  70.        *format,
  71.         struct_cod,
  72.        *flags;
  73.   i4_t   length;
  74. };
  75. extern struct tkn_info token_info[NUM_TRN_CODE];
  76. extern i4_t             Max_operands;
  77. #define  FORMAT(CODE)   token_info[CODE].format
  78. #define  STRUCT(CODE)   token_info[CODE].struct_cod
  79. #define  NAME_l(CODE)   token_info[CODE].name
  80. #define  NAME(CODE)     (NAME_l(CODE)?NAME_l(CODE):"NULL")
  81. #define  FLAGS(CODE)    token_info[CODE].flags
  82. #define  LENGTH(CODE)   token_info[CODE].length
  83. /*******==================================================*******
  84. *******             tree  node flags                       *******
  85. *******==================================================*******/
  86. typedef i4_t MASKTYPE;
  87. #define DEF_FLAG_BIT(CODE,NAME,CLASS,BIT_NO)  CODE,
  88. #define DEF_FLAG(CODE,NAME,CLASS)             CODE,
  89. enum flags{
  90. #include "treeflag.def"
  91.   LAST_FLAG};
  92. #define NUMBER_OF_FLAGS  ((i4_t)LAST_FLAG+1)
  93. #define DEF_FLAG_BIT(CODE,NAME,CLASS,BIT_NO)  bt_##CODE = BIT_NO,
  94. #define DEF_FLAG(CODE,NAME,CLASS)             bt_##CODE,
  95. enum flags_bit{
  96. #include "treeflag.def"
  97.   LAST_AND_NONMEANABLE_BIT };
  98. struct flag_info{
  99.   char      *name,
  100.              class_cod;
  101.   MASKTYPE   value;
  102. };
  103. extern struct flag_info flg_info[NUMBER_OF_FLAGS];
  104. #define NAME_FL(FCODE)        flg_info[FCODE].name
  105. #define CLASS(FCODE)          flg_info[FCODE].class_cod
  106. #define FLAG_VALUE(FCODE)     flg_info[FCODE].value
  107. i4_t Compatible_Tok_Fl __P((enum token code,enum flags fcode));
  108. /*
  109. MASKTYPE SetF __P((MASKTYPE FLAG,enum flags FLAG_CODE));
  110. MASKTYPE ClrF __P((MASKTYPE FLAG,enum flags FLAG_CODE));
  111. MASKTYPE TstF __P((MASKTYPE FLAG,enum flags FLAG_CODE));
  112. */
  113. #define SetF(FLAG,FCODE)  (FLAG SETVL FLAG_VALUE(FCODE))
  114. #define ClrF(FLAG,FCODE)  (FLAG CLRVL FLAG_VALUE(FCODE))
  115. #define TstF(FLAG,FCODE)  (FLAG TSTVL FLAG_VALUE(FCODE))
  116. /*******==================================================*******
  117. *******             Common tree  nodes                     *******
  118. *******==================================================*******/
  119. typedef union trunion_def{
  120.      TXTREF            txtp;
  121.      LTRLREF           ltrp;
  122.      POSITION          pos;
  123.      sql_type_t        type;
  124.      i4_t              l;
  125.      float             f;
  126.      void             *ptr;
  127.     }  tr_union;
  128. typedef struct {
  129.    enum token   code;               /* node type code             */
  130.    MASKTYPE     mask;               /* node flags                 */
  131.                                     /*                            */
  132.    tr_union    operands[1];         /* array of node's fileds     */
  133.  } tree_t, *trn;
  134. trn  Ptree __P((TXTREF n));
  135. #define SIZE_TRN(code)     (sizeof(tree_t)+(LENGTH(code)-1)*sizeof(tr_union))
  136. #define ADD_TRN_SIZE(code) (sizeof(tr_union)*PTRN_ELEM(code))
  137. /*******<< FICTIVE FUNCTIONS >>******************************************/
  138. /*-----<< Actually, that's lvalue macros >>-------------------*/
  139. enum token  CODe_TRN __P((trn node));
  140. MASKTYPE    MASk_TRN __P((trn node));
  141. tr_union    XOp_TRN __P(( trn node,i4_t n));  /* really lvalue reference */
  142. TXTREF      XTXt_TRN __P((trn node,i4_t n));
  143. VCBREF      XVCb_TRN __P((trn node,i4_t n));
  144. LTRLREF     XLTr_TRN __P((trn node,i4_t n));
  145. i4_t        XLNg_TRN __P((trn node,i4_t n));
  146. float       XFLt_TRN __P((trn node,i4_t n));
  147. /* Tabid       XREl_TRN(trn node,i4_t n); */
  148. POSITION    LOCATIOn_TRN __P((trn node));
  149. TXTREF      RIGHt_TRN    __P((trn node));
  150. TXTREF      DOWn_TRN     __P((trn node));
  151. i4_t        ARITy_TRN    __P((trn node));
  152. i4_t         HAS_DOWn     __P((trn node));
  153. enum token  CODE_TRN  __P((TXTREF node));
  154. MASKTYPE    MASK_TRN  __P((TXTREF node));
  155. tr_union    XOP_TRN   __P((TXTREF node,i4_t n));  
  156. TXTREF      XTXT_TRN  __P((TXTREF node, i4_t n ));
  157. VCBREF      XVCB_TRN  __P((TXTREF node, i4_t n ));
  158. LTRLREF     XLTR_TRN  __P((TXTREF node, i4_t n ));
  159. i4_t        XLNG_TRN  __P((TXTREF node, i4_t n ));
  160. float       XFLT_TRN  __P((TXTREF node, i4_t n ));
  161. POSITION  LOCATION_TRN __P((TXTREF node));
  162. TXTREF    RIGHT_TRN    __P((TXTREF node));
  163. TXTREF    DOWN_TRN     __P((TXTREF node));
  164. i4_t      ARITY_TRN    __P((TXTREF node));
  165. i4_t       HAS_DOWN     __P((TXTREF node));
  166. /*******==================================================*******
  167. *******            Pattern Recognizer info                 *******
  168. *******==================================================*******/
  169. #define LONGBITS         (8*sizeof(i4_t))  /*32*/
  170. #define PTRN_ELEM(code) 
  171.  ((i4_t)(LENGTH(code)/LONGBITS)+(LENGTH(code)%LONGBITS?1:0))
  172. #define PTRN_OP(code,op_n)    (LENGTH(code)+op_n/LONGBITS)
  173. #define PTRN_BIT(op_n)        (op_n%LONGBITS)
  174. #define SET_BIT(lv,bit)   lv SETVL BITVL(bit)
  175. #define CLR_BIT(lv,bit)   lv CLRVL BITVL(bit)
  176. #define TST_BIT(lv,bit)   lv TSTVL BITVL(bit)
  177. #define COPY_NODE(code, orig, copy)
  178. {
  179.   enum token local_code = (code);
  180.   register TXTREF local_c, local_o = (orig);
  181.   local_c = gen_node1 (local_code, MASK_TRN (local_o)); 
  182.   bcopy ((void *) Ptree (local_o),
  183.          (void *) Ptree (local_c),
  184.          trn_size (local_code, MASK_TRN(local_o)));
  185.   CODE_TRN(local_c) = local_code;
  186.   (copy) = local_c;
  187. }
  188. /*==============================================================*
  189. *   TRL vector.  These appear inside TRN's when there is a need  *
  190. *  for a variable number of somethings.                          *
  191. *==============================================================*/
  192. typedef struct trvec_def{
  193.   i4_t       num_elem;             /* number of elements      */
  194.   tr_union  elem[1];
  195. } *trvec;
  196. trvec   Ptrvec __P((TXTREF n));
  197. TXTREF   XVEc_TRN __P((trn node,i4_t n));
  198. TXTREF   XVEC_TRN __P((TXTREF node,i4_t n));
  199. i4_t      VLEn __P((trvec  vec));
  200. i4_t      VLEN __P((TXTREF vec));
  201. tr_union VOp __P((trvec   vec,i4_t n));  /* really lvalue reference */
  202. tr_union VOP __P((TXTREF  vec,i4_t n));  /* really lvalue reference */
  203. i4_t      XLEN_VEC __P((TXTREF  node,i4_t vecnumber));
  204. /*   XOP_VEC(node,n,m)   node -- TXTREF pointer to trn           
  205.  *                        n   -- number of param, what is vector    
  206.  *                        m   -- number of vectors element          
  207.  */
  208. tr_union XOP_VEC __P((TXTREF node,i4_t n,i4_t m)); /* this is lvalue reference */
  209. /*******==================================================*******
  210. *******             Special tree  nodes                    *******
  211. *******==================================================*******/
  212. #include "treecode.def"       /* usefull tree structures declaration */
  213. typedef union node {              /*===================================*/
  214.    tree_t              t;         /* general purpose node       ( all )*/
  215.    STATEMENT           stmt;      /* operators                  (tree )*/
  216.    OPERATION           oper;      /* operation, subtree         (tree )*/
  217.    DB_TABL             db_tbl;    /* table reference            (tree )*/
  218.    DB_OBJ              db_obj;    /* other objects        (tree leaves)*/
  219.    struct column       colmn;     /* table columns              (vocab)*/
  220.    struct table        tbl;       /* table and views            (vocab)*/
  221.    struct cursor_name  nm;        /* exported cursor names      (vocab)*/
  222.    struct corr_name    crlnm;     /* scan (the table instance)    (vcb)*/
  223.    struct constant     cnst;      /*                        (tree leaf)*/
  224.    struct parameter    param;     /*                            (vocab)*/
  225. } NODE;                           /*===================================*/ 
  226. /*******==================================================*******
  227. *******====================================================*******
  228. *******         Tree processing functions interface        *******
  229. *******====================================================*******
  230. *******==================================================*******/
  231. TXTREF   gen_node __P((enum token code));           /* generate node         */
  232. TXTREF   gen_node1 __P((enum token code,MASKTYPE msk)); /* generate node     */
  233. TXTREF   gen_vect __P((i4_t len));                   /* generate vector       */
  234. TXTREF   realloc_vect __P((TXTREF n,i4_t newlen));   /* change size of vector */
  235. void     free_node __P((TXTREF node));              /* free node             */
  236. void     free_vect __P((TXTREF vec));               /* free vector           */
  237. TXTREF   gen_const_node __P((SQLType code,char *info));
  238. void     free_line __P((TXTREF right));
  239. void     free_tree __P((TXTREF root));
  240. void     toggle_mark1f __P((i4_t i));
  241. void     debug_trn_d __P((trn x));                  /* for debugs dump       */
  242.                                                     /* to stderr             */
  243. void     debug_trn __P((TXTREF x));                 /* for debugs dump       */
  244.                                                     /* to stderr             */
  245. void     print_trl __P((TXTREF trn_first,           /* if trn_first=NULL     */
  246.                           FILE *outf));             /* prints all program    */
  247. TXTREF   read_trn __P((FILE *infile,i4_t *line,      /* read tree node from   */
  248.   MASKTYPE def_msk));               /* infile                */
  249. void     load_trl __P((FILE *inf));                 /* read all tree from    */
  250.                                                     /* infile                */
  251. void     load_trlfile __P((char *flname));          /* read all tree from    */
  252.                                                     /* flname                */
  253. TXTREF   copy_trn __P((TXTREF orig));               /*                       */
  254. i4_t      trn_equal_p __P((TXTREF x,TXTREF  y));     /*                       */
  255. i4_t trn_size __P((enum token code, MASKTYPE msk));
  256. CODERT   add_statement __P((TXTREF p));
  257. TXTREF   get_statement __P((i4_t number));
  258. CODERT   del_statement __P((i4_t number));
  259. #include "vcblib.h"
  260. #include "trl_macro.h"
  261. enum kind_of_root{
  262.   Tree_Root,
  263.   Vcb_Root,
  264.   Hash_Tbl,
  265.   G_Author,
  266.   Current_Tree_Segment
  267. };
  268.   
  269. TXTREF *Root_ptr __P((enum kind_of_root sel));
  270. #if defined(ROOT)  || defined(GL_AUTHOR)
  271.   #error either ROOT or GL_AUTHOR has been already defined somewhere!!!!
  272. #else
  273.   #define ROOT          *(Root_ptr(Tree_Root))
  274.   #define GL_AUTHOR     *(Root_ptr(G_Author))
  275. #endif
  276. /*******==================================================*******
  277. *******====================================================*******
  278. *******               GLOBAL  OPERATIONS                   *******
  279. *******====================================================*******
  280. *******==================================================*******/
  281. /*
  282.  *  these 3 functions used just for error reporting from macro and
  283.  * routines which checks if the tree is correct.
  284.  */
  285. i4_t   trl_err __P((char *msg,char *file,i4_t line,trn ptr));
  286. i4_t   trl_wrn __P((char *msg,char *file,i4_t line,trn ptr));
  287. i4_t   fmt_eq __P((char *fmt,char *tst));
  288. /*
  289.  * create new tree segment, mark them as a current one and return identifier of it.
  290.  */
  291. TXTREF create_tree_segment __P((void));
  292. /* do the same but load tree from buffer. */
  293. TXTREF load_tree_segment __P((void *tree_buffer,i4_t len)); 
  294. void   dispose_tree_segment __P((TXTREF ptr_inside));
  295. void  *extract_tree_segment __P((TXTREF ptr_inside,i4_t *len));
  296. /*
  297.  * load tree segment from file "tree_file_name" or just create new one if file
  298.  * name is NULL
  299.  */
  300. CODERT install  __P((char *tree_file_name));
  301. /*
  302.  * extract tree segment and store it in the file or just dispose segment if
  303.  * file name is NULL 
  304.  */
  305. CODERT finish   __P((char *tree_file_name));
  306. TXTREF get_current_tree_segment __P((void));
  307. TXTREF set_current_tree_segment __P((TXTREF ptr_inside));
  308. #endif