Annotation of 43BSD/ingres/source/decomp/exec_sq.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      <pv.h>
        !             6: # include      "globs.h"
        !             7: # include      <sccs.h>
        !             8: 
        !             9: SCCSID(@(#)exec_sq.c   8.1     12/31/84)
        !            10: 
        !            11: /*
        !            12: ** DECOMP2 -- Routines for executing detached sub-queries appearing
        !            13: **     in sqlist. These routines include:
        !            14: **
        !            15: **     exec_sq -- execute sub-queries and update range table.
        !            16: **
        !            17: **     undo_sq -- restore range table and destroy temp rels.
        !            18: **
        !            19: **     reset_sq - restore range table and reset temp rels.
        !            20: **
        !            21: **     execsq1 -- call ovqp with subquery.
        !            22: */
        !            23: /*
        !            24: **  EXEC_SQ
        !            25: **
        !            26: **     Execute the subqueries in sqlist. Associated with
        !            27: **     each sub-query is a relation number stored in sqrange.
        !            28: **     If the sub-query has a non-null target list, the range
        !            29: **     table is updated to reflect the new range of the relation.
        !            30: **
        !            31: **     If any sub-query is false, all subsequent ones are ignored
        !            32: **     by ovqp and exec_sq returns the var number of the false subquery.
        !            33: **
        !            34: **     As a side effect, "disj" is incremented for each disjoint sub-query
        !            35: **
        !            36: **     Trace Flags:
        !            37: **             35
        !            38: */
        !            39: 
        !            40: exec_sq(sqlist, sqrange, disj)
        !            41: QTREE  *sqlist[];
        !            42: int    sqrange[];
        !            43: int    *disj;
        !            44: {
        !            45:        register QTREE  *sq;
        !            46:        register int    i, qualfound;
        !            47:        extern DESC     *openr1();
        !            48: 
        !            49: #      ifdef xDTR1
        !            50:        if (tTf(35, 0))
        !            51:                printf("EXEC_SQ--\n");
        !            52: #      endif
        !            53: 
        !            54:        *disj = 0;
        !            55: 
        !            56:        for (i = 0; i < MAXRANGE; i++)
        !            57:        {
        !            58:                if (sq = sqlist[i])
        !            59:                {
        !            60: #                      ifdef xDTR1
        !            61:                        if (tTf(35, 1))
        !            62:                                printf("sq[%d]=%x\n", i, sq);
        !            63: #                      endif
        !            64:                        qualfound = execsq1(sq, i, sqrange[i]);
        !            65: 
        !            66: #                      ifdef xDTR1
        !            67:                        if (tTf(35, 2))
        !            68:                                printf("qualfound=%d\n", qualfound);
        !            69: #                      endif
        !            70:                        if (!qualfound)
        !            71:                        {
        !            72:                                return(i);
        !            73:                        }
        !            74:                        if (sq->left->sym.type != TREE)
        !            75:                        {
        !            76:                                /*
        !            77:                                ** Update the range table and open
        !            78:                                ** the relation's restricted replacement.
        !            79:                                */
        !            80:                                new_range(i, sqrange[i]);
        !            81:                                openr1(i);
        !            82:                        }
        !            83:                        else
        !            84:                        {
        !            85:                                (*disj)++;
        !            86:                        }
        !            87:                }
        !            88:        }
        !            89:        return (-1);
        !            90: }
        !            91: /*
        !            92: **  UNDO_SQ
        !            93: **
        !            94: **     Undo the effects of one variable detachment on
        !            95: **     the range table. The two parameters "limit" and
        !            96: **     "maxlimit" describe how far down the list of
        !            97: **     subqueries were processed.  Maxlimit represents
        !            98: **     the furthest every attained and limit represents
        !            99: **     the last variable processed the last time.
        !           100: **
        !           101: **     Trace Flags:
        !           102: **             36
        !           103: */
        !           104: 
        !           105: undo_sq(sqlist, locrang, sqrange, limit, maxlimit, reopen)
        !           106: QTREE  *sqlist[];
        !           107: int    locrang[];
        !           108: int    sqrange[];
        !           109: int    limit;
        !           110: int    maxlimit;
        !           111: int    reopen;
        !           112: {
        !           113:        register QTREE  *sq;
        !           114:        register int    i, lim;
        !           115:        bool            dstr_flag;
        !           116: 
        !           117: #      ifdef xDTR1
        !           118:        if (tTf(36, 0))
        !           119:                printf("UNDO_SQ--\n");
        !           120: #      endif
        !           121: 
        !           122:        initp();        /* setup parm vector for destroys */
        !           123:        lim = limit == -1 ? MAXRANGE : limit;
        !           124:        if (maxlimit == -1)
        !           125:                maxlimit = MAXRANGE;
        !           126: 
        !           127:        for (i = 0; i < MAXRANGE; i++)
        !           128:                if (sq = sqlist[i])
        !           129:                {
        !           130:                        if (sq->left->sym.type != TREE)
        !           131:                        {
        !           132:                                if (i < lim)
        !           133:                                {
        !           134:                                        /* The query was run. Close the temp rel */
        !           135:                                        closer1(i);
        !           136:                                }
        !           137: 
        !           138:                                /* mark the temporary to be destroyed */
        !           139:                                dstr_mark(sqrange[i]);
        !           140:                                dstr_flag = TRUE;
        !           141: 
        !           142:                                /* reopen the original relation. If maxlimit
        !           143:                                ** never reached the variable "i" then the
        !           144:                                ** original relation was never closed and thus
        !           145:                                ** doesn't need to be reopened.
        !           146:                                */
        !           147:                                rstrang(locrang, i);
        !           148:                                if (reopen && i < maxlimit)
        !           149:                                        openr1(i);
        !           150:                        }
        !           151:                }
        !           152:        /* Only call destroy if there's something to destroy */
        !           153:        if (dstr_flag)
        !           154:                call_dbu(mdDESTROY, FALSE);
        !           155:        else
        !           156:                resetp();
        !           157: 
        !           158: }
        !           159: /*
        !           160: ** Execsq1 -- call ovqp with mdRETR on temp relation
        !           161: */
        !           162: 
        !           163: execsq1(sq, var, relnum)
        !           164: QTREE  *sq;
        !           165: int    var;
        !           166: int    relnum;
        !           167: {
        !           168:        register int    qualfound;
        !           169: 
        !           170:        De.de_sourcevar = var;
        !           171:        De.de_newq = 1;
        !           172:        qualfound = call_ovqp(sq, mdRETR, relnum);
        !           173:        return (qualfound);
        !           174: }
        !           175: /*
        !           176: **     Reset each relation until limit.
        !           177: **     Reset will remove all tuples from the
        !           178: **     relation but not destroy the relation.
        !           179: **     The descriptor for the relation will be removed
        !           180: **     from the cache.
        !           181: **
        !           182: **     The original relation is returned to
        !           183: **     the range table.
        !           184: **
        !           185: **     If limit is -1 then all relations are done.
        !           186: */
        !           187: 
        !           188: reset_sq(sqlist, locrang, limit)
        !           189: QTREE  *sqlist[];
        !           190: int    locrang[];
        !           191: int    limit;
        !           192: {
        !           193:        register QTREE  *sq;
        !           194:        register int    i, lim;
        !           195:        int             old, reset;
        !           196:        extern char     *rnum_convert();
        !           197: 
        !           198:        lim = limit == -1 ? MAXRANGE : limit;
        !           199:        reset = FALSE;
        !           200:        initp();
        !           201: 
        !           202:        for (i = 0; i < lim; i++)
        !           203:                if ((sq = sqlist[i]) && sq->left->sym.type != TREE)
        !           204:                {
        !           205:                        old = new_range(i, locrang[i]);
        !           206:                        setp(PV_STR, rnum_convert(old));
        !           207:                        specclose(old);
        !           208:                        reset = TRUE;
        !           209:                }
        !           210: 
        !           211:        if (reset)
        !           212:        {
        !           213:                /*
        !           214:                ** Guarantee that OVQP will not reuse old
        !           215:                ** page of relation being reset
        !           216:                */
        !           217:                De.de_newr = TRUE;
        !           218:                call_dbu(mdRESETREL, FALSE);
        !           219:        }
        !           220:        else
        !           221:                resetp();
        !           222: }

unix.superglobalmegacorp.com

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