Annotation of 43BSD/ingres/source/decomp/tempvar.c, revision 1.1.1.1

1.1       root        1: # include      <ingres.h>
                      2: # include      <tree.h>
                      3: # include      <symbol.h>
                      4: # include      <sccs.h>
                      5: 
                      6: SCCSID(@(#)tempvar.c   8.1     12/31/84)
                      7: 
                      8: 
                      9: /*
                     10: ** TEMPVAR
                     11: **
                     12: **     This file contains routines associated with redefining
                     13: **     attribute numbers. This is needed when one variable sub queries
                     14: **     or reduction change the positions of attributes in a relation.
                     15: **     This file includes:
                     16: **
                     17: **     Tempvar -- Change the attribute numbers to new ones.
                     18: **
                     19: **     Origvar -- Restore attribute numbers back to their previous values.
                     20: **
                     21: **     Ckvar   -- Return the currently active VAR node
                     22: **
                     23: **     Trace Flags:
                     24: **             51
                     25: */
                     26: /*
                     27: ** Tempvar -- Replace a VAR attribute number with its new number.
                     28: **
                     29: **     Tempvar is given a list of subqueries which will potentially
                     30: **     alter the attribute numbers of VARs they reference. An attno
                     31: **     is changed by making the current VAR point to a new VAR node
                     32: **     which has the updated attno.
                     33: **
                     34: **     The new attno is determined from the target list of the subquery
                     35: **     for that VAR. The RESDOM number is the new attno and the VAR it
                     36: **     points to is the old attno. For example:
                     37: **             RESDOM/2 -> right = VAR 1/3
                     38: **     The right subtree of result domain 2 is domain 3 of variable 1.
                     39: **     Thus domain 3 should be renumbered to be domain 2.
                     40: */
                     41: 
                     42: tempvar(node, sqlist, buf)
                     43: register QTREE *node;
                     44: QTREE          *sqlist[];
                     45: char           *buf;
                     46: {
                     47:        register QTREE  *v, *sq;
                     48:        QTREE           *ckvar();
                     49:        extern char     *need(), *rangename();
                     50: 
                     51: 
                     52:        if (node == NULL)
                     53:                return;
                     54: 
                     55:        if (node->sym.type == VAR )
                     56:        {
                     57:                node = ckvar(node);
                     58:                if (sq = sqlist[node->sym.value.sym_var.varno])
                     59:                {
                     60:                        /* This var has a subquery on it */
                     61: 
                     62:                        /* allocate a new VAR node */
                     63:                        if (buf)
                     64:                        {
                     65:                                node->sym.value.sym_var.valptr = (ANYTYPE *) need(buf, QT_HDR_SIZ + sizeof(struct varnode));
                     66:                                v = (QTREE *) node->sym.value.sym_var.valptr;
                     67:                                bmove(&node->sym, &v->sym, SYM_HDR_SIZ + sizeof(struct varnode) - sizeof v);
                     68:                                v->left = v->right = NULL;
                     69:                                v->sym.value.sym_var.valptr = NULL;
                     70:                                node->sym.value.sym_var.varno = -1;
                     71:                        }
                     72:                        else
                     73:                                v = node;
                     74: 
                     75:                        /* search for the new attno */
                     76:                        for (sq = sq->left; sq->sym.type != TREE; sq = sq->left)
                     77:                        {
                     78:                                if (ckvar(sq->right)->sym.value.sym_var.attno == node->sym.value.sym_var.attno) 
                     79:                                {
                     80:        
                     81:                                        v->sym.value.sym_var.attno = sq->sym.value.sym_resdom.resno;
                     82: #                                      ifdef xDTR1
                     83:                                        if (tTf(51, 3))
                     84:                                        {
                     85:                                                printf("Tempvar:");
                     86:                                                nodepr(node);
                     87:                                        }
                     88: #                                      endif
                     89: 
                     90:                                        return;
                     91:                                }
                     92:                        }
                     93:                        syserr("tempvar:dom %d of %s missing", node->sym.value.sym_var.attno, rangename(node->sym.value.sym_var.varno));
                     94:                }
                     95:                return;
                     96:        }
                     97: 
                     98:        tempvar(node->left, sqlist, buf);
                     99:        tempvar(node->right, sqlist, buf);
                    100: }
                    101: /*
                    102: ** Origvar -- Restore VAR node to previous state.
                    103: **
                    104: **     Origvar undoes the effect of tempvar. All vars listed
                    105: **     in the sqlist will have their most recent tempvar removed.
                    106: */
                    107: 
                    108: origvar(t, sqlist)
                    109: register QTREE *t;
                    110: QTREE          *sqlist[];
                    111: {
                    112:        register char   v;
                    113:        register QTREE  *q;
                    114: 
                    115:        if (t == NULL)
                    116:                return;
                    117:        if (t->sym.type == VAR && t->sym.value.sym_var.varno < 0)
                    118:        {
                    119:                while ((v = (q = (QTREE *) (t->sym.value.sym_var.valptr))->sym.value.sym_var.varno) < 0)
                    120:                        t = q;
                    121: 
                    122:                if (sqlist[v])
                    123:                {
                    124:                        t->sym.value.sym_var.varno = v;
                    125:                        t->sym.value.sym_var.valptr = NULL;
                    126:                }
                    127:                return;
                    128:        }
                    129:        origvar(t->left, sqlist);
                    130:        origvar(t->right, sqlist);
                    131: }
                    132: /*
                    133: ** Ckvar -- Return pointer to currently "active" VAR.
                    134: **
                    135: **     This routine guarantees that "t" will point to
                    136: **     the most current definition of the VAR.
                    137: */
                    138: 
                    139: QTREE *
                    140: ckvar(t)
                    141: register QTREE *t;
                    142: {
                    143:        if (t->sym.type != VAR)
                    144:        {
                    145:                syserr("ckvar: not a VAR %d", t->sym.type);
                    146:        }
                    147: #      ifdef xDTR1
                    148:        if (tTf(51, 2))
                    149:        {
                    150:                printf("ckvar: var %d.%d, type ",
                    151:                        t->sym.value.sym_var.varno, t->sym.value.sym_var.attno);
                    152:                xputchar(t->sym.value.sym_var.varfrmt);
                    153:                printf("%3d\n", t->sym.value.sym_var.varfrml);
                    154:        }
                    155: #      endif
                    156:        while (t != NULL && t->sym.value.sym_var.varno < 0)
                    157:                t = (QTREE *) t->sym.value.sym_var.valptr;
                    158: 
                    159:        if (t == NULL)
                    160:                syserr("ckvar null valptr");
                    161:        return (t);
                    162: }

unix.superglobalmegacorp.com

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