1: # include <ingres.h> 2: # include <symbol.h> 3: # include <aux.h> 4: # include <tree.h> 5: # include "globs.h" 6: # include <sccs.h> 7: 8: SCCSID(@(#)pull_const.c 8.1 12/31/84) 9: 10: /* 11: ** PULL_CONST - Detach and execute all constant clauses in the qualification. 12: ** 13: ** Pull_const examines the root tree for any constant clauses. 14: ** If none are present then it returns TRUE. If there are any 15: ** constant clauses, then they are removed, executed and if 16: ** TRUE then pull_const returns TRUE and other wise it returns 17: ** FALSE. 18: ** 19: ** This routine is not necessary to decomposition but rather 20: ** can be called as an optimization when constant clauses are 21: ** expected. Note that without this routine, constant clauses 22: ** would only be examined at the bottom level of decomposition. 23: ** Thus a multivar query which was true except for a constant clause 24: ** would look at the required cross-product space before returning. 25: */ 26: 27: pull_const(root, buf) 28: QTREE *root; 29: char *buf; 30: { 31: register QTREE *r, *q, *s; 32: QTREE *makroot(); 33: 34: s = (QTREE *) NULL; 35: 36: for (r = root; r->right->sym.type != QLEND; ) 37: { 38: q = r; 39: r = r->right; /* r is now the AND node */ 40: 41: if (r->sym.value.sym_root.lvarc == 0) 42: { 43: /* we have a constant clause */ 44: if (s == 0) 45: s = makroot(buf); 46: 47: /* remove AND from root tree */ 48: q->right = r->right; 49: 50: /* put node into constant tree */ 51: r->right = s->right; 52: s->right = r; 53: 54: /* fix up var counts (just for good form!) */ 55: r->sym.value.sym_root.rvarm = r->sym.value.sym_root.tvarc = 0; 56: 57: r = q; 58: } 59: } 60: 61: if (s) 62: { 63: /* run the constant query */ 64: return (execsq1(s, -1, NORESULT)); 65: } 66: 67: return (TRUE); 68: }