P8000/WEGA/contrib/ingres/dbs/src/decomp/readq.c

148 lines
2.5 KiB
C

# include <stdio.h>
# include "gen.h"
# include "../h/dbs.h"
# include "../h/aux.h"
# include "../h/symbol.h"
# include "../h/tree.h"
# include "../h/pipes.h"
# include "decomp.h"
/*
** READQUERY
**
** Reads in query symbols from input pipe into core
** locations and sets up information needed for later
** processing.
**
** Returns:
** pointer to start of tree
**
** Side Effects:
**
** Sets Qmode to mode of query
** Resultvar gets result variable number or -1
** Range table gets initialized.
*/
QTREE *readqry()
{
register SYMBOL *s;
register QTREE *q;
register int mark;
register int i;
extern QTREE *readnod();
# ifdef xDTR1
AAtTfp(1, -1, "READQUERY:\n");
# endif
Resultvar = -1;
Qmode = -1;
mark = markbuf(Qbuf);
for ( ; ; )
{
freebuf(Qbuf, mark);
q = readnod(Qbuf);
s = &(q->sym);
# ifdef xDTR1
if (AAtTfp(1, 1, "%d, %d, %d/", s->type, s->len, ctou(s->value[0])))
{
if (s->type == SOURCEID)
printf("%.12s",((SRCID *) s)->srcname);
putchar('\n');
}
# endif
switch (s->type)
{
case QMODE:
Qmode = s->value[0];
break;
case RESULTVAR:
Resultvar = s->value[0];
break;
case SOURCEID:
i =((SRCID *) s)->srcvar;
Rangev[i].relnum = rnum_assign(((SRCID *) s)->srcname);
break;
case TREE:
readtree(Qbuf);
return (q);
default:
AAsyserr(12018, s->type);
}
}
}
QTREE *readnod(buf)
char *buf;
{
register int len;
register int user;
register QTREE *q;
extern QTREE *need();
q = need(buf, QT_HDR_SIZ); /* space for left,right ptrs + type & len */
/* read in type and length */
if (rdpipe(P_NORM, &Inpipe, R_up, &(q->sym), TYP_LEN_SIZ) < TYP_LEN_SIZ)
goto err3;
len = ctou(q->sym.len);
if (len)
{
need(buf, len);
if (rdpipe(P_NORM, &Inpipe, R_up, q->sym.value, len) < len)
goto err3;
return (q);
}
/* if type is and, root, or aghead, allocate 6 or 8 byte for var maps */
user = FALSE;
switch (q->sym.type)
{
case ROOT:
user = TRUE;
case AGHEAD:
len = ROOT_SIZ;
need(buf, len);
((ROOT_NODE *) q)->rootuser = user;
break;
case AND:
len = AND_SIZ;
need(buf, len);
}
q->sym.len = len;
return (q);
err3:
AAsyserr(12019);
}
/*
* readtree
*
* reads in tree symbols into a buffer up to an end root symbol
*
*/
readtree(buf)
char *buf;
{
register QTREE *nod;
do
{
nod = readnod(buf);
# ifdef xDTR1
if (AAtTfp(1, 2, "\t"))
writenod(nod);
# endif
} while (nod->sym.type != ROOT);
clearpipe(); /* This is needed in case query was multiple of 120 bytes */
}