Annotation of 42BSD/ingres/source/decomp/decomp.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <aux.h>
        !             3: # include      <tree.h>
        !             4: # include      <symbol.h>
        !             5: # include      "globs.h"
        !             6: # include      <sccs.h>
        !             7: 
        !             8: SCCSID(@(#)decomp.c    7.2     2/9/83)
        !             9: 
        !            10: /*
        !            11: ** DECOMP -- Process a query given a query tree and range table.
        !            12: **
        !            13: **     Decomp processes any arbitrary query by converting it into
        !            14: **     a sequence of "one variable queries"; eg. queries involving
        !            15: **     at most one source relation. This file and decision.c contain
        !            16: **     the principle decision making routines.
        !            17: **
        !            18: **     Decomp() is called with a pointer to a query tree, the mode
        !            19: **     of the query (retrieve, append, etc.), and the internal name
        !            20: **     of the result relation (if any). The routines included are:
        !            21: **
        !            22: **     Decomp  -- Opens the source relations and decides whether the
        !            23: **                     query is multi-variable or single/zero variable.
        !            24: **
        !            25: **     Decompx -- Takes a multivariable query, removes and executes any
        !            26: **                     one-var restrictions and passes the remaining query
        !            27: **                     to decompz (if one/zero variable) or decision().
        !            28: **
        !            29: **     Decompy -- Performs "tuple substitution" on a multi-var query,
        !            30: **                     does any new one-var restrictions and passes the
        !            31: **                     remaining query to decompz (if one/zero variable)
        !            32: **                     or decision().
        !            33: **
        !            34: **     Decompz -- Executes a one/zero variable query by calling call_ovqp().
        !            35: */
        !            36: /*
        !            37: **     Process query by calling either decompx for multivar
        !            38: **     or decompz for 0 or 1 var query. Decomp() must guarantee
        !            39: **     that the range table is the same upon exiting as it was
        !            40: **     when entered. Newquery() and endquery() perform that function.
        !            41: **
        !            42: **     Trace Flags:
        !            43: **             30
        !            44: */
        !            45: 
        !            46: decomp(q, qmode, result_num)
        !            47: QTREE  *q;
        !            48: int    qmode;
        !            49: int    result_num;
        !            50: {
        !            51:        register QTREE  *root;
        !            52:        register int    vc, i;
        !            53:        int             locrange[MAXRANGE];
        !            54: 
        !            55:        root = q;
        !            56:        vc = root->sym.value.sym_root.tvarc;
        !            57: #      ifdef xDTR1
        !            58:        if (tTf(30, 0))
        !            59:                printf("DECOMP: %d-var query, result_num=%d\n", vc, result_num);
        !            60:        if (tTf(30, 1))
        !            61:        {
        !            62:                printf("DECOMP\n");
        !            63:                treepr(root);
        !            64:        }
        !            65: #      endif
        !            66: 
        !            67:        openrs(root);
        !            68: 
        !            69:        if (vc > 1)
        !            70:        {
        !            71:                newquery(locrange);
        !            72:                i = decompx(root, qmode, result_num);
        !            73:                endquery(locrange, FALSE);      /* don't reopen previous range */
        !            74:        }
        !            75:        else
        !            76:        {
        !            77:                De.de_newq = 1;
        !            78:                De.de_sourcevar = -1;
        !            79:                i = decompz(root, qmode, result_num);
        !            80:        }
        !            81:        
        !            82:        /*
        !            83:        ** remove the range variables that the view subsystem
        !            84:        ** might have placed in.
        !            85:        */
        !            86:        clrrange();
        !            87: 
        !            88:        return (i);
        !            89: }
        !            90: /*
        !            91: ** Decompx -- Initialize for multi-variable query.
        !            92: **     All one-variable subqueries are run.
        !            93: **     If the remaining query is still multi-var
        !            94: **     then decision() is called; else decompz()
        !            95: **     is called. The range table is restored
        !            96: **     after the query is complete.
        !            97: **     The tempvars from the exec_sq() are left on the
        !            98: **     tree since it is presumed that the tree will be discarded
        !            99: **     anyway.
        !           100: **
        !           101: **     Trace Flags:
        !           102: **             31
        !           103: */
        !           104: 
        !           105: decompx(root, qmode, result_num)
        !           106: QTREE  *root;
        !           107: int    qmode;
        !           108: int    result_num;
        !           109: {
        !           110:        register int    i, vc;
        !           111:        int             disj;
        !           112:        char            sqbuf[SQSIZ];
        !           113:        QTREE           *sqlist[MAXRANGE];
        !           114:        int             locrang[MAXRANGE], sqrange[MAXRANGE];
        !           115:        extern int      derror();
        !           116: 
        !           117:        vc = root->sym.value.sym_root.tvarc;
        !           118:        initbuf(sqbuf, SQSIZ, SQBUFFULL, derror);
        !           119:        pull_sq(root, sqlist, locrang, sqrange, sqbuf);
        !           120:        if ((i = exec_sq(sqlist, sqrange, &disj)) != -1) 
        !           121:        {
        !           122:                undo_sq(sqlist, locrang, sqrange, i, i, FALSE);
        !           123:                return (FALSE);
        !           124:        }
        !           125:        vc -= disj;
        !           126:        tempvar(root, sqlist, sqbuf);
        !           127:        if (pull_const(root, sqbuf) == 0)
        !           128:                return (FALSE);
        !           129:        if (vc <= 1)
        !           130:        {
        !           131:                De.de_sourcevar = -1;
        !           132:                De.de_newq = 1;
        !           133:                return (decompz(root, qmode, result_num));
        !           134:        }
        !           135:        i = decision(root, qmode, result_num, sqbuf);
        !           136:        undo_sq(sqlist, locrang, sqrange, MAXRANGE, MAXRANGE, FALSE);
        !           137:        return (i);
        !           138: }
        !           139: /*
        !           140: ** Decompy -- decompose a multi-variable query by tuple substitution.
        !           141: **     First a variable is selected
        !           142: **     for substitution. Then for each tuple in the
        !           143: **     selected variable, all one variable restrictions
        !           144: **     are done (exec_sq) and the remaining query is
        !           145: **     solved by calling either decompz() or recursively
        !           146: **     decision().
        !           147: **
        !           148: **     The original tree and range table are guaranteed to
        !           149: **     be the same on entry and exit (modulo the effects of
        !           150: **     reformat()).
        !           151: **
        !           152: **     Trace Flags:
        !           153: **             32
        !           154: */
        !           155: 
        !           156: decompy(q, qmode, result_num, sqbuf)
        !           157: QTREE  *q;
        !           158: int    qmode;
        !           159: int    result_num;
        !           160: char   *sqbuf;
        !           161: {
        !           162:        register QTREE  *root;
        !           163:        register int    j, vc;
        !           164:        DESC            *d;
        !           165:        QTREE           *newroot;
        !           166:        int             constl, sqcnt, var, srcvar, maxsqcnt;
        !           167:        int             disj, tc, qtrue;
        !           168:        TID             tid, hitid;
        !           169:        char            *tuple;
        !           170:        QTREE           *sqlist[MAXRANGE];
        !           171:        int             sqmark, sqmark1;
        !           172:        int             locrang[MAXRANGE], sqrange[MAXRANGE];
        !           173:        extern DESC     *readopen();
        !           174:        extern char     *need(), *rangename();
        !           175:        extern QTREE    *copy_ands();
        !           176: 
        !           177:        root = q;
        !           178:        vc = root->sym.value.sym_root.tvarc;
        !           179: 
        !           180: #      ifdef xDTR1
        !           181:        if (tTf(32, -1))
        !           182:                printf("DECOMPY:%x,vc=%d\n", root, vc);
        !           183: #      endif
        !           184: 
        !           185:        sqmark = markbuf(sqbuf);
        !           186:        constl = !root->sym.value.sym_root.lvarc;
        !           187:        qtrue = FALSE;
        !           188: 
        !           189:        if ((var = selectv(root)) < 0)
        !           190:                return (qtrue);
        !           191:        d = readopen(var);      /* gets full descriptor for setvar & get */
        !           192:        tuple = need(sqbuf, d->reldum.relwid);
        !           193:        setvar(root, var, &tid, tuple);
        !           194:        pull_sq(root, sqlist, locrang, sqrange, sqbuf);
        !           195:        tempvar(root, sqlist, sqbuf);
        !           196:        reformat(var, sqlist, locrang, sqbuf, root);
        !           197:        vc--;
        !           198: # ifdef xDTR2
        !           199:        if (tTf(32, 0))
        !           200:        {
        !           201:                printf("DECOMPY: &tup=%x, ", tuple);
        !           202:                printdesc(d);
        !           203:        }
        !           204: # endif xDTR2
        !           205: 
        !           206:        /* HERE FOR MULTI-VAR SUBSTITUTION */
        !           207:        sqmark1 = markbuf(sqbuf);
        !           208:        De.de_newq = 1;
        !           209:        tc = 0;
        !           210:        sqcnt = maxsqcnt = 0;
        !           211:        srcvar = -1;
        !           212:        De.de_sourcevar = -1;
        !           213:        find(readopen(var), NOKEY, &tid, &hitid);
        !           214:        while (!(j=get(readopen(var), &tid, &hitid, tuple, NXTTUP)))
        !           215:        {
        !           216: #              ifdef xDTR1
        !           217:                if (tTf(32, 2))
        !           218:                {
        !           219:                        printf("Subst:");
        !           220:                        printup(readopen(var), tuple);
        !           221:                }
        !           222: #              endif
        !           223:                tc++;
        !           224:                if (vc > 1)
        !           225:                {
        !           226:                        reset_sq(sqlist, locrang, sqcnt);
        !           227:                        if ((sqcnt = exec_sq(sqlist, sqrange, &disj)) != -1) 
        !           228:                                continue;
        !           229: 
        !           230:                        maxsqcnt = sqcnt;
        !           231:                        vc -= disj;
        !           232:                        if (vc <= 1)
        !           233:                        {
        !           234:                                De.de_sourcevar = srcvar;
        !           235:                                qtrue |= decompz(root, qmode, result_num);
        !           236:                                srcvar = De.de_sourcevar;
        !           237:                        }
        !           238:                        else
        !           239:                        {
        !           240:                                freebuf(sqbuf, sqmark1);
        !           241:                                newroot = copy_ands(root, sqbuf);
        !           242:                                qtrue |= decision(newroot, qmode, result_num, sqbuf);
        !           243:                        }
        !           244:                        vc += disj;
        !           245:                }
        !           246:                else
        !           247:                        qtrue |= decompz(root, qmode, result_num);
        !           248: 
        !           249:                /* check for early termination on constant Target list */
        !           250:                if (constl && qtrue) 
        !           251:                        break;
        !           252:        }
        !           253:        if (j < 0) 
        !           254:                syserr("decompy: bad get %d on %.12s", j, readopen(var)->reldum.relid);
        !           255: 
        !           256:        /* undo the effect of pulling the sub queries */
        !           257:        origvar(root, sqlist);
        !           258:        undo_sq(sqlist, locrang, sqrange, sqcnt, maxsqcnt, TRUE);
        !           259: 
        !           260:        /* undo the setvar on the main tree and all subtrees */
        !           261:        clearvar(root, var);
        !           262:        for (j = 0; j < MAXRANGE; j++)
        !           263:                clearvar(sqlist[j], var);
        !           264: 
        !           265:        /* return any used buffer space */
        !           266:        freebuf(sqbuf, sqmark);
        !           267: 
        !           268: #      ifdef xDTR1
        !           269:        if (tTf(32, 2))
        !           270:                printf("tc[%.12s]=%d,qtrue=%d\n", rangename(var), tc, qtrue);
        !           271: #      endif
        !           272: 
        !           273:        return (qtrue);
        !           274: }
        !           275: /*
        !           276: **     Decompz processes a one variable query
        !           277: **     by calling call_ovqp().
        !           278: **
        !           279: **     Trace Flags:
        !           280: **             33
        !           281: */
        !           282: 
        !           283: decompz(q, qmode, result_num)
        !           284: QTREE  *q;
        !           285: int    qmode;
        !           286: int    result_num;
        !           287: {
        !           288:        register QTREE  *root;
        !           289:        register int    qualfound;
        !           290: 
        !           291:        root = q;
        !           292:        if (root->sym.value.sym_root.tvarc)
        !           293:        {
        !           294:                if (De.de_sourcevar < 0)
        !           295:                {
        !           296:                        if ((De.de_sourcevar = selectv(root)) < 0) 
        !           297:                                return (FALSE);
        !           298:                }
        !           299:        }
        !           300:        else
        !           301:        {
        !           302:                De.de_sourcevar = -1;
        !           303:        }
        !           304: 
        !           305:        qualfound = call_ovqp(root, qmode, result_num);
        !           306:        De.de_newq = 0;
        !           307:        return (qualfound);
        !           308: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.