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