str MDBsetCatch(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) { int b; (void) mb; /* still unused */ b = *getArgReference_bit(stk, p, 1); stk->cmd = cntxt->itrace = (b? (int) 'C':0); return MAL_SUCCEED; }
str MDBsetTrace(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p) { int b; (void) cntxt; (void) mb; /* still unused */ b = *getArgReference_bit(stk, p, 1); MDBtraceFlag(cntxt, stk, (b? (int) 't':0)); return MAL_SUCCEED; }
str SQLstatement(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { str *expr = getArgReference_str(stk, pci, 1); bit output = TRUE; (void) mb; if (pci->argc == 3) output = *getArgReference_bit(stk, pci, 2); return SQLstatementIntern(cntxt, expr, "SQLstatement", TRUE, output, NULL); }
str MDBtrapFunction(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { str modnme = *getArgReference_str(stk, pci, 1); str fcnnme = *getArgReference_str(stk, pci, 2); bit b= *getArgReference_bit(stk,pci,3); (void) cntxt; (void) mb; if ( mdbSetTrap(cntxt,modnme,fcnnme,b) ) throw(MAL,"mdb.trap", RUNTIME_SIGNATURE_MISSING); return MAL_SUCCEED; }
str SQLdiff(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { (void)cntxt; if (isaBatType(getArgType(mb, pci, 1))) { bat *res = getArgReference_bat(stk, pci, 0); bat *bid = getArgReference_bat(stk, pci, 1); BAT *b = BATdescriptor(*bid), *c, *r; gdk_return gdk_code; if (!b) throw(SQL, "sql.diff", SQLSTATE(HY005) "Cannot access column descriptor"); voidresultBAT(r, TYPE_bit, BATcount(b), b, "sql.diff"); if (pci->argc > 2) { c = b; bid = getArgReference_bat(stk, pci, 2); b = BATdescriptor(*bid); if (!b) { BBPunfix(c->batCacheid); throw(SQL, "sql.diff", SQLSTATE(HY005) "Cannot access column descriptor"); } gdk_code = GDKanalyticaldiff(r, b, c, b->ttype); BBPunfix(c->batCacheid); } else { gdk_code = GDKanalyticaldiff(r, b, NULL, b->ttype); } BBPunfix(b->batCacheid); if(gdk_code == GDK_SUCCEED) BBPkeepref(*res = r->batCacheid); else throw(SQL, "sql.diff", GDK_EXCEPTION); } else { bit *res = getArgReference_bit(stk, pci, 0); *res = FALSE; } return MAL_SUCCEED; }
str CMDifthen(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { BAT *b = NULL, *b1 = NULL, *b2 = NULL, *bn; int tp0, tp1, tp2; bat *ret; BUN cnt = BUN_NONE; (void) cntxt; (void) mb; if (pci->argc != 4) throw(MAL, "batcalc.ifthen", "Operation not supported."); ret = getArgReference_bat(stk, pci, 0); tp0 = stk->stk[getArg(pci, 1)].vtype; tp1 = stk->stk[getArg(pci, 2)].vtype; tp2 = stk->stk[getArg(pci, 3)].vtype; if (tp0 == TYPE_bat || isaBatType(tp0)) { b = BATdescriptor(* getArgReference_bat(stk, pci, 1)); if (b == NULL) throw(MAL, "batcalc.ifthenelse", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); cnt = BATcount(b); } if (tp1 == TYPE_bat || isaBatType(tp1)) { b1 = BATdescriptor(* getArgReference_bat(stk, pci, 2)); if (b1 == NULL) { if (b) BBPunfix(b->batCacheid); throw(MAL, "batcalc.ifthenelse", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); } if (cnt == BUN_NONE) cnt = BATcount(b1); else if (BATcount(b1) != cnt) { BBPunfix(b->batCacheid); throw(MAL, "batcalc.ifthenelse", ILLEGAL_ARGUMENT); } } if (tp2 == TYPE_bat || isaBatType(tp2)) { b2 = BATdescriptor(* getArgReference_bat(stk, pci, 3)); if (b2 == NULL) { if (b) BBPunfix(b->batCacheid); if (b1) BBPunfix(b1->batCacheid); throw(MAL, "batcalc.ifthenelse", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); } if (cnt == BUN_NONE) cnt = BATcount(b2); else if (BATcount(b2) != cnt) { if (b) BBPunfix(b->batCacheid); if (b1) BBPunfix(b1->batCacheid); throw(MAL, "batcalc.ifthenelse", ILLEGAL_ARGUMENT); } } if (b == NULL && b1 == NULL && b2 == NULL) { /* at least one BAT required */ throw(MAL, "batcalc.ifthenelse", ILLEGAL_ARGUMENT); } if (b != NULL) { if (b1 != NULL) { if (b2 != NULL) { bn = BATcalcifthenelse(b, b1, b2); } else { bn = BATcalcifthenelsecst(b, b1, &stk->stk[getArg(pci, 3)]); } } else { if (b2 != NULL) { bn = BATcalcifthencstelse(b, &stk->stk[getArg(pci, 2)], b2); } else { bn = BATcalcifthencstelsecst(b, &stk->stk[getArg(pci, 2)], &stk->stk[getArg(pci, 3)]); } } } else { bit v = *getArgReference_bit(stk, pci, 1); if (is_bit_nil(v)) { if (b1 != NULL) bn = BATconstant(b1->hseqbase, b1->ttype, ATOMnilptr(b1->ttype), BATcount(b1), TRANSIENT); else bn = BATconstant(b2->hseqbase, b2->ttype, ATOMnilptr(b2->ttype), BATcount(b2), TRANSIENT); } else if (v) { if (b1 != NULL) bn = COLcopy(b1, b1->ttype, 0, TRANSIENT); else bn = BATconstant(b2->hseqbase, b2->ttype, VALptr(&stk->stk[getArg(pci, 2)]), BATcount(b2), TRANSIENT); } else { if (b2 != NULL) bn = COLcopy(b2, b2->ttype, 0, TRANSIENT); else bn = BATconstant(b1->hseqbase, b1->ttype, VALptr(&stk->stk[getArg(pci, 3)]), BATcount(b1), TRANSIENT); } } if (b) BBPunfix(b->batCacheid); if (b1) BBPunfix(b1->batCacheid); if (b2) BBPunfix(b2->batCacheid); if (bn == NULL) { return mythrow(MAL, "batcalc.ifthenelse", OPERATION_FAILED); } BBPkeepref(*ret = bn->batCacheid); return MAL_SUCCEED; }