|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.