/* calculate the footprint for optimizer pipe line choices * and identify empty columns upfront for just in time optimizers. */ static lng SQLgetColumnSize(sql_trans *tr, sql_column *c, int access) { lng size = 0; BAT *b; switch(access){ case 0: b= store_funcs.bind_col(tr, c, RDONLY); if (b) { size += getBatSpace(b); BBPunfix(b->batCacheid); } break; case 1: b = store_funcs.bind_col(tr, c, RD_INS); if (b) { size+= getBatSpace(b); BBPunfix(b->batCacheid); } break; case 2: b = store_funcs.bind_col(tr, c, RD_UPD_VAL); if (b) { size += getBatSpace(b); BBPunfix(b->batCacheid); } b = store_funcs.bind_col(tr, c, RD_UPD_ID); if (b) { size+= getBatSpace(b); BBPunfix(b->batCacheid); } } return size; }
static lng SQLgetSpace(mvc *m, MalBlkPtr mb) { sql_trans *tr = m->session->tr; lng space = 0, i; for (i = 0; i < mb->stop; i++) { InstrPtr p = mb->stmt[i]; char *f = getFunctionId(p); if (getModuleId(p) == sqlRef && (f == bindRef || f == bindidxRef)) { int upd = (p->argc == 7 || p->argc == 9), mode = 0; char *sname = getVarConstant(mb, getArg(p, 2 + upd)).val.sval; char *tname = getVarConstant(mb, getArg(p, 3 + upd)).val.sval; char *cname = NULL; sql_schema *s = mvc_bind_schema(m, sname); if (!s || strcmp(s->base.name, dt_schema) == 0) continue; cname = getVarConstant(mb, getArg(p, 4 + upd)).val.sval; mode = getVarConstant(mb, getArg(p, 5 + upd)).val.ival; if (mode != 0 || !cname || !s) continue; if (f == bindidxRef) { sql_idx *i = mvc_bind_idx(m, s, cname); if (i && (!isRemote(i->t) && !isMergeTable(i->t))) { BAT *b = store_funcs.bind_idx(tr, i, RDONLY); if (b) { space += getBatSpace(b); BBPunfix(b->batCacheid); } } } else if (f == bindRef) { sql_table *t = mvc_bind_table(m, s, tname); sql_column *c = mvc_bind_column(m, t, cname); if (c && (!isRemote(c->t) && !isMergeTable(c->t))) { BAT *b = store_funcs.bind_col(tr, c, RDONLY); if (b) { space += getBatSpace(b); BBPunfix(b->batCacheid); } } } } } return space; }
static lng SQLgetSpace(mvc *m, MalBlkPtr mb, int prepare) { sql_trans *tr = m->session->tr; lng size,space = 0, i; str lasttable = 0; for (i = 0; i < mb->stop; i++) { InstrPtr p = mb->stmt[i]; /* now deal with the update binds, it is only necessary to identify that there are updats * The actual size is not that important */ if (getModuleId(p) == sqlRef && getFunctionId(p) == bindRef && p->retc <= 2){ char *sname = getVarConstant(mb, getArg(p, 1 + p->retc)).val.sval; char *tname = getVarConstant(mb, getArg(p, 2 + p->retc)).val.sval; char *cname = getVarConstant(mb, getArg(p, 3 + p->retc)).val.sval; int access = getVarConstant(mb, getArg(p, 4 + p->retc)).val.ival; sql_schema *s = mvc_bind_schema(m, sname); sql_table *t = 0; sql_column *c = 0; if (!s || strcmp(s->base.name, dt_schema) == 0) continue; t = mvc_bind_table(m, s, tname); if (!t) continue; c = mvc_bind_column(m, t, cname); if (!s) continue; /* we have to sum the cost of all three components of a BAT */ if (c && (!isRemote(c->t) && !isMergeTable(c->t)) && (lasttable == 0 || strcmp(lasttable,tname)==0)) { size = SQLgetColumnSize(tr, c, access); space += size; // accumulate once per table //lasttable = tname; invalidate this attempt if( !prepare && size == 0 && ! t->system){ //mnstr_printf(GDKout,"found empty column %s.%s.%s prepare %d size "LLFMT"\n",sname,tname,cname,prepare,size); setFunctionId(p, emptybindRef); } } } if (getModuleId(p) == sqlRef && (getFunctionId(p) == bindidxRef)) { char *sname = getVarConstant(mb, getArg(p, 1 + p->retc)).val.sval; //char *tname = getVarConstant(mb, getArg(p, 2 + p->retc)).val.sval; char *idxname = getVarConstant(mb, getArg(p, 3 + p->retc)).val.sval; int access = getVarConstant(mb, getArg(p, 4 + p->retc)).val.ival; sql_schema *s = mvc_bind_schema(m, sname); BAT *b; if (getFunctionId(p) == bindidxRef) { sql_idx *i = mvc_bind_idx(m, s, idxname); if (i && (!isRemote(i->t) && !isMergeTable(i->t))) { b = store_funcs.bind_idx(tr, i, RDONLY); if (b) { space += (size =getBatSpace(b)); if (!size) { sql_column *c = i->t->columns.set->h->data; size = SQLgetColumnSize(tr, c, access); } if( !prepare && size == 0 && ! i->t->system){ setFunctionId(p, emptybindidxRef); //mnstr_printf(GDKout,"found empty column %s.%s.%s prepare %d size "LLFMT"\n",sname,tname,idxname,prepare,size); } BBPunfix(b->batCacheid); } } } } } return space; }