4.3BSD/usr/ingres/source/h/tree.h
/*
** TREE.H -- defines the structure of a querytree
**
** Version:
** @(#)tree.h 8.2 4/13/85
*/
# ifndef QT_HDR_SIZ
# include <ingres.h>
/*
** 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