Changeset: acd8afba4936 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=acd8afba4936 Removed Files: monetdb5/optimizer/opt_parappend.c monetdb5/optimizer/opt_parappend.h Modified Files: monetdb5/optimizer/CMakeLists.txt monetdb5/optimizer/opt_pipes.c monetdb5/optimizer/opt_wrapper.c monetdb5/optimizer/optimizer.c Branch: default Log Message:
Get rid of opt_parappend diffs (truncated from 399 to 300 lines): diff --git a/monetdb5/optimizer/CMakeLists.txt b/monetdb5/optimizer/CMakeLists.txt --- a/monetdb5/optimizer/CMakeLists.txt +++ b/monetdb5/optimizer/CMakeLists.txt @@ -36,7 +36,6 @@ target_sources(optimizer opt_mitosis.c opt_mitosis.h opt_multiplex.c opt_multiplex.h opt_oltp.c opt_oltp.h - opt_parappend.c opt_parappend.h opt_wlc.c opt_wlc.h opt_pipes.c opt_prelude.c opt_prelude.h diff --git a/monetdb5/optimizer/opt_parappend.c b/monetdb5/optimizer/opt_parappend.c deleted file mode 100644 --- a/monetdb5/optimizer/opt_parappend.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * Copyright 1997 - July 2008 CWI, August 2008 - 2020 MonetDB B.V. - */ - -/* author Joeri van Ruth - * This optimizer replaces calls to sql.importTable with a series of calls to - * sql.importColumn. - */ -#include "monetdb_config.h" -#include "mal_builder.h" -#include "opt_parappend.h" -#include "wlc.h" - -typedef struct parstate { - InstrPtr prep_stmt; - InstrPtr finish_stmt; -} parstate; - -static str transform(parstate *state, MalBlkPtr mb, InstrPtr importTable, const char *execRef, const char *prepRef, int *actions); -static int setup_append_prep(parstate *state, MalBlkPtr mb, InstrPtr old, const char *prepRef); -static void flush_finish_stmt(parstate *state, MalBlkPtr mb); - - -str -OPTparappendImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) -{ - str msg = MAL_SUCCEED; - lng usec = GDKusec(); - int actions = 0; - InstrPtr *old_mb_stmt = NULL; - parstate state = { NULL }; - - (void)stk; - (void)pci; - - if (WLCused()) { - // can of worms, bail out. - return MAL_SUCCEED; - } - - int found_at = -1; - for (int i = 0; i < mb->stop; i++) { - InstrPtr p = getInstrPtr(mb, i); - if (p->modname == sqlRef) { - if (p->fcnname == appendRef || p->fcnname == updateRef) { - found_at = i; - break; - } - } - } - if (found_at == -1) - return MAL_SUCCEED; - - old_mb_stmt = mb->stmt; - size_t old_ssize = mb->ssize; - size_t old_stop = mb->stop; - if (newMalBlkStmt(mb, mb->stop + getInstrPtr(mb, found_at)->argc) < 0) { - msg = createException(MAL, "optimizer.parappend", SQLSTATE(HY013) MAL_MALLOC_FAIL); - goto end; - } - - for (size_t i = 0; i < old_stop; i++) { - InstrPtr p = old_mb_stmt[i]; - if (p->modname == sqlRef && p->fcnname == appendRef) { - msg = transform(&state, mb, p, putName("append_exec"), putName("append_prep"), &actions); - } else if (p->modname == sqlRef && p->fcnname == updateRef) { - msg = transform(&state, mb, p, putName("update_exec"), putName("update_prep"), &actions); - } else { - flush_finish_stmt(&state, mb); - pushInstruction(mb, p); - } - if (msg != MAL_SUCCEED) - goto end; - } - assert(state.prep_stmt == NULL); - -end: - if (old_mb_stmt) { - for (size_t i = old_stop; i < old_ssize; i++) { - InstrPtr p = old_mb_stmt[i]; - if (p) - freeInstruction(p); - } - GDKfree(old_mb_stmt); - } - - /* Defense line against incorrect plans */ - if (actions > 0 && msg == MAL_SUCCEED) { - if (!msg) - msg = chkTypes(cntxt->usermodule, mb, FALSE); - if (!msg) - msg = chkFlow(mb); - if (!msg) - msg = chkDeclarations(mb); - } - /* keep all actions taken as a post block comment */ - usec = GDKusec()- usec; - char buf[256]; - snprintf(buf, sizeof(buf), "%-20s actions=%2d time=" LLFMT " usec", "parappend" ,actions, usec); - newComment(mb,buf); - if( actions > 0) - addtoMalBlkHistory(mb); - - - - return msg; -} - -static str -transform(parstate *state, MalBlkPtr mb, InstrPtr old, const char *opRef, const char *prepRef, int *actions) -{ - int sname_var; - int tname_var; - int cname_var; - int data_var; - int cand_var; - - // take the old instruction apart - assert(old->retc == 1); - assert(old->argc == 6 || old->argc == 7); - switch (old->argc) { - case 6: - sname_var = getArg(old, 2); - tname_var = getArg(old, 3); - cname_var = getArg(old, 4); - data_var = getArg(old, 5); - cand_var = 0; - break; - case 7: - sname_var = getArg(old, 2); - tname_var = getArg(old, 3); - cname_var = getArg(old, 4); - cand_var = getArg(old, 5); - data_var = getArg(old, 6); - break; - default: - throw(MAL, "optimizer.parappend", "internal error: append/update instr should have argc 6 or 7, not %d", old->argc); - } - - bool sname_constant = isVarConstant(mb, sname_var); - bool tname_constant = isVarConstant(mb, tname_var); - bool cname_constant = isVarConstant(mb, cname_var); - - if (!sname_constant || !tname_constant || !cname_constant) { - // cannot transform this - flush_finish_stmt(state, mb); - pushInstruction(mb, old); - return MAL_SUCCEED; - } - - *actions += 1; - - int cookie_var = setup_append_prep(state, mb, old, prepRef); - - int ret_cookie = newTmpVariable(mb, TYPE_ptr); - InstrPtr e = newFcnCall(mb, sqlRef, opRef); - setReturnArgument(e, ret_cookie); - e = pushArgument(mb, e, cookie_var); - if (cand_var) - e = pushArgument(mb, e, cand_var); - e = pushArgument(mb, e, data_var); - - state->finish_stmt = pushArgument(mb, state->finish_stmt, ret_cookie); - - freeInstruction(old); - return MAL_SUCCEED; -} - -static int -setup_append_prep(parstate *state, MalBlkPtr mb, InstrPtr old, const char *prepRef) -{ - // take the old instruction apart - assert(old->retc == 1); - assert(old->argc == 6 || old->argc == 7); - int chain_out_var = getArg(old, 0); - int chain_in_var = getArg(old, 1); - int sname_var = getArg(old, 2); - int tname_var = getArg(old, 3); - int cname_var = getArg(old, 4); - - // check if the state refers to a sql.append_prep statement that can be - // reused. - InstrPtr prep_stmt = state->prep_stmt; - do { - if (prep_stmt == NULL) - break; - - if (prep_stmt->fcnname != prepRef) { - prep_stmt = NULL; - break; - } - - int existing_sname_var = getArg(prep_stmt, prep_stmt->retc + 1); - int existing_tname_var = getArg(prep_stmt, prep_stmt->retc + 2); - - const char *existing_sname = getVarConstant(mb, existing_sname_var).val.sval; - const char *incoming_sname = getVarConstant(mb, sname_var).val.sval; - if (strcmp(existing_sname, incoming_sname) != 0) { - prep_stmt = NULL; - break; - } - - const char *existing_tname = getVarConstant(mb, existing_tname_var).val.sval; - const char *incoming_tname = getVarConstant(mb, tname_var).val.sval; - if (strcmp(existing_tname, incoming_tname) != 0) { - prep_stmt = NULL; - break; - } - - const char *incoming_cname = getVarConstant(mb, cname_var).val.sval; - int existing_cols = prep_stmt->retc - 1; - for (int i = prep_stmt->argc - existing_cols; i < prep_stmt->argc; i++) { - int var = getArg(prep_stmt, i); - const char *existing_cname = getVarConstant(mb, var).val.sval; - if (strcmp(existing_cname, incoming_cname) == 0) { - // We're not prepared for the complications that may arise - // when there are multiple appends to the same column. - // In particular we would have to track down where the previous - // cookie was used and make sure we execute the next append - // after that use. - // This is unlikely to occur in practice, so instead we just start over. - prep_stmt = NULL; - break; - } - } - - // It seems there is no objection to reusing the existing sql.append_prep. - } while (0); - - int cookie_var = newTmpVariable(mb, TYPE_ptr); - if (prep_stmt == NULL) { - flush_finish_stmt(state, mb); - - int chain = newTmpVariable(mb, TYPE_int); - InstrPtr p = newFcnCall(mb, sqlRef, prepRef); - setReturnArgument(p, chain); - pushReturn(mb, p, cookie_var); - p = pushArgument(mb, p, chain_in_var); - p = pushArgument(mb, p, sname_var); - p = pushArgument(mb, p, tname_var); - p = pushArgument(mb, p, cname_var); - state->prep_stmt = p; - - InstrPtr f = newInstructionArgs(mb, sqlRef, append_finishRef, 2); - setReturnArgument(f, chain_out_var); - f = pushArgument(mb, f, chain); - state->finish_stmt = f; - } else { - // Append to existing first, to ensure there is room - prep_stmt = pushArgument(mb, prep_stmt, cname_var); - prep_stmt = pushArgument(mb, prep_stmt, cookie_var); - // Now move the cookie_var to its proper location - for (int i = prep_stmt->argc - 1; i > prep_stmt->retc; i--) - setArg(prep_stmt, i, getArg(prep_stmt, i - 1)); - setArg(prep_stmt, prep_stmt->retc, cookie_var); - prep_stmt->retc += 1; - - // Always use the chain_out of the latest sql_append: - setArg(state->finish_stmt, 0, chain_out_var); - - state->prep_stmt = prep_stmt; - } - - return cookie_var; -} - - -static void -flush_finish_stmt(parstate *state, MalBlkPtr mb) -{ - if (state->finish_stmt) { - pushInstruction(mb, state->finish_stmt); - } - state->prep_stmt = NULL; - state->finish_stmt = NULL; -} diff --git a/monetdb5/optimizer/opt_parappend.h b/monetdb5/optimizer/opt_parappend.h deleted file mode 100644 --- a/monetdb5/optimizer/opt_parappend.h +++ /dev/null _______________________________________________ checkin-list mailing list [email protected] https://www.monetdb.org/mailman/listinfo/checkin-list
