Annotation of 42BSD/ingres/source/decomp/pull_const.c, revision 1.1.1.1

1.1       root        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        7.1     2/5/81)
                      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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.