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

1.1       root        1: # include      <ingres.h>
                      2: # include      <aux.h>
                      3: # include      <symbol.h>
                      4: # include      <tree.h>
                      5: # include      <catalog.h>
                      6: # include      "../decomp/globs.h"
                      7: # include      "strategy.h"
                      8: # include      <btree.h>
                      9: # include      <sccs.h>
                     10: 
                     11: SCCSID(@(#)key.c       8.4     3/20/85)
                     12: 
                     13: 
                     14: 
                     15: /*
                     16: **     Exactkey checks to see if the relation described
                     17: **     by "ap" can be used in a hashed scan.
                     18: **     All the key domains of the relation must
                     19: **     have simple clauses of equality associated
                     20: **     with them in the qualification.
                     21: **
                     22: **     Returns 0 if the relation can't be used.
                     23: **
                     24: **     Returns > 0 if it can.
                     25: */
                     26: 
                     27: exactkey(ap, key)
                     28: struct accessparam     *ap;
                     29: struct key             *key;
                     30: {
                     31:        register struct accessparam     *a;
                     32:        register struct key             *k;
                     33:        register struct simp            *s;
                     34:        int                             d, i, j;
                     35: 
                     36: #      ifdef xOTR1
                     37:        if (tTf(85, -1))
                     38:                printf("Exactkey\n");
                     39: #      endif
                     40: 
                     41:        a = ap;
                     42:        k = key;
                     43:        i = 0;
                     44:        if (a->mode == EXACTKEY)
                     45:        {
                     46: 
                     47:                for (i = 0; d = a->keydno[i]; i++)
                     48:                {
                     49:        
                     50:                        s = De.ov_simp;
                     51:                        for (j = 0; j < De.ov_nsimp; j++)
                     52:                        {
                     53:                                if (s->relop == opEQ && s->att == d)
                     54:                                {
                     55:                                        k->keysym = s->const;
                     56:                                        k->dnumber = (a->sec_index == TRUE) ? i+1 : d;
                     57:                                        k++;
                     58: #                                      ifdef xOTR1
                     59:                                        if (tTf(85, 1))
                     60:                                        {
                     61:                                                printf("exact key on dom %d\tvalue=", d);
                     62:                                                prsym(s->const);
                     63:                                        }
                     64: #                                      endif
                     65:                                        break;
                     66:                                }
                     67:                                s++;
                     68:                        }
                     69:                        if (j == De.ov_nsimp)
                     70:                        {
                     71:                                i = 0;  /* failure. at lease one key isn't used */
                     72:                                break;
                     73:                        }
                     74:                }
                     75:                k->dnumber = 0; /* mark end of list */
                     76:        }
                     77: #      ifdef xOTR1
                     78:        if (tTf(85, 9))
                     79:                printf("exactkey returning %d\n", i);
                     80: #      endif
                     81:        return (i);
                     82: }
                     83: 
                     84: /*
                     85: **     Attempts to use the B-Tree for retrieval.
                     86: **     There are two types of searches possible, exact and range searches.
                     87: **     In order for an exact search to be possible, there must be a simple
                     88: **     equality clause using the lid field.
                     89: **     For a range search, either or both lid ranges must be provided.
                     90: **
                     91: **     Returns         1  exact BTREEKEY search possible
                     92: **                    -1  low lid key provided
                     93: **                    -2  high lid key provided
                     94: **                    -3  both lids provided
                     95: */
                     96: 
                     97: btreekey(lkey, hkey)
                     98: 
                     99: struct key *lkey, *hkey;
                    100: {
                    101:        register struct key     *l, *h;
                    102:        register struct simp    *s;
                    103:        int                     i, j, k;
                    104:        int                     provided[MAXLID];
                    105:        SYMBOL                  *(save[MAXLID]);
                    106: 
                    107: #      ifdef xOTR1
                    108:        if (tTf(85, -1))
                    109:                printf("Btreekey\n");
                    110: #      endif
                    111: 
                    112:        l = lkey;
                    113:        h = hkey;
                    114:        i = 0;
                    115:        for (j = 0; j < MAXLID; ++j)
                    116:                provided[j] = 0;
                    117:        if (De.ov_scanr->reldum.reldim > 0 && De.ov_scanr->reldum.reltups > 0)
                    118:        {
                    119:                s = De.ov_simp;
                    120:                for (j = 0; j < De.ov_nsimp; ++j)
                    121:                {
                    122:                        if (s->att >= De.ov_scanr->reldum.relatts - De.ov_scanr->reldum.reldim + 1)
                    123:                        {
                    124:                                if (s->relop == opEQ || s->relop == opGTGE)
                    125:                                {
                    126:                                        l->keysym = s->const;
                    127:                                        l->dnumber = s->att;
                    128:                                        if (s->relop == opEQ)
                    129:                                        {
                    130:                                                provided[De.ov_scanr->reldum.relatts - s->att] = 1;
                    131:                                                save[De.ov_scanr->reldum.relatts - s->att] = l->keysym;
                    132: 
                    133:                                        }
                    134:                                        else if (i == -2)
                    135:                                                i = -3;
                    136:                                        else if (!i)
                    137:                                                i = -1;
                    138:                                        ++l;
                    139:                                }
                    140:                                if (s->relop == opLTLE)
                    141:                                {
                    142:                                        h->keysym = s->const;
                    143:                                        h->dnumber = s->att;
                    144:                                        h++;
                    145:                                        if (i == -1)
                    146:                                                i = -3;
                    147:                                        else if (!i)
                    148:                                                i = -2;
                    149:                                }
                    150:                        }
                    151:                        s++;
                    152:                        for (k = 0; k < De.ov_scanr->reldum.reldim; ++k)
                    153:                                if (!provided[k])
                    154:                                        break;
                    155:                        if (k >= De.ov_scanr->reldum.reldim)
                    156:                        {
                    157:                                i = 1;
                    158:                                break;
                    159:                        }
                    160:                }
                    161:                if (i != 1)
                    162:                        for (k = 0; k < De.ov_scanr->reldum.reldim; ++k)
                    163:                                if (provided[k])
                    164:                                {
                    165:                                        h->keysym = save[k];
                    166:                                        h->dnumber = De.ov_scanr->reldum.relatts - k;
                    167:                                        h++;
                    168:                                        i = -3;
                    169:                                }
                    170:                /* mark ends of lists */
                    171:                l->dnumber = 0;
                    172:                h->dnumber = 0;
                    173:        }
                    174: #      ifdef xOTR1
                    175:        if (tTf(85, 9))
                    176:                printf("btreekey returning %d\n", i);
                    177: #      endif
                    178:        return(i);
                    179: }
                    180: /*
                    181: **     Range key checks if the relation described by
                    182: **     "ap" is ISAM and there are simple clauses
                    183: **     on the first key and any additional keys.
                    184: **
                    185: **     Rangekey accumulates both high and low keys,
                    186: **     which are not necessary the same. If it
                    187: **     every finds a high or a low key on the first
                    188: **     domain of the relation then success=TRUE.
                    189: **
                    190: **     Returns  1 if Rangekey ok
                    191: **              0 if Rangekey is not ok
                    192: **             -1 if Rangekey ok and all clauses are equality clauses
                    193: */
                    194: 
                    195: rangekey(ap, l, h)
                    196: struct accessparam     *ap;
                    197: struct key             *l;
                    198: struct key             *h;
                    199: {
                    200:        register struct key     *low, *high;
                    201:        register struct simp    *s;
                    202:        struct accessparam      *a;
                    203:        int                     sec_indx, d, i;
                    204:        int                     rel, success, ns, lowkey, allexact;
                    205: 
                    206: #      ifdef xOTR1
                    207:        if (tTf(85, 5))
                    208:                printf("Rangekey\n");
                    209: #      endif
                    210: 
                    211:        a = ap;
                    212:        sec_indx  = a->sec_index == TRUE;
                    213:        low = l;
                    214:        high = h;
                    215:        allexact = -1;  /* assume all clauses equality clauses */
                    216:        s = De.ov_simp;
                    217:        success = FALSE;
                    218:        if (a->mode == LRANGEKEY)
                    219:        {
                    220: 
                    221:                for (ns = 0; ns < De.ov_nsimp; ns++)
                    222:                {
                    223:                        rel = s->relop;
                    224:                        for (i = 0; d = a->keydno[i]; i++)
                    225:                        {
                    226:                                if (d == s->att)
                    227:                                {
                    228:                                        /* this is either a high range value or low range value */
                    229:                                        lowkey = (rel == opGTGE);
                    230:                                        if (lowkey || rel == opEQ)
                    231:                                        {
                    232:                                                /* low range key */
                    233: #                                              ifdef xOTR1
                    234:                                                if (tTf(85, 6))
                    235:                                                        printf("low key on dom %d\t", d);
                    236: #                                              endif
                    237:                                                low->keysym = s->const;
                    238:                                                low->dnumber = sec_indx ? i+1 : d;
                    239:                                                low++;
                    240:                                        }
                    241:                                        if (!lowkey || rel == opEQ)
                    242:                                        {
                    243:                                                /* high range key */
                    244: #                                              ifdef xOTR1
                    245:                                                if  (tTf(85, 6))
                    246:                                                        printf("high key on dom %d\t", d);
                    247: #                                              endif
                    248:                                                high->keysym = s->const;
                    249:                                                high->dnumber = sec_indx ? i+1 : d;
                    250:                                                high++;
                    251:                                        }
                    252: #                                      ifdef xOTR1
                    253:                                        if (tTf(85, 6))
                    254:                                                prsym(s->const);
                    255: #                                      endif
                    256:                                        if (i == 0)
                    257:                                                success = TRUE;
                    258:                                        if (rel != opEQ)
                    259:                                                allexact = 1;   /* at least one inequality */
                    260:                                        break;
                    261:                                }
                    262:                        }
                    263:                        s++;    /* try next simple clause */
                    264:                }
                    265:        }
                    266: 
                    267:        high->dnumber = 0;      /* mark end of list */
                    268:        low->dnumber = 0;       /* mask end of list */
                    269: 
                    270:        /* if success then return whether all clauses were equality */
                    271:        if (success)
                    272:                success = allexact;
                    273: 
                    274: #      ifdef xOTR1
                    275:        if (tTf(85, 5))
                    276:                printf("rangekey returning %d\n", success);
                    277: #      endif
                    278:        return (success);
                    279: }
                    280: /*
                    281: **     Setallkey takes a key struct, decodes it and
                    282: **     calls setkey with each value.
                    283: **
                    284: **     Called from strategy().
                    285: **
                    286: **     returns 0 if ok.
                    287: **     returns -1 in the special case of a deblanked hashkey
                    288: **     being bigger than the corresponding domain.
                    289: */
                    290: 
                    291: setallkey(relkey, keytuple)
                    292: struct key     *relkey;
                    293: char           *keytuple;
                    294: {
                    295:        register struct key     *k;
                    296:        register SYMBOL         *sk;
                    297:        register int            dnum;
                    298:        struct symbol           **s;
                    299:        char                    *p, temp[256];
                    300:        int                     l;
                    301: 
                    302:        clearkeys(De.ov_scanr);
                    303:        k = relkey;
                    304:        while (dnum = k->dnumber)
                    305:        {
                    306:                s = &k->keysym;
                    307:                sk = (SYMBOL *) De.ov_stack;
                    308:                getsymbol(sk, &s);      /* copy symbol to stack. caution:getsym changes the value of s. */
                    309:                rcvt(sk, De.ov_scanr->relfrmt[dnum], De.ov_scanr->relfrml[dnum]);       /* convert key to correct type */
                    310:                p = (char *)&sk->value;
                    311: 
                    312:                if (sk->type == CHAR)
                    313:                {
                    314:                        /*
                    315:                        ** The length of a character key must
                    316:                        ** be made equal to the domain length.
                    317:                        ** The key is copied to a temp place
                    318:                        ** and a null byte is inserted at the
                    319:                        ** end. In addition, if the key without
                    320:                        ** blanks is longer than the domain and
                    321:                        ** this is an exactkey, then the query
                    322:                        ** is false.
                    323:                        */
                    324:                        p = temp;
                    325:                        l = cmove(sk, p);       /* copy symbol to temp removing blanks & nulls */
                    326: #                      ifdef xOTR1
                    327:                        if (tTf(86, 9))
                    328:                                printf("length is %d\n", l);
                    329: #                      endif
                    330:                        if (De.ov_fmode == EXACTKEY && l > (De.ov_scanr->relfrml[dnum] & I1MASK))
                    331:                                /* key too large. qualification is false */
                    332:                                return (-1);
                    333:                }
                    334:                setkey(De.ov_scanr, keytuple, p, dnum); /* set the key */
                    335:                k++;
                    336:        }
                    337: #      ifdef xOTR1
                    338:        if (tTf(86, 8))
                    339:                printup(De.ov_scanr, keytuple);
                    340: #      endif
                    341:        return (0);
                    342: }
                    343: /*
                    344: **     Cmove copies a char symbol into "dest".
                    345: **     It stops when the length is reached or
                    346: **     when a null byte is found.
                    347: **
                    348: **     returns the number of non-blank chars
                    349: **     in the string.
                    350: */
                    351: 
                    352: cmove(sym, dest)
                    353: SYMBOL *sym;
                    354: char   *dest;
                    355: {
                    356:        register char   *d, *s;
                    357:        register int    l;
                    358:        int             blank;
                    359: 
                    360:        s = sym->value.sym_data.cptype; /* s points to the char string */
                    361:        d = dest;
                    362:        blank = 0;
                    363: 
                    364:        for (l = (sym->len & I1MASK); l--; s++)
                    365:        {
                    366:                *d++ = *s;
                    367:                if (*s == ' ')
                    368:                        blank++;
                    369:                if (*s == '\0')
                    370:                {
                    371:                        d--;
                    372:                        break;
                    373:                }
                    374:        }
                    375: 
                    376:        *d = '\0';
                    377:        return ((d - dest) - blank);    /* return length of string */
                    378: }
                    379: /*
                    380: **     Indexcheck is called by scan() to check whether
                    381: **     a secondary index tuple satisfies the simple
                    382: **     clauses under which it was scanned.
                    383: **
                    384: **     Returns 1 if the tuple is ok,
                    385: **             0 otherwise.
                    386: */
                    387: 
                    388: indexcheck()
                    389: {
                    390:        register int    i;
                    391: 
                    392:        if (De.ov_fmode == EXACTKEY)
                    393:                i = keycheck(De.ov_lkey_struct, De.ov_keyl, 0); /* check for equality */
                    394:        else
                    395:        {
                    396:                i = keycheck(De.ov_lkey_struct, De.ov_keyl, 1); /* check for >= */
                    397:                /* If the lowkey passed, check the highkey also */
                    398:                if (i)
                    399:                        i = keycheck(De.ov_hkey_struct, De.ov_keyh, -1);        /* check for <= */
                    400:        }
                    401: #      ifdef xOTR1
                    402:        if (tTf(86, 10))
                    403:                printf("indexcheck ret %d\n", i);
                    404: #      endif
                    405:        return (i);
                    406: }
                    407: /*
                    408: **     Keycheck compares De.ov_intup with keytuple
                    409: **     according to the domains specified in the
                    410: **     "keys" struct.
                    411: **
                    412: **     mode is either >0, =0, <0 depending on
                    413: **     whether check is for De.ov_intup >= keytuple,
                    414: **     De.ov_intup == keytuple, De.ov_intup <= keytuple respectively
                    415: **
                    416: **     returns TRUE or FALSE accordingly.
                    417: */
                    418: 
                    419: keycheck(keys, keytuple, mode)
                    420: struct key     *keys;
                    421: char           *keytuple;
                    422: int            mode;
                    423: {
                    424:        register struct key     *k;
                    425:        register char           *kp;
                    426:        register int            dnum;
                    427:        int                     offset, i, success;
                    428: 
                    429:        kp = keytuple;
                    430:        success = TRUE;
                    431: 
                    432:        for (k = keys; dnum = k->dnumber; k++)
                    433:        {
                    434: 
                    435:                offset = De.ov_scanr->reloff[dnum];
                    436:                if (i = icompare(&De.ov_intup[offset], &kp[offset], De.ov_scanr->relfrmt[dnum], De.ov_scanr->relfrml[dnum] & I1MASK))
                    437:                {
                    438:                        if (i < 0 && mode < 0 || i > 0 && mode > 0)
                    439:                                continue;
                    440:                        success = FALSE;
                    441:                        break;
                    442:                }
                    443:        }
                    444:        return (success);
                    445: }

unix.superglobalmegacorp.com

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