Annotation of 43BSD/ingres/source/qrymod/d_integ.c, revision 1.1.1.1

1.1       root        1: # include      <ingres.h>
                      2: # include      <aux.h>
                      3: # include      <catalog.h>
                      4: # include      <tree.h>
                      5: # include      <symbol.h>
                      6: # include      <pv.h>
                      7: # include      <resp.h>
                      8: # include      <func.h>
                      9: # include      "qrymod.h"
                     10: # include      <sccs.h>
                     11: # include      <errors.h>
                     12: 
                     13: SCCSID(@(#)d_integ.c   8.3     2/8/85)
                     14: 
                     15: 
                     16: /*
                     17: **  D_INTEG -- define integrity constraint
                     18: **
                     19: **     An integrity constraint (as partially defined by the last
                     20: **     tree defined by d_tree) is defined.
                     21: **
                     22: **     Parameters:
                     23: **             none
                     24: **
                     25: **     Returns:
                     26: **             none
                     27: **
                     28: **     Side Effects:
                     29: **             Activity in 'relation' and 'integrities' catalogs.
                     30: **
                     31: **     Trace Flags:
                     32: **             49
                     33: */
                     34: 
                     35: extern DESC    Intdes;
                     36: extern DESC    Reldes;
                     37: 
                     38: extern         d_integ(), null_fn();
                     39: extern short   tTqm[80];
                     40: 
                     41: struct fn_def  DefIntFn =
                     42: {
                     43:        "DINTEG",
                     44:        d_integ,
                     45:        null_fn,
                     46:        null_fn,
                     47:        NULL,
                     48:        0,
                     49:        tTqm,
                     50:        80,
                     51:        'Q',
                     52:        0
                     53: };
                     54: 
                     55: 
                     56: 
                     57: d_integ(pc, pv)
                     58: int    pc;
                     59: PARM   *pv;
                     60: {
                     61:        register int            i;
                     62:        register QTREE          *t;             /* definition tree */
                     63:        struct integrity        inttup;
                     64:        struct tup_id           tid;
                     65:        register int            rv;             /* result variable */
                     66:        struct relation         relkey;
                     67:        struct relation         reltup;
                     68:        char                    relid[MAXNAME];
                     69:        char                    relowner[2];
                     70:        long                    relstat;
                     71:        struct  qthdr           qt;
                     72: 
                     73:        if (pv[0].pv_type != PV_QTREE)
                     74:                syserr("d_integ: tree");
                     75:        t = pv[0].pv_val.pv_qtree;
                     76:        rv = Qt.qt_resvar;
                     77: 
                     78:        /*
                     79:        **  Check for valid environment.
                     80:        **      The tree must exist, have a qualification, and have
                     81:        **      no target list.  The query mode must be mdINTEG.
                     82:        **
                     83:        **      User level stuff checks to see that this is single
                     84:        **      variable aggregate free, since that's all we know
                     85:        **      about thusfar.  Also, the relation in question must
                     86:        **      not be a view.
                     87:        */
                     88: 
                     89: #      ifdef xQTR3
                     90:        if (t == NULL)
                     91:                syserr("d_integ: NULL tree");
                     92:        if ((i = t->right->sym.type) != AND)
                     93:                syserr("d_integ: qual %d", i);
                     94:        if ((i = t->left->sym.type) != TREE)
                     95:                syserr("d_integ: TL %d", i);
                     96:        if (Qt.qt_qmode != mdINTEG)
                     97:                syserr("d_integ: Qmode %d", Qt.qt_qmode);
                     98: #      endif
                     99:        
                    100:        /* check for aggregates */
                    101:        if (aggcheck(t))
                    102:                qmerror(NOAGGINT, -1, rv, 0);   /* aggregates in qual */
                    103: 
                    104:        /* check for multi-variable */
                    105:        for (i = 0; i < MAXRANGE; i++)
                    106:        {
                    107:                if (Qt.qt_rangev[i].rngvdesc == NULL)
                    108:                        continue;
                    109:                if (i != rv)
                    110:                {
                    111: #                      ifdef xQTR3
                    112:                        if (tTf(49, 1))
                    113:                                printf("d_integ: Rv %d(%.14s) i %d(%.14s)\n",
                    114:                                    rv, Qt.qt_rangev[rv].rngvdesc->reldum.relid,
                    115:                                    i, Qt.qt_rangev[i].rngvdesc->reldum.relid);
                    116: #                      endif
                    117:                        qmerror(NOMULTIVAR, -1, rv, 0); /* too many vars */
                    118:                }
                    119:        }
                    120: 
                    121: 
                    122:        /* check for the resultvariable being a real relation */
                    123:        if (bitset(S_VIEW, Qt.qt_rangev[rv].rngvdesc->reldum.relstat))
                    124:                qmerror(INTVIEW, -1, rv, 0);    /* is a view */
                    125:        
                    126:        /* guarantee that you own this relation */
                    127:        if (!bequal(Usercode, Qt.qt_rangev[rv].rngvdesc->reldum.relowner, UCODE_SZ))
                    128:                qmerror(MUSTOWN, -1, rv, 0);    /* don't own reln */
                    129:        bmove(Qt.qt_rangev[rv].rngvdesc->reldum.relid, relid, MAXNAME);
                    130:        bmove(Qt.qt_rangev[rv].rngvdesc->reldum.relowner, relowner, 2);
                    131:        bmove(&Qt,&qt, sizeof (Qt));
                    132:        relstat = Qt.qt_rangev[rv].rngvdesc->reldum.relstat;
                    133: 
                    134:        /*
                    135:        **  Guarantee that the integrity constraint is true now.
                    136:        **      This involves issuing a retrieve statement for the
                    137:        **      inverse of the qualification.  The target list is
                    138:        **      already null, so we will get nothing printed out
                    139:        **      (only a return status).
                    140:        **
                    141:        **      We reset resp_tups if ok so that the user isn't annoyed
                    142:        **      by a tuple count.  On error, it is a count of the
                    143:        **      number of tuples that don't satisfy.
                    144:        */
                    145: 
                    146:        Qt.qt_qmode = mdRETR;
                    147:        Qt.qt_resvar = -1;
                    148: 
                    149:        /* issue the invert of the query */
                    150:        issueinvert(t);
                    151:        if (Resp.resp_tups != 0)
                    152:                qmerror(INITCONST, -1, rv, 0);  /* constraint not satisfied */
                    153:        Resp.resp_tups = -1;
                    154:        bmove(&qt,&Qt, sizeof (Qt));
                    155: 
                    156:        /*
                    157:        **  Set up the rest of the environment.
                    158:        */
                    159: 
                    160:        opencatalog("integrities", OR_WRITE);
                    161:        clr_tuple(&Intdes, &inttup);
                    162:        Qt.qt_resvar = -1;
                    163:        Qt.qt_qmode = -1;
                    164: 
                    165:        /*
                    166:        **  Set up integrity relation tuple.
                    167:        **      The qualification will be scanned, and a set of
                    168:        **      domains referenced will be created.  Other stuff
                    169:        **      is filled in from the range table and from the
                    170:        **      parser.
                    171:        **
                    172:        **      The tree is actually inserted into the tree catalog
                    173:        **      in this step.  Extra information is cleared here.
                    174:        */
                    175: 
                    176:        inttup.intresvar = rv;
                    177:        bmove(relid, inttup.intrelid, MAXNAME);
                    178:        bmove(relowner, inttup.intrelowner, 2);
                    179:        makeidset(rv, t, inttup.intdomset);
                    180:        inttup.inttree = puttree(t, inttup.intrelid, inttup.intrelowner, mdINTEG);
                    181: 
                    182:        /*
                    183:        **  Insert tuple into integrity catalog.
                    184:        */
                    185: 
                    186:        i = insert(&Intdes, &tid, &inttup, FALSE);
                    187:        if (i < 0)
                    188:                syserr("d_integ: insert");
                    189:        if (noclose(&Intdes) != 0)
                    190:                syserr("d_integ: noclose int");
                    191: 
                    192:        /*
                    193:        **  Update relstat S_INTEG bit.
                    194:        */
                    195: 
                    196:        if (!bitset(S_INTEG, relstat))
                    197:        {
                    198:                opencatalog("relation", OR_WRITE);
                    199:                clearkeys(&Reldes);
                    200:                setkey(&Reldes, &relkey, inttup.intrelid, RELID);
                    201:                setkey(&Reldes, &relkey, inttup.intrelowner, RELOWNER);
                    202:                i = getequal(&Reldes, &relkey, &reltup, &tid);
                    203:                if (i != 0)
                    204:                        syserr("d_integ: geteq returns %d",i);
                    205:                reltup.relstat |= S_INTEG;
                    206:                i = replace(&Reldes, &tid, &reltup, FALSE);
                    207:                if (i != 0)
                    208:                        syserr("d_integ: replace returns %d",i);
                    209:                if (noclose(&Reldes) != 0)
                    210:                        syserr("d_integ: noclose rel");
                    211:        }
                    212: 
                    213:        return (0);
                    214: }
                    215: 
                    216: 
                    217: makeidset(varno, tree, dset)
                    218: int    varno;
                    219: QTREE  *tree;
                    220: int    dset[8];
                    221: {
                    222:        register int    vn;
                    223:        register QTREE  *t;
                    224: 
                    225:        vn = varno;
                    226:        t = tree;
                    227: 
                    228:        while (t != NULL)
                    229:        {
                    230:                if (t->sym.type == VAR && t->sym.value.sym_var.varno == vn)
                    231:                        lsetbit(t->sym.value.sym_var.attno, dset);
                    232:                
                    233:                /* handle left subtree recursively */
                    234:                makeidset(vn, t->left, dset);
                    235: 
                    236:                /* handle right subtree iteratively */
                    237:                t = t->right;
                    238:        }
                    239: }

unix.superglobalmegacorp.com

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