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

unix.superglobalmegacorp.com

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