Annotation of 42BSD/ingres/source/decomp/pull_sq.c, revision 1.1.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(@(#)pull_sq.c   7.1     2/5/81)
                      9: 
                     10: /*
                     11: ** DECOMP1.C
                     12: **
                     13: **     contains routines associated with setting up 
                     14: **     detachable 1-variable sub-queries.
                     15: **     ptrs to these sq's are kept in the 
                     16: **     array 'sqlist' declared in the main decomp routine.
                     17: **
                     18: **     Trace Flags:
                     19: **             34
                     20: */
                     21: 
                     22: 
                     23: pull_sq(tree1, sqlist, locrang, sqrange, buf)
                     24: QTREE  *tree1;
                     25: QTREE  *sqlist[];
                     26: int    locrang[];
                     27: int    sqrange[];
                     28: char   *buf;
                     29: {
                     30:        register QTREE  *q, *tree, *r;
                     31:        QTREE           *s;
                     32:        int             anysq, j, badvar;
                     33:        extern QTREE    *makroot();
                     34: 
                     35:        tree = tree1;
                     36: 
                     37: #      ifdef xDTR1
                     38:        if (tTf(34, 0))
                     39:                printf("PULL_SQ:tree=%x\n", tree);
                     40: #      endif
                     41: 
                     42:        anysq = 0;
                     43:        for (j = 0; j < MAXRANGE; j++)
                     44:                sqlist[j] = 0;
                     45: 
                     46:        if (tree->sym.value.sym_root.tvarc == 1)
                     47:                return;
                     48: 
                     49:        /* detach all one variable clauses except:
                     50:        ** if the target list is one variable and
                     51:        ** that variable is disjoint from the other
                     52:        ** variables, then don't pull it.
                     53:        **
                     54:        ** It will be more efficient to process it
                     55:        ** all at once in decompy
                     56:        */
                     57: 
                     58:        badvar = 0;
                     59:        if (tree->sym.value.sym_root.lvarc == 1)
                     60:        {
                     61:                badvar = tree->sym.value.sym_root.lvarm;        /* get bit position of var */
                     62: 
                     63:                /* look for a two variable clause involving badvar */
                     64:                for (r = tree->right; r->sym.type != QLEND; r = r->right)
                     65:                {
                     66:                        if (r->sym.value.sym_root.lvarc > 1 && (r->sym.value.sym_root.lvarm & badvar))
                     67:                        {
                     68:                                badvar = 0;
                     69:                                break;
                     70:                        }
                     71:                }
                     72:        }
                     73: #      ifdef xDTR1
                     74:        if (tTf(34, 2))
                     75:                printf("Detachable clauses: (badvar=%o)\n", badvar);
                     76: #      endif
                     77:        for (r=tree; r->right->sym.type!=QLEND; )
                     78:        {
                     79: #              ifdef xDTR1
                     80:                if (tTf(34, 3))
                     81:                        nodepr(r);
                     82: #              endif
                     83:                q = r;
                     84:                r = r->right;
                     85:                if (r->sym.value.sym_root.lvarc == 1)
                     86:                {
                     87:                        j = bitpos(r->sym.value.sym_root.lvarm);
                     88: #                      ifdef xDTR1
                     89:                        if (tTf(34, 4))
                     90:                        {
                     91:                                printf("\nvar=%d, clause\n", j);
                     92:                                treepr(r->left);
                     93:                        }
                     94: #                      endif
                     95:                        if (r->sym.value.sym_root.lvarm == badvar)
                     96:                        {
                     97: #                              ifdef xDTR1
                     98:                                if (tTf(34, 5))
                     99:                                        printf("not detaching \n");
                    100: #                              endif
                    101:                                continue;
                    102:                        }
                    103:                        anysq++;
                    104: 
                    105:                        if (!sqlist[j])         /* MAKE ROOT NODE FOR SUBQUERY */
                    106:                                sqlist[j] = makroot(buf);
                    107:                        s = sqlist[j];
                    108: 
                    109:                        /* MODIFY MAIN QUERY */
                    110: 
                    111:                        q->right = r->right;
                    112: 
                    113:                        /* MODIFY `AND` NODE OF DETACHED CLAUSE */
                    114: 
                    115:                        r->right = s->right;
                    116:                        r->sym.value.sym_root.rvarm = s->sym.value.sym_root.rvarm;
                    117:                        r->sym.value.sym_root.tvarc = 1;
                    118: 
                    119:                        /* ADD CLAUSE TO SUB-QUERY */
                    120: 
                    121:                        s->right = r;
                    122:                        s->sym.value.sym_root.rvarm = r->sym.value.sym_root.lvarm;
                    123:                        s->sym.value.sym_root.tvarc = 1;
                    124: 
                    125: #                      ifdef xDTR1
                    126:                        if (tTf(34, 6))
                    127:                        {
                    128:                                printf("SQ\n");
                    129:                                treepr(s);
                    130:                        }
                    131: #                      endif
                    132: 
                    133:                        r = q;
                    134:                }
                    135:        }
                    136: 
                    137:        /* NOW SET UP TARGET LIST FOR EACH SUBQUERY IN SQLIST */
                    138: 
                    139: #      ifdef xDTR1
                    140:        if (tTf(34, 7))
                    141:                printf("# sq clauses=%d\n", anysq);
                    142: #      endif
                    143:        if (anysq)
                    144:        {
                    145: #              ifdef xDTR1
                    146:                if (tTf(34, 8))
                    147:                        printf("Dfind--\n");
                    148: #              endif
                    149:                dfind(tree, buf, sqlist);
                    150:                mapvar(tree, 1);
                    151: 
                    152:                /* create the result relations */
                    153:                for (j = 0; j < MAXRANGE; j++)
                    154:                {
                    155:                        if (q = sqlist[j])
                    156:                        {
                    157:                                if (q->left->sym.type != TREE)
                    158:                                {
                    159:                                        savrang(locrang, j);
                    160:                                        sqrange[j] = mak_t_rel(q, "d", -1);
                    161:                                }
                    162:                                else
                    163:                                        sqrange[j] = NORESULT;
                    164:                        }
                    165:                }
                    166:        }
                    167: }
                    168: /*
                    169: **  DFIND
                    170: */
                    171: dfind(tree, buf, sqlist)
                    172: register QTREE *tree;
                    173: char           *buf;
                    174: QTREE          *sqlist[];
                    175: {
                    176:        register char   varno;
                    177:        register QTREE  *sq;
                    178:        extern QTREE    *ckvar();
                    179: 
                    180:        if (tree == NULL) 
                    181:                return;
                    182: #      ifdef xDTR1
                    183:        if (tTf(34, 9))
                    184:                nodepr(tree);
                    185: #      endif
                    186:        if (tree->sym.type == VAR)
                    187:        {
                    188:                tree = ckvar(tree);
                    189:                varno = tree->sym.value.sym_var.varno;
                    190:                if (sq = sqlist[varno])
                    191:                        maktl(tree, buf, sq, varno);
                    192:                return;
                    193:        }
                    194: 
                    195:        /* IF CURRENT NODE NOT A `VAR` WITH SQ, RECURSE THRU REST OF TREE */
                    196: 
                    197:        dfind(tree->left, buf, sqlist);
                    198:        dfind(tree->right, buf, sqlist);
                    199:        return;
                    200: }
                    201: /*
                    202: **  MAKTL
                    203: */
                    204: 
                    205: maktl(node, buf, sq1, varno)
                    206: QTREE  *node;
                    207: char   *buf;
                    208: QTREE  *sq1;
                    209: int    varno;
                    210: {
                    211:        register QTREE  *resdom, *tree, *sq;
                    212:        int             domno, map;
                    213:        extern QTREE    *makresdom();
                    214:        extern QTREE    *copytree();
                    215: 
                    216:        sq = sq1;
                    217:        domno = node->sym.value.sym_var.attno;
                    218: 
                    219: #      ifdef xDTR1
                    220:        if (tTf(34, 12))
                    221:                printf("\tVar=%d,Dom=%d ", varno, domno);
                    222: #      endif
                    223:        /* CHECK IF NODE ALREADY CREATED FOR THIS DOMAIN */
                    224: 
                    225:        for (tree = sq->left; tree->sym.type != TREE; tree = tree->left)
                    226:                if (tree->right->sym.value.sym_var.attno == domno)
                    227:                {
                    228: #                      ifdef xDTR1
                    229:                        if (tTf(34, 13))
                    230:                                printf("Domain found\n");
                    231: #                      endif
                    232:                        return;
                    233:                }
                    234: 
                    235:        /* create a new resdom for domain */
                    236: 
                    237:        resdom = makresdom(buf, node);
                    238:        resdom->sym.value.sym_resdom.resno = sq->left->sym.type == TREE? 1:
                    239:                                        sq->left->sym.value.sym_resdom.resno + 1;
                    240:        /* resdom->right is a copy of the var node in order to
                    241:        ** protect against tempvar() changing the var node.
                    242:        */
                    243:        resdom->left = sq->left;
                    244:        resdom->right = copytree(node, buf);
                    245: 
                    246: 
                    247:        /* update ROOT node if necessary */
                    248: 
                    249:        sq->left = resdom;
                    250:        map = 1 << varno;
                    251:        if (!(sq->sym.value.sym_root.lvarm & map))
                    252:        {
                    253:                /* var not currently in tl */
                    254:                sq->sym.value.sym_root.lvarm |= map;
                    255:                sq->sym.value.sym_root.lvarc++;
                    256: 
                    257:                /* if var is not in qualification then update total count */
                    258:                if (!(sq->sym.value.sym_root.rvarm & map))
                    259:                        sq->sym.value.sym_root.tvarc++;
                    260: #              ifdef xDTR1
                    261:                if (tTf(34, 15))
                    262:                {
                    263:                        printf("new root ");
                    264:                        nodepr(sq);
                    265:                }
                    266: #              endif
                    267:        }
                    268: 
                    269: #      ifdef xDTR1
                    270:        if (tTf(34, 14))
                    271:        {
                    272:                printf("new dom ");
                    273:                nodepr(resdom);
                    274:        }
                    275: #      endif
                    276:        return;
                    277: }

unix.superglobalmegacorp.com

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