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	8.1	12/31/84)
   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: }

Defined functions

dfind defined in line 171; used 5 times
maktl defined in line 205; used 1 times
pull_sq defined in line 8; used 2 times
Last modified: 1986-04-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1240
Valid CSS Valid XHTML 1.0 Strict