4.3BSD/usr/ingres/source/decomp/qryproc.c
# include <ingres.h>
# include <aux.h>
# include <tree.h>
# include <symbol.h>
# include "globs.h"
# include <pv.h>
# include <lock.h>
# include <resp.h>
# include <sccs.h>
# include <errors.h>
SCCSID(@(#)qryproc.c 8.4 12/18/85)
/* Control Module configuration information structure */
extern int de_init();
extern int de_rubproc();
extern int qryproc();
struct fn_def DeOvqpFn =
{
"DECOMP/OVQP",
qryproc,
de_init,
de_rubproc,
(char *) &De,
sizeof De,
tTdecomp,
100,
'D',
0,
};
/*ARGSUSED*/
qryproc(pc, pv)
int pc;
PARM *pv;
{
register QTREE *root, *q;
register int i;
int mode, result_num, retr_uniq;
extern long Accuread, Accuwrite, Accusread;
extern int derror();
int loc_qbuf[1+QBUFSIZ/sizeof(int)];
# ifdef xDTR1
if (tTf(50, 0))
{
Accuread = 0;
Accusread = 0;
Accuwrite = 0;
}
# endif
De.de_qbuf = (char *)loc_qbuf;
initbuf((char *)loc_qbuf, QBUFSIZ, QBUFFULL, derror);
/* init various variables in decomp for start of this query */
startdecomp();
/* Read in query, range table and mode */
if (pv[0].pv_type != PV_QTREE)
syserr("qryproc: bad parameter");
root = pv[0].pv_val.pv_qtree;
/* a john fix (below)
root->sym.value.sym_root.rootuser = TRUE; */
# ifdef xDTR1
if (tTf(50, 4))
{
printf("qryproc\n");
treepr(root);
}
# endif
/* initialize qt parameters */
mode = De.de_qmode = Qt.qt_qmode;
De.de_resultvar = Qt.qt_resvar;
/*
** Initialize range table. This code should eventually
** be changed to take advantage of the fact that all
** the openrs are already done by the control module.
*/
for (i = 0; i < MAXRANGE; i++)
{
if (Qt.qt_rangev[i].rngvdesc != NULL)
{
De.de_rangev[i].relnum = rnum_assign(Qt.qt_rangev[i].rngvdesc->reldum.relid);
}
}
/* Initialize relation descriptors */
initdesc(mode);
/* locate pointers to QLEND and TREE nodes */
for (q = root->right; q->sym.type != QLEND; q = q->right)
continue;
De.de_qle = q;
for (q = root->left; q->sym.type != TREE; q = q->left)
continue;
De.de_tr = q;
/* map the complete tree */
mapvar(root, 0);
/* set logical locks */
if (Lockrel)
lockit(root, De.de_resultvar);
/* If there is no result variable then this must be a retrieve to the terminal */
De.de_qry_mode = De.de_resultvar < 0 ? mdRETTERM : mode;
/* if the mode is retrieve_unique, then make a result rel */
retr_uniq = mode == mdRET_UNI;
if (retr_uniq)
{
mk_unique(root);
mode = mdRETR;
}
/* get id of result relation */
if (De.de_resultvar < 0)
result_num = NORESULT;
else
result_num = De.de_rangev[De.de_resultvar].relnum;
/* evaluate aggregates in query */
aggregate(root);
/* decompose and process aggregate free query */
decomp(root, mode, result_num);
/* If this is a retrieve unique, then retrieve results */
if (retr_uniq)
pr_unique(root, De.de_resultvar);
if (mode != mdRETR)
i = ACK;
else
i = NOACK;
i = endovqp(i);
# ifdef xDTR1
if (tTf(50, 1))
{
printf("DECOMP read %ld pages,", Accuread);
printf("%ld catalog pages,", Accusread);
printf("wrote %ld pages\n", Accuwrite);
}
# endif
/* call update processor if batch mode */
if (i == UPDATE)
{
initp();
call_dbu(mdUPDATE, -1);
}
/* clean decomp */
reinit();
if (i != UPDATE)
Resp.resp_tups = De.ov_tupsfound;
return (0);
}