Annotation of 43BSD/ingres/source/ovqp/scan.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <symbol.h>
        !             3: # include      <tree.h>
        !             4: # include      "../decomp/globs.h"
        !             5: # include      <sccs.h>
        !             6: 
        !             7: SCCSID(@(#)scan.c      8.1     12/31/84)
        !             8: 
        !             9: 
        !            10: /*
        !            11: **     SCAN
        !            12: **
        !            13: **     performs tuple by tuple scan of source reln or index reln
        !            14: **     within limits found by strategy routine. 
        !            15: **     When the source reln tuple is obtained the interpreter is invoked
        !            16: **     to continue further processing
        !            17: **
        !            18: */
        !            19: 
        !            20: 
        !            21: scan()
        !            22: {
        !            23:        register        j, mode, domno;
        !            24:        struct symbol   **rlist;        /* "result" list of query */
        !            25:        long            count;
        !            26:        long            tid, temptid;
        !            27:        char            agtup[MAXTUP], outtup1[MAXTUP];
        !            28:        int             qualfound, ok, istarget;
        !            29:        struct symbol   *interpret();
        !            30:        int             getnxt;
        !            31:        long            pageid, lpageid;
        !            32: 
        !            33: #      ifdef xOTR1
        !            34:        if (tTf(71, -1))
        !            35:        {
        !            36:                printf("SCAN\tScanr=%.12s\n", De.ov_scanr ? De.ov_scanr->reldum.relid : "(none)");
        !            37:                printf("\tDe.ov_result %x\n", De.ov_result);
        !            38:                if (tTf(71, 4))
        !            39:                        printf(" De.ov_alist=%x, De.ov_bylist=%x, De.ov_tlist=%x, De.ov_qlist=%x\n", De.ov_alist, De.ov_bylist, De.ov_tlist, De.ov_qlist);
        !            40:                if (De.ov_result)
        !            41:                        printdesc(De.ov_result);
        !            42:        }
        !            43: #      endif
        !            44: 
        !            45:        if (De.ov_result || De.ov_alist)
        !            46:        {
        !            47:                if (De.ov_result)
        !            48:                {
        !            49:                        clr_tuple(De.ov_result, De.ov_outtup);
        !            50:                }
        !            51:                else
        !            52:                {
        !            53:                        j = MAXTUP;
        !            54:                        while (j--)
        !            55:                                De.ov_outtup[j] = 0;
        !            56:                }
        !            57:        }
        !            58: 
        !            59:        count = 0;
        !            60:        qualfound = EMPTY;
        !            61:        mode = De.de_qmode;
        !            62: 
        !            63:        /*
        !            64:        ** Check for identical source and result relations.
        !            65:        ** For modes mdREPL and mdDEL, De.ov_origtup must point
        !            66:        ** to the original (unmodified result tuple).
        !            67:        **
        !            68:        ** If there is no De.ov_source or De.ov_result relations then
        !            69:        ** the code has no effect.
        !            70:        */
        !            71: 
        !            72:        if (De.ov_source == NULL ||
        !            73:            !bequal(De.ov_source->reldum.relid, De.ov_result->reldum.relid, MAXNAME))
        !            74:        {
        !            75:                De.ov_diffrel = TRUE;
        !            76:                De.ov_origtup = outtup1;
        !            77:        }
        !            78:        else
        !            79:        {
        !            80:                De.ov_diffrel = FALSE;
        !            81:                De.ov_origtup = De.ov_intup;
        !            82:        }
        !            83: 
        !            84:        /*  determine type of result list */
        !            85:        /* the only valid combinations are:
        !            86:        **
        !            87:        ** De.ov_tlist=no       De.ov_alist=no  De.ov_bylist=no
        !            88:        ** De.ov_tlist=yes      De.ov_alist=no  De.ov_bylist=no
        !            89:        ** De.ov_tlist=no       De.ov_alist=yes De.ov_bylist=no
        !            90:        ** De.ov_tlist=no       De.ov_alist=yes De.ov_bylist=yes
        !            91:        */
        !            92: 
        !            93:        if (De.ov_tlist)
        !            94:                istarget = TRUE;
        !            95:        else
        !            96:                istarget = FALSE;
        !            97: 
        !            98:        rlist = (De.ov_tlist? De.ov_tlist: De.ov_alist);
        !            99:        if (De.ov_bylist)
        !           100:                rlist = 0;
        !           101: 
        !           102:        De.ov_counter= &count;
        !           103:        if (De.ov_bylist)
        !           104:        {
        !           105:                /*
        !           106:                ** For aggregate functions the result relation
        !           107:                ** is in the format:
        !           108:                ** domain 1 = I4 (used as a counter)
        !           109:                ** domain 2 through relatts - De.ov_agcount (by-domains)
        !           110:                ** remaining domains (the actual aggregate values)
        !           111:                */
        !           112: 
        !           113:                /* set up keys for the getequal */
        !           114:                /* domno must end with the domain number of the first aggregate */
        !           115: 
        !           116:                for (domno = 2; domno <= De.ov_result->reldum.relatts - De.ov_agcount; domno++)
        !           117:                        De.ov_result->relgiven[domno] = 1;
        !           118: 
        !           119: 
        !           120:                De.ov_counter = (long *)De.ov_outtup;   /* first four bytes of De.ov_outtup is counter for De.ov_bylist */
        !           121:        }
        !           122: 
        !           123: 
        !           124:        /*
        !           125:        ** check for constant qualification.
        !           126:        ** If the constant qual is true then remove
        !           127:        ** the qual to save reprocessing it.
        !           128:        ** If it is false then block further processing.
        !           129:        */
        !           130: 
        !           131:        ok = TRUE;
        !           132:        if (De.ov_qlist && De.ov_qualvc == 0)
        !           133:                if (interpret(FALSE, De.ov_qlist)->value.sym_data.i2type)
        !           134:                        De.ov_qlist = 0;        /* qual always true */
        !           135:                else
        !           136:                        ok = FALSE;     /* qual always false */
        !           137: 
        !           138: 
        !           139: 
        !           140:        /* if no source relation, interpret target list */
        !           141:        if (!De.ov_scanr && ok)
        !           142:        {
        !           143:                /* there is no source relation and the qual is true */
        !           144:                qualfound = NONEMPTY;
        !           145:                De.ov_tend = De.ov_outtup;
        !           146:                /* if there is a rlist then process it. (There should always be one) */
        !           147:                if (rlist)
        !           148:                {
        !           149:                        (*De.ov_counter)++;
        !           150:                        interpret(istarget, rlist);
        !           151:                }
        !           152:                if (De.ov_tlist)
        !           153:                        dispose(mode);
        !           154:                else
        !           155:                        if (De.ov_userqry)
        !           156:                                De.ov_tupsfound++;
        !           157:        }
        !           158: 
        !           159: 
        !           160:        if (De.ov_scanr && ok)
        !           161:        {
        !           162:                /* stop search if exact lid provided */
        !           163:                getnxt = (De.ov_fmode == BTREEKEY) ? CURTUP : NXTTUP;
        !           164:                /* There is a source relation. Iterate through each tuple */
        !           165:                pluck_page(&De.ov_hitid, &lpageid);
        !           166:                while (!(j = get(De.ov_scanr, &De.ov_lotid, &De.ov_hitid, De.ov_intup, getnxt)))
        !           167:                {
        !           168: #                      ifdef xOTR1
        !           169:                        if (tTf(71, 5))
        !           170:                        {
        !           171:                                if (De.ov_scanr != De.ov_source)
        !           172:                                        printf("Sec Index:");
        !           173:                                else
        !           174:                                        printf("De.ov_intup:");
        !           175:                                printup(De.ov_scanr, De.ov_intup);
        !           176:                                dumptid(&De.ov_lotid);
        !           177:                        }
        !           178: #                      endif
        !           179:                        if (De.ov_fmode == BTREERANGE && De.ov_scanr->reldum.relspec == M_HEAP)
        !           180:                        {
        !           181:                                pluck_page(&De.ov_lotid, &pageid);
        !           182:                                if (pageid >= lpageid + 1)
        !           183:                                        break;
        !           184:                        }
        !           185:                        De.ov_intid = De.ov_lotid;
        !           186:                        if (De.ov_scanr != De.ov_source)
        !           187:                        {
        !           188:                                /* make sure index tuple is part of the solution */
        !           189:                                if (!indexcheck())
        !           190:                                        /* index keys don't match what we want */
        !           191:                                        continue;
        !           192:                                bmove(De.ov_intup + De.ov_scanr->reldum.relwid - TIDLEN, (char *)&tid, TIDLEN);
        !           193:                                if (j = get(De.ov_source, &tid, &temptid, De.ov_intup, CURTUP))
        !           194:                                        syserr("scan:indx get %d %.12s", j, De.ov_scanr->reldum.relid);
        !           195: #                              ifdef xOTR1
        !           196:                                if (tTf(71, 6))
        !           197:                                {
        !           198:                                        printf("De.ov_intup:");
        !           199:                                        printup(De.ov_source, De.ov_intup);
        !           200:                                }
        !           201: #                              endif
        !           202:                                De.ov_intid = tid;
        !           203:                        }
        !           204: 
        !           205: 
        !           206:                        if (!De.ov_qlist || interpret(FALSE,De.ov_qlist)->value.sym_data.i2type)
        !           207:                        {
        !           208:                                qualfound = NONEMPTY;
        !           209:                                De.ov_tend = De.ov_outtup;
        !           210:                                if (rlist)
        !           211:                                {
        !           212:                                        (*De.ov_counter)++;
        !           213:                                        interpret(istarget,rlist);
        !           214:                                }
        !           215: 
        !           216:                                if (De.ov_tlist)
        !           217:                                        dispose(mode);
        !           218:                                else
        !           219:                                        if (De.ov_userqry)
        !           220:                                                De.ov_tupsfound++;
        !           221: 
        !           222:                                if (!De.ov_targvc)      /* constant Target list */
        !           223:                                        break;
        !           224: 
        !           225: 
        !           226:                                /* process De.ov_bylist if any */
        !           227:                                if (De.ov_bylist)
        !           228:                                {
        !           229:                                        interpret(istarget,De.ov_bylist);
        !           230:                                        if ((j = getequal(De.ov_result, De.ov_outtup, agtup, &De.ov_uptid)) < 0)
        !           231:                                                syserr("scan:getequal %d,%.12s", j, De.ov_result->reldum.relid);
        !           232:        
        !           233:                                        if (!j)
        !           234:                                        {
        !           235:                                                /* match on bylist */
        !           236:                                                bmove(agtup, De.ov_outtup, De.ov_result->reldum.relwid);
        !           237:                                                mode = mdREPL;
        !           238:                                                (*De.ov_counter)++;
        !           239:                                        }
        !           240:                                        else
        !           241:                                        {
        !           242:                                                /* first of this bylist */
        !           243:                                                mode = mdAPP;
        !           244:                                                *De.ov_counter = 1;
        !           245:                                        }
        !           246:        
        !           247:                                        De.ov_tend = De.ov_outtup + De.ov_result->reloff[domno];
        !           248:                                        interpret(istarget,De.ov_alist);
        !           249:                                        dispose(mode);
        !           250:                                }
        !           251:                        }
        !           252:                        if (De.ov_fmode == BTREEKEY)
        !           253:                                break;
        !           254:                }
        !           255: 
        !           256: 
        !           257:                if (j < 0 && De.ov_fmode != BTREEKEY)
        !           258:                        syserr("scan:get prim %d %.12s", j, De.ov_source->reldum.relid);
        !           259:        }
        !           260:        if (De.ov_result)
        !           261:        {
        !           262:                if (j = noclose(De.ov_result))
        !           263:                        syserr("scan:noclose %d %.12s", j, De.ov_result->reldum.relid);
        !           264:        }
        !           265:        return (qualfound);
        !           266: }
        !           267: /*
        !           268: **  DISPOSE
        !           269: */
        !           270: 
        !           271: dispose(mode)
        !           272: {
        !           273:        register int    i;
        !           274: 
        !           275:        i = 0;
        !           276: 
        !           277:        if (!De.ov_result)
        !           278:        {
        !           279:                if (Equel)
        !           280:                        equeleol(EOTUP);
        !           281:                else
        !           282:                        printeol();
        !           283:        }
        !           284:        else
        !           285:        {
        !           286: #              ifdef xOTR1
        !           287:                if (tTf(71, -1))
        !           288:                {
        !           289:                        if (tTf(71, 1))
        !           290:                                printf("mode=%d,",mode);
        !           291:                        if (tTf(71, 2) && (mode == mdREPL || mode == mdDEL))
        !           292:                                printf("De.ov_uptid:%ld, ",De.ov_uptid);
        !           293:                        if (tTf(71, 3))
        !           294:                                if (mode == mdDEL)
        !           295:                                        printup(De.ov_source, De.ov_intup);
        !           296:                                else
        !           297:                                        printup(De.ov_result, De.ov_outtup);
        !           298:                }
        !           299: #              endif
        !           300: 
        !           301: 
        !           302:                /* SPOOL UPDATES OF EXISTING USER RELNS TO BATCH PROCESSOR */
        !           303:                if (De.de_buflag)
        !           304:                {
        !           305:                        addbatch(&De.ov_uptid, De.ov_outtup, De.ov_origtup);
        !           306:                        return;
        !           307:                }
        !           308: 
        !           309:                /* PERFORM ALL OTHER OPERATIONS DIRECTLY */
        !           310:                switch (mode)
        !           311:                {
        !           312:                  case mdRETR:
        !           313:                  case mdAPP:
        !           314:                        if ((i = insert(De.ov_result, &De.ov_uptid, De.ov_outtup, NODUPS)) < 0)
        !           315:                                syserr("dispose:insert %d %.12s", i, De.ov_result->reldum.relid);
        !           316:                        break;
        !           317: 
        !           318:                  case mdREPL:
        !           319:                        if ((i = replace(De.ov_result, &De.ov_uptid, De.ov_outtup, NODUPS)) < 0)
        !           320:                                syserr("dispose:replace %d %.12s", i, De.ov_result->reldum.relid);
        !           321:                        break;
        !           322: 
        !           323:                  case mdDEL:
        !           324:                        if ((i = delete(De.ov_result, &De.ov_uptid)) < 0)
        !           325:                                syserr("dispose:delete %d %.12s", i, De.ov_result->reldum.relid);
        !           326:                        break;
        !           327: 
        !           328:                  default:
        !           329:                        syserr("dispose:bad mode %d", mode);
        !           330:                }
        !           331:        }
        !           332: 
        !           333:        if (De.ov_userqry && i == 0)
        !           334:                De.ov_tupsfound++;
        !           335: }

unix.superglobalmegacorp.com

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