/* ** TREE.H -- defines the structure of a querytree ** ** Version: ** @(#)tree.h 8.2 4/13/85 */ # ifndef QT_HDR_SIZ # include /* ** Structures Used In The Value Fields of Querytree nodes */ /* ** STRKEEPER ** ** This stores interval information for a char attribute ** type -- OPEN vs. CLOSED intervals ** strings -- the two delimiters ** flag -- 1st bit set if it is a special character ** 2nd bit set if backwards searching indicated ** number -- which occurance of strings to grab ** */ typedef struct strkeeper { char type[2]; char *string[2]; char flag[2]; char number[2]; } STRKEEPER; /* ** VAR node ** ** This node type contains info for a tuple variable. ** varno -- index into range table ** attno -- attribute number in this relation ** varfrmt -- type of this domain ** varfrml -- length of this domain ** valptr -- pointer to value when bound. ** ** If varno == -1, then this variable has been substituted; to ** get the actual VAR node, follow the chain of valptr's. */ struct varnode { char varno; /* variable number */ char attno; /* attribute number */ char varfrmt; /* type */ char varfrml; /* length */ STRKEEPER *varstr; /* pointer to delimiter */ ANYTYPE *valptr; /* pointer to value */ }; /* ** STRUCTURE FOR AND, AGHEAD, AND ROOT NODES ** ** In the parser and qrymod none of these fields are used. ** Decomp maintains information about the variables ** in the left and right descendents of the nodes. ** The "rootuser" flag is present only in the ROOT and AGHEAD ** nodes. It is TRUE only in the original ROOT node of the query. */ struct rootnode /* AND, AGHEAD, ROOT nodes */ { char tvarc; /* total of var's in sub-tree */ char lvarc; /* # of variables in left branch */ short lvarm; /* bit map of var's in left branch */ short rvarm; /* bit map of var's in right branch*/ short rootuser; /* flag: TRUE if root of user generated query */ }; struct opnode /* AOP, BOP, UOP nodes */ { short opno; /* operator number */ char opfrmt; /* format of function */ char opfrml; /* length of function */ char agfrmt; /* in AOP, format of result */ char agfrml; /* in AOP, length of result */ }; struct resdomnode /* RESDOM node */ { short resno; /* result domain number */ char resfrmt; /* result format */ char resfrml; /* result length */ }; struct srcid /* SOURCEID node */ { short srcvar; /* variable number */ DESC srcdesc; /* descriptor for this var */ }; /* ** SYMVALUE UNION ** ** This union contains all of the types available ** in the value field of a querytree node. */ union symvalue { union anytype sym_data; struct varnode sym_var; struct rootnode sym_root; struct opnode sym_op; struct resdomnode sym_resdom; struct srcid sym_srcid; }; /* ** SYMBOL DEFINITION ** ** Basic symbol structure. "Type" is one of the symbols ** in "symbol.h", "len" is the length of the "value" ** field (0 to 255 bytes), "value" is variable length and ** holds the actual value (if len != 0) of the node. ** The "value" is one of the types contained in "union symvalue". ** ** On a thirty-two bit machine, there are two bytes of padding ** after type and length. These two bytes are discarded ** when a symbol is written to a pipe. ** ** SYMOFF should be set to the number of bytes between ** the start to this structure and where the value field starts */ #define SYMOFF 4 struct symbol { char type; /* type codes in symbol.h */ char len; /* length in bytes of value field */ union symvalue value; int start; /* start of string if char */ }; typedef struct symbol SYMBOL; /* ** QUERYTREE NODE ** ** Basic node in the querytree. Each node has a left and ** right descendent. If the node is a leaf node then the ** left and right pointers will be NULL. Depending on the ** "type" field of the symbol structure, there may be additional ** information. */ struct querytree { struct querytree *left; struct querytree *right; struct symbol sym; }; typedef struct querytree QTREE; /* ** SUNDRY CONSTANTS ** ** There are several differences in the handling of data ** structures on 16 and 32 bit machines: ** 1). A pointer to memory is either 2 or 4 bytes. ** 2). Padding is inserted in structures to insure ** alignment of 16 and 32 bit numbers. ** ** For these reasons the following constant definitions ** are useful for machine independent allocation. ** ** These are based on the PDP11 compile flag. ** ** QT_HDR_SIZ -- size of left and right pointers, typ, ** len and padding ** SYM_HDR_SIZ -- size of type and len in symbol ** structure -- includes any padding before ** the value field ** TYP_LEN_SIZ -- size of type and len in symbol ** structure -- without padding ** ** INGRES FOLKS: don't change these back to sizeof's!!! ** The PDP-11 compiler doesn't understand! */ # ifdef PDP11 # define QT_HDR_SIZ 6 # define SYM_HDR_SIZ 2 # define TYP_LEN_SIZ 2 # else # define QT_HDR_SIZ 12 # define SYM_HDR_SIZ 4 # define TYP_LEN_SIZ 2 # endif PDP11 /* ** Query Tree Header. ** ** Qt_ctx should be of type 'ctx_t *', but it is 'char *' ** to insure that we don't need ctlmod.h. */ struct qthdr { char qt_active; /* if set, Qt area is in use */ char *qt_ctx; /* pointer to context */ short qt_qmode; /* query mode */ short qt_resvar; /* result variable number */ RANGEV qt_rangev[MAXRANGE]; /* the range table */ short qt_remap[MAXRANGE]; /* variable remapping (for QM) */ } Qt; # endif QT_HDR_SIZ