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: }