Annotation of 43BSD/ingres/source/ovqp/findsimps.c, revision 1.1.1.1

1.1       root        1: # include      <ingres.h>
                      2: # include      <symbol.h>
                      3: # include      <tree.h>
                      4: # include      "../decomp/globs.h"
                      5: # include      "strategy.h"
                      6: # include      <sccs.h>
                      7: 
                      8: SCCSID(@(#)findsimps.c 8.4     4/13/85)
                      9: 
                     10: /*
                     11: **     Findsimps searches the qualification for
                     12: **     occurances of simple clauses. In its
                     13: **     current crude implementation it only finds
                     14: **     cluases of the form:
                     15: **
                     16: **     var relop constant  or  constant relop var
                     17: **
                     18: **     it does not use simple clauses with 'OR's
                     19: **     nor does it accept clauses of the form
                     20: **
                     21: **     var relop constant + constant    etc.
                     22: **
                     23: **     Findsimps knows about pattern matching characters
                     24: **     and treats char constants containing pm chars
                     25: **     specially. For example
                     26: **             var >= "xx*"  --> var >= "xx"
                     27: **             var <= "xx*"  --> var <= "xx\0177"
                     28: **             var =  "xx*"  --> var >= "xx" and var <= "xx\0177"
                     29: **     If the first char is a pm char then the clause is not
                     30: **     considered as a simple clause. Also notice that the conversion
                     31: **     is done only once. If the next time De.ov_newq = FALSE, then findsimps()
                     32: **     isn't called. This works because a pm char can only come from
                     33: **     the user and not from a relation. Thus during tuple substition
                     34: **     a constant with a pm will never change.
                     35: */
                     36: 
                     37: findsimps()
                     38: {
                     39:        register struct symbol  *c;
                     40:        register int            t;
                     41:        int                     length;
                     42:        register struct symbol  **q;
                     43:        int                     attno, rel, found;
                     44:        struct symbol           *cpsym(), *xc;
                     45: 
                     46: #      ifdef xOTR1
                     47:        if (tTf(81, 0))
                     48:                printf("FINDSIMPS\n");
                     49: #      endif
                     50:        De.ov_nsimp = 0;
                     51:        found = FALSE;
                     52:        q = De.ov_qlist;        /* q holds pointer to qualification */
                     53: 
                     54:        if (!q)
                     55:                return (0);
                     56: 
                     57: 
                     58:        for (t = (*q)->type; t != QLEND; t = (*++q)->type)
                     59:        {
                     60:                switch (t)
                     61:                {
                     62:                  case VAR:
                     63:                        attno = (*q)->value.sym_var.attno;      /* save att number */
                     64:                        t = (*++q)->type;
                     65:                        if (t == INT || t == FLOAT || t == CHAR || t == S_VAR)
                     66:                        {
                     67:                                c = *q; /* save pointer to value symbol */
                     68:                                t = (*++q)->type;
                     69:                                if ((rel = relop(*q, FALSE)) >= 0 
                     70:                                   && (t = (*++q)->type) == AND)
                     71:                                {
                     72:                                        /* found a simple clause */
                     73:                                        found = TRUE;
                     74:                                }
                     75:                        }
                     76:                        break;
                     77: 
                     78:                  case S_VAR:
                     79:                  case INT:
                     80:                  case FLOAT:
                     81:                  case CHAR:
                     82:                        c = *q++;
                     83:                        if ((t = (*q)->type) == VAR)
                     84:                        {
                     85:                                attno = (*q)->value.sym_var.attno;
                     86:                                t = (*++q)->type;
                     87:                                if ((rel = relop(*q, TRUE)) >= 0 && (t = (*++q)->type) == AND)
                     88:                                {
                     89:                                        /* found a simple clause */
                     90:                                        found = TRUE;
                     91:                                }
                     92:                        }
                     93:                }
                     94:                if (found)
                     95:                {
                     96:                        /* a simple clause has been found.
                     97:                        ** Check that the constant contains
                     98:                        ** at least one char before any pattern
                     99:                        ** matching char. If there is a pattern
                    100:                        ** matching char then special processing
                    101:                        ** must be done.
                    102:                        */
                    103: 
                    104:                        found = FALSE;
                    105:                        if (length = check(c))
                    106:                        {
                    107: 
                    108:                                /*
                    109:                                ** If length is zero then the first char was
                    110:                                ** a pattern matching char. If length < 0 then
                    111:                                ** no pattern matching char, and finally
                    112:                                ** if length > 0 then length is the number of
                    113:                                ** chars before the first pattern matching char
                    114:                                */
                    115:                                if (length > 0)
                    116:                                {
                    117:                                        switch (rel)
                    118:                                        {
                    119: 
                    120:                                          case opEQ:
                    121:                                                /*
                    122:                                                ** Create two simple clauses:
                    123:                                                ** One below the value and the
                    124:                                                ** other above the value.
                    125:                                                */
                    126:                                                xc = cpsym(c, length, opLTLE);
                    127:                                                add_simp(xc, opLTLE, attno);
                    128:                                                rel = opGTGE;
                    129:                                                /* fall through to GTGE case */
                    130: 
                    131:                                          case opGTGE:
                    132:                                                c = cpsym(c, length, opGTGE);
                    133:                                                break;
                    134: 
                    135:                                          case opLTLE:
                    136:                                                c = cpsym(c, length, opLTLE);
                    137:                                                break;
                    138:                                        }
                    139:                                }
                    140: 
                    141:                                if (add_simp(c, rel, attno))
                    142:                                        break;  /* no more room in simps */
                    143:                        }
                    144:                }
                    145:                while (t != AND)        /* skip to next AND */
                    146:                        t = (*++q)->type & I1MASK;
                    147:        }
                    148: #      ifdef xOTR1
                    149:        if (tTf(81, 2))
                    150:                printf("findsimps returning %d\n", De.ov_nsimp);
                    151: #      endif
                    152:        return (De.ov_nsimp);
                    153: }
                    154: 
                    155: 
                    156: /*
                    157: **     relop determines whether a symbol is a
                    158: **     usable relational operator ie. =,>,>=,<,<=
                    159: **
                    160: **     returns the type of the relational
                    161: **     operator if found, else it returns
                    162: **     -1
                    163: **
                    164: **     Items are normalized to be in the form:
                    165: **     var relop constant. If reverse is TRUE then
                    166: **     complement the sense of the relop. Reverse will
                    167: **     be TRUE is the simple clause was found in the
                    168: **     form constant relop var.
                    169: */
                    170: relop(s, reverse)
                    171: struct symbol  *s;
                    172: int            reverse;
                    173: {
                    174:        register int    v;
                    175: 
                    176:        v = -1; /* assume failure */
                    177:        if (s->type == BOP)
                    178:        {
                    179:                switch (s->value.sym_op.opno)
                    180:                {
                    181: 
                    182:                  case opEQ:
                    183:                        v = opEQ;
                    184:                        break;
                    185: 
                    186:                  case opLT:
                    187:                  case opLE:
                    188:                        v = opLTLE;
                    189:                        if (reverse)
                    190:                                v = opGTGE;
                    191:                        break;
                    192: 
                    193:                  case opGT:
                    194:                  case opGE:
                    195:                        v = opGTGE;
                    196:                        if (reverse)
                    197:                                v = opLTLE;
                    198:                        break;
                    199: 
                    200:                }
                    201:        }
                    202:        return (v);
                    203: }
                    204: 
                    205: 
                    206: 
                    207: /*
                    208: **     check checks the symbol for
                    209: **     pattern matching characters.
                    210: **     If any are found then check returns
                    211: **     the number of characters before the
                    212: **     first pattern matching character.
                    213: **
                    214: **     If no pattern matching chars are found
                    215: **     then check returns -1.
                    216: **
                    217: **     note that PAT_RBRAC need not be checked for
                    218: **     since it is not a pattern matching char unless
                    219: **     PAT_LBRAC appears before it.
                    220: **
                    221: **     PAT_LBRAC is treated specially in cpsym().
                    222: **     If any are detected, then length until the
                    223: **     first PAT_ANY or PAT_ONE or PAT_SPEC is returned.
                    224: */
                    225: check(sym)
                    226: struct symbol  *sym;
                    227: {
                    228:        register struct symbol  *s;
                    229:        register char           *cp;
                    230:        register int            len;
                    231:        int                     flag;
                    232: 
                    233:        s = sym;
                    234: #      ifdef xOTR1
                    235:        if (tTf(81, 4))
                    236:        {
                    237:                printf("Checksym:");
                    238:                prsym(s);
                    239:        }
                    240: #      endif
                    241:        if (s->type == CHAR)
                    242:        {
                    243:                flag = FALSE;
                    244:                cp = s->value.sym_data.c0type;  /* the string is a literal */
                    245:                len = s->len & I1MASK;
                    246:                while (len--)
                    247:                {
                    248:                        switch(*cp++)
                    249:                        {
                    250: 
                    251:                          case PAT_ANY:
                    252:                          case PAT_ONE:
                    253:                          case PAT_SPEC:
                    254:                                return ((s->len & I1MASK) - len - 1);
                    255: 
                    256:                          case PAT_LBRAC:
                    257:                                flag = TRUE;
                    258: 
                    259:                        }
                    260:                }
                    261:                if (flag)
                    262:                        return (s->len & I1MASK);       /* constant had PAT_LBRAC char */
                    263:        }
                    264:        return (-1);    /* ok */
                    265: }
                    266: 
                    267: 
                    268: /*
                    269: ** Cpsym -- copy a symbol to a new buffer area.
                    270: **     If op is opLTLE then add a pad character
                    271: **     whose value is the largest possible char
                    272: **     value.
                    273: **
                    274: **     If any ranges of characters are found,
                    275: **     then the lowest/highest char is taken from
                    276: **     range.
                    277: */
                    278: 
                    279: struct symbol 
                    280: *cpsym(const, len, op)
                    281: struct symbol  *const;
                    282: int            len;
                    283: int            op;
                    284: {
                    285:        register struct symbol  *s;
                    286:        register char           *cp;
                    287:        register int            i;
                    288:        char                    *sp, c, nc;
                    289:        extern char             *ov_ovqpbuf;
                    290:        char                    *need();
                    291: 
                    292:        i = len;
                    293:        s = (struct symbol *)
                    294:                need(De.ov_ovqpbuf, op == opLTLE ? i + SYMOFF+1 : i + SYMOFF);
                    295:        s->type = CHAR;
                    296:        sp = s->value.sym_data.c0type;
                    297:        cp = const->value.sym_data.c0type;
                    298: 
                    299:        while (i--)
                    300:        {
                    301:                /* copy chars processing LBRAC chars if any */
                    302:                if ((c = *cp++) == PAT_LBRAC)
                    303:                {
                    304:                        /* if string is empty, ignore it */
                    305:                        if (i == 0)
                    306:                                break;
                    307: 
                    308:                        c = *cp++;
                    309:                        i--;
                    310: 
                    311:                        if (c == PAT_RBRAC)
                    312:                                continue;       /* empty [] */
                    313: 
                    314:                        while (i-- && ((nc = *cp++) != PAT_RBRAC))
                    315:                        {
                    316:                                /* ignore '-' */
                    317:                                if (nc == '-')
                    318:                                        continue;
                    319: 
                    320:                                /* check for char larger/smaller than 'c' */
                    321:                                if (op == opLTLE)
                    322:                                {
                    323:                                        if (nc > c)
                    324:                                                c = nc;
                    325:                                }
                    326:                                else
                    327:                                {
                    328:                                        if (nc < c)
                    329:                                                c = nc;
                    330:                                }
                    331:                        }
                    332:                }
                    333: 
                    334:                *sp++ = c;      /* copy next char */
                    335:        }
                    336:        if (op == opLTLE)
                    337:                *sp++ = 0177;
                    338:        s->len = sp - s->value.sym_data.c0type;
                    339: 
                    340:        return (s);
                    341: }
                    342: 
                    343: 
                    344: 
                    345: /*
                    346: ** Add_simp -- add a simple clause to the list of
                    347: **     simple clauses. As a side effect the De.ov_nsimp
                    348: **     is incremented. If there is no room return
                    349: **     TRUE else return FALSE
                    350: */
                    351: 
                    352: add_simp(const, rel, attno)
                    353: struct symbol  *const;
                    354: int            rel;
                    355: int            attno;
                    356: {
                    357:        register struct simp    *s;
                    358: 
                    359:        if (De.ov_nsimp == NSIMP)
                    360:                return (TRUE);  /* no more room */
                    361: 
                    362:        s = &De.ov_simp[De.ov_nsimp++];
                    363: 
                    364:        s->att = attno;
                    365:        s->const = const;
                    366:        s->relop = rel;
                    367: 
                    368: #      ifdef xOTR1
                    369:        if (tTf(81, 3))
                    370:                prsimp(s);
                    371: #      endif
                    372: 
                    373:        return (FALSE);
                    374: }
                    375: 
                    376: 
                    377: prsimp(ss)
                    378: struct simp    *ss;
                    379: {
                    380: #      ifdef xOTR1
                    381:        struct simp     *s;
                    382: 
                    383:        s = ss;
                    384:        printf("simp:relop=%d,att=%d,val=", s->relop, s->att);
                    385:        prsym(s->const);
                    386: #      endif
                    387: }

unix.superglobalmegacorp.com

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