# include "amx.h" bgn_scan(retrieve) int retrieve; { register AMX_REL *r; register int i; Qry_mode = AMX_RETRIEVE; r = Relation; # ifdef AMX_QRYMOD /* check RETRIEVE permission */ qry_perm(r, "retrieve"); # endif /* initialize access path informations */ AP_index = MAX_RELS; AP_low = AP_high = 0; AP_ilow = AP_ihigh = 0; /* clear out domain table */ Domains = 0; /* count of simple clausels */ for (i = MAXDOM - 1; i >= 0; --i) Dom_set[i] = 0; fprintf(FILE_tmp, msg(172), ++AP_level); fprintf(FILE_tmp, msg(174)); fprintf(FILE_tmp, msg(175)); # if (S_ALIGN + L_ALIGN + D_ALIGN) > 0 fprintf(FILE_tmp, msg(120)); # endif fprintf(FILE_tmp, msg(152), ALIGNMENT(r->rel_wid)); if (!retrieve) { if (!No_locks) fprintf(FILE_tmp, msg(57), r->rel_uniq, r->rel_uniq); return; } fprintf(FILE_tmp, msg(51)); fprintf(FILE_tmp, msg(187), ALIGNMENT(ctou(Relation->rel_atts))); /* create scan temp */ if (!(FILE_scn = fopen(Filename, "w"))) yyexit(19); # ifdef SETBUF setbuf(FILE_scn, BUF_scn); # endif if (!No_locks) fprintf(FILE_scn, msg(57), r->rel_uniq, r->rel_uniq); fprintf(FILE_scn, msg(180), r->rel_uniq, r->rel_uniq); } char *scan(over, retrieve) AMX_REL *over; int retrieve; { register AMX_REL *scn; register int c; register int ap; register char *rel_stack; int low; int high; DESC d; extern AMX_REL *getrel(); /* setup ACCESS PATH */ if (retrieve) strategy(over); if (AP_index != MAX_RELS) { /* indexed access path */ scn = getrel(AP_index, 0); ap = 'i'; low = AP_ilow; high = AP_ihigh; fprintf(FILE_tmp, msg(149), ALIGNMENT(ctou(scn->rel_atts))); fprintf(FILE_tmp, msg(181)); } else { /* primary access path */ scn = Relation; ap = 's'; low = AP_low; high = AP_high; } if (AP_low) fprintf(FILE_tmp, msg(130), ALIGNMENT(AP_low)); if (AP_high) fprintf(FILE_tmp, msg(121), ALIGNMENT(AP_high)); if (AP_ilow) fprintf(FILE_tmp, msg(119), ALIGNMENT(AP_ilow)); if (AP_ihigh) fprintf(FILE_tmp, msg(117), ALIGNMENT(AP_ihigh)); if (retrieve) { /* write qualification out */ fclose(FILE_scn); if (!(FILE_scn = fopen(Filename, "r"))) yyexit(17); # ifdef SETBUF setbuf(FILE_scn, BUF_scn); # endif while ((c = getc(FILE_scn)) != EOF) putc(c, FILE_tmp); fclose(FILE_scn); FILE_scn = (FILE *) 0; } /* setup new SCAN */ fprintf(FILE_tmp, msg(115)); fprintf(FILE_tmp, msg(113)); if (retrieve) fprintf(FILE_tmp, msg(147), Relation->rel_uniq, d.relgiven - ((char *) &d) + 1, ctou(Relation->rel_atts)); if (AP_index != MAX_RELS) fprintf(FILE_tmp, msg(145), scn->rel_uniq, d.relgiven - ((char *) &d) + 1, ctou(scn->rel_atts)); rel_stack = (char *) (Scan_rel? Scan_rel->rel_uniq: MAX_RELS); Scan_rel = getrel(Relation->rel_uniq, 2); if (!retrieve) goto do_scan; /* FIND with NOKEY */ if (AP_mode == AP_NOKEY) { fprintf(FILE_tmp, msg(109)); fprintf(FILE_tmp, msg(107)); goto do_scan; } /* FIND with FULLKEY */ if (AP_mode == AP_FULLKEY) { if (abs(ctoi(scn->rel_spec)) == M_HASH) fprintf(FILE_tmp, msg(143), scn->rel_uniq, ap, ap); else fprintf(FILE_tmp, msg(141), scn->rel_uniq, ap, ap, ap); goto do_scan; } /* FIND with LOWKEY or RANGEKEY */ if (bitset(AP_LOWKEY, AP_mode)) { fprintf(FILE_tmp, msg(139), scn->rel_uniq, ap, ap, ap); if (high) fprintf(FILE_tmp, ",AA_%c2key", ap); fprintf(FILE_tmp, ");\n"); } else fprintf(FILE_tmp, msg(105), ap); /* FIND with HIGHKEY or RANGEKEY */ if (bitset(AP_HIGHKEY, AP_mode)) fprintf(FILE_tmp, msg(137), scn->rel_uniq, ap, ap); else fprintf(FILE_tmp, msg(107)); /* SCAN */ do_scan: AP_label[AP_level] = AP_stmt++; if (retrieve) { fprintf(FILE_tmp, msg(202), 2 * AP_label[AP_level]); fprintf(FILE_tmp, msg(133), scn->rel_uniq, ap, ap); if (low) fprintf(FILE_tmp, ",AA_%c1key", ap); if (high) fprintf(FILE_tmp, ",AA_%c2key", ap); if (AP_index != MAX_RELS) { fprintf(FILE_tmp, msg(131), Scan_rel->rel_uniq); if (AP_low) fprintf(FILE_tmp, ",AA_s1key"); if (AP_high) fprintf(FILE_tmp, ",AA_s2key"); } } else fprintf(FILE_tmp, msg(213), Destination.c_var, Scan_rel->rel_uniq); fprintf(FILE_tmp, msg(203)); return (rel_stack); } end_scan(rel_stack, retrieve) register char *rel_stack; int retrieve; { register int i; extern AMX_REL *getrel(); fprintf(FILE_tmp, msg(98)); if (!retrieve) fprintf(FILE_tmp, msg(202), 2 * AP_label[AP_level]); fprintf(FILE_tmp, msg(202), 2 * AP_label[AP_level] + 1); fprintf(FILE_tmp, msg(95)); if (!No_locks) fprintf(FILE_tmp, msg(25), Scan_rel->rel_uniq); fprintf(FILE_tmp, msg(26), AP_level--); /* restore previous scan */ if ((i = (int) rel_stack) == MAX_RELS) Scan_rel = (AMX_REL *) 0; else Scan_rel = getrel(i, 2); }