|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.