Changeset: 12d43c892496 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=12d43c892496 Modified Files: sql/backends/monet5/sql_statement.c sql/server/rel_psm.c sql/server/rel_schema.c sql/server/rel_schema.h sql/server/sql_mvc.h sql/server/sql_var.c sql/storage/sql_storage.h sql/storage/store.c sql/test/scoping/Tests/scoping01.sql Branch: scoping Log Message:
Cleanup and fixed handling of declared tables in the global scope diffs (254 lines): diff --git a/sql/backends/monet5/sql_statement.c b/sql/backends/monet5/sql_statement.c --- a/sql/backends/monet5/sql_statement.c +++ b/sql/backends/monet5/sql_statement.c @@ -513,7 +513,7 @@ stmt_tid(backend *be, sql_table *t, int MalBlkPtr mb = be->mb; InstrPtr q; - if (isDeclaredTable(t) && t->data) { /* declared table */ + if (isDeclaredTable(t) && stack_find_table(be->mvc, t->s, t->base.name) && t->data) { /* declared table */ stmt *s = stmt_create(be->mvc->sa, st_tid); int *l = t->data; @@ -524,7 +524,7 @@ stmt_tid(backend *be, sql_table *t, int s->nr = l[0]; return s; } - q = newStmt(mb, sqlRef, tidRef); + q = newStmt(mb, sqlRef, tidRef); if (q == NULL) return NULL; setVarType(mb, getArg(q, 0), newBatType(tt)); @@ -564,7 +564,7 @@ stmt_bat(backend *be, sql_column *c, int InstrPtr q; /* for read access tid.project(col) */ - if (isDeclaredTable(c->t) && c->t->data) { /* declared table */ + if (isDeclaredTable(c->t) && stack_find_table(be->mvc, c->t->s, c->t->base.name) && c->t->data) { /* declared table */ stmt *s = stmt_create(be->mvc->sa, st_bat); int *l = c->t->data; @@ -693,7 +693,7 @@ stmt_append_col(backend *be, sql_column if (b->nr < 0) return NULL; - if (isDeclaredTable(c->t) && c->t->data) { /* declared table */ + if (isDeclaredTable(c->t) && stack_find_table(be->mvc, c->t->s, c->t->base.name) && c->t->data) { /* declared table */ int *l = c->t->data; if (c->colnr == 0) { /* append to tid column */ @@ -784,7 +784,7 @@ stmt_update_col(backend *be, sql_column if (tids->nr < 0 || upd->nr < 0) return NULL; - if (isDeclaredTable(c->t) && c->t->data) { /* declared table */ + if (isDeclaredTable(c->t) && stack_find_table(be->mvc, c->t->s, c->t->base.name) && c->t->data) { /* declared table */ int *l = c->t->data; q = newStmt(mb, batRef, updateRef); @@ -872,7 +872,7 @@ stmt_delete(backend *be, sql_table *t, s if (tids->nr < 0) return NULL; - if (isDeclaredTable(t) && t->data) { /* declared table */ + if (isDeclaredTable(t) && stack_find_table(be->mvc, t->s, t->base.name) && t->data) { /* declared table */ int *l = t->data; q = newStmt(mb, batRef, deleteRef); @@ -2763,7 +2763,7 @@ stmt_table_clear(backend *be, sql_table MalBlkPtr mb = be->mb; InstrPtr q = NULL; - if (isDeclaredTable(t) && t->data) { /* declared table */ + if (isDeclaredTable(t) && stack_find_table(be->mvc, t->s, t->base.name) && t->data) { /* declared table */ int *l = t->data; int cnt = list_length(t->columns.set)+1, i; diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c --- a/sql/server/rel_psm.c +++ b/sql/server/rel_psm.c @@ -201,8 +201,9 @@ rel_psm_declare_table(sql_query *query, return sql_error(sql, 01, SQLSTATE(42000) "DECLARE: Table '%s' already declared", name); assert(n->next->next->next->type == type_int); - rel = rel_create_table(query, s, SQL_DECLARED_TABLE, s->base.name, name, n->next->next->data.sym, - n->next->next->next->data.i_val, NULL, NULL, NULL, false, NULL, 0); + rel = rel_create_table(query, SQL_DECLARED_TABLE, s->base.name, name, n->next->next->data.sym, + n->next->next->next->data.i_val, NULL, NULL, NULL, false, NULL, + n->next->next->next->next->next->next->data.i_val); if (!rel) return NULL; @@ -211,10 +212,9 @@ rel_psm_declare_table(sql_query *query, } else if (rel->op == op_insert) { baset = rel->l; } else { - return NULL; + assert(0); } - if (baset->flag != ddl_create_table) - return NULL; + assert(baset->flag == ddl_create_table); t = (sql_table*)((atom*)((sql_exp*)baset->exps->t->data)->l)->data.val.pval; if (!stack_push_table(sql, t)) return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c --- a/sql/server/rel_schema.c +++ b/sql/server/rel_schema.c @@ -1000,7 +1000,7 @@ create_partition_definition(mvc *sql, sq } sql_rel * -rel_create_table(sql_query *query, sql_schema *s, int temp, const char *sname, const char *name, symbol *table_elements_or_subquery, +rel_create_table(sql_query *query, int temp, const char *sname, const char *name, symbol *table_elements_or_subquery, int commit_action, const char *loc, const char *username, const char *password, bool pw_encrypted, symbol* partition_def, int if_not_exists) { @@ -1010,12 +1010,14 @@ rel_create_table(sql_query *query, sql_s (temp == SQL_MERGE_TABLE)?tt_merge_table: (temp == SQL_REPLICA_TABLE)?tt_replica_table:tt_table; bit properties = partition_def ? (bit) partition_def->data.lval->h->next->next->data.i_val : 0; + sql_table *t = NULL; const char *action = (temp == SQL_DECLARED_TABLE)?"DECLARE":"CREATE"; + sql_schema *s = cur_schema(sql); if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, SQLSTATE(3F000) "%s TABLE: no such schema '%s'", action, sname); - if (temp != SQL_PERSIST && tt == tt_table && commit_action == CA_COMMIT) + if ((temp != SQL_PERSIST && tt == tt_table && commit_action == CA_COMMIT) || temp == SQL_DECLARE) commit_action = CA_DELETE; if (temp != SQL_DECLARED_TABLE) { @@ -1030,10 +1032,9 @@ rel_create_table(sql_query *query, sql_s } if (mvc_bind_table(sql, s, name)) { - char *cd = (temp == SQL_DECLARED_TABLE)?"DECLARE":"CREATE"; if (if_not_exists) return rel_psm_block(sql->sa, new_exp_list(sql->sa)); - return sql_error(sql, 02, SQLSTATE(42S01) "%s TABLE: name '%s' already in use", cd, name); + return sql_error(sql, 02, SQLSTATE(42S01) "%s TABLE: name '%s' already in use", action, name); } else if (temp != SQL_DECLARED_TABLE && (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && temp == SQL_LOCAL_TEMP))){ return sql_error(sql, 02, SQLSTATE(42000) "CREATE TABLE: insufficient privileges for user '%s' in schema '%s'", sqlvar_get_string(find_global_var(sql, mvc_bind_schema(sql, "sys"), "current_user")), s->base.name); } else if (temp == SQL_PERSIST && isTempSchema(s)){ @@ -1042,7 +1043,6 @@ rel_create_table(sql_query *query, sql_s /* table element list */ dnode *n; dlist *columns = table_elements_or_subquery->data.lval; - sql_table *t; if (tt == tt_remote) { char *local_user = sqlvar_get_string(find_global_var(sql, mvc_bind_schema(sql, "sys"), "current_user")); @@ -1087,7 +1087,6 @@ rel_create_table(sql_query *query, sql_s dlist *column_spec = as_sq->h->data.lval; symbol *subquery = as_sq->h->next->data.sym; int with_data = as_sq->h->next->next->data.i_val; - sql_table *t = NULL; assert(as_sq->h->next->next->type == type_int); sq = rel_selects(query, subquery); @@ -2678,7 +2677,7 @@ rel_schemas(sql_query *query, symbol *s) assert(l->h->type == type_int); assert(l->h->next->next->next->type == type_int); - ret = rel_create_table(query, cur_schema(sql), temp, sname, name, + ret = rel_create_table(query, temp, sname, name, l->h->next->next->data.sym, /* elements or subquery */ l->h->next->next->next->data.i_val, /* commit action */ l->h->next->next->next->next->data.sval, /* location */ diff --git a/sql/server/rel_schema.h b/sql/server/rel_schema.h --- a/sql/server/rel_schema.h +++ b/sql/server/rel_schema.h @@ -14,7 +14,7 @@ extern sql_rel *rel_schemas(sql_query *query, symbol *sym); -extern sql_rel *rel_create_table(sql_query *query, sql_schema *ss, int temp, +extern sql_rel *rel_create_table(sql_query *query, int temp, const char *sname, const char *name, symbol *table_elements_or_subquery, int commit_action, const char *loc, diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h --- a/sql/server/sql_mvc.h +++ b/sql/server/sql_mvc.h @@ -280,7 +280,7 @@ extern sql_var *find_global_var(mvc *sql extern int stack_has_frame(mvc *sql, const char *name); extern int stack_nr_of_declared_tables(mvc *sql); -extern atom* sqlvar_set(sql_var *var, ValRecord *v); +extern atom *sqlvar_set(sql_var *var, ValRecord *v); extern str sqlvar_get_string(sql_var *var); extern str sqlvar_set_string(sql_var *var, const char *v); #ifdef HAVE_HGE diff --git a/sql/server/sql_var.c b/sql/server/sql_var.c --- a/sql/server/sql_var.c +++ b/sql/server/sql_var.c @@ -68,7 +68,6 @@ static void destroy_sql_local_table(void *data) { sql_local_table *slt = (sql_local_table*) data; - table_destroy(slt->table); /* TODO check if this is needed */ _DELETE(slt); } diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h --- a/sql/storage/sql_storage.h +++ b/sql/storage/sql_storage.h @@ -19,7 +19,7 @@ #define isTemp(x) (isNew((x)->t)||(x)->t->persistence!=SQL_PERSIST) #define isTempTable(x) ((x)->persistence!=SQL_PERSIST) -#define isGlobal(x) ((x)->persistence!=SQL_LOCAL_TEMP) +#define isGlobal(x) ((x)->persistence!=SQL_LOCAL_TEMP && (x)->persistence!=SQL_DECLARED_TABLE) #define isGlobalTemp(x) ((x)->persistence==SQL_GLOBAL_TEMP) #define isTempSchema(x) (strcmp((x)->base.name, "tmp") == 0) #define isDeclaredTable(x) ((x)->persistence==SQL_DECLARED_TABLE) diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3905,11 +3905,11 @@ conditional_table_dup(sql_trans *tr, int int p = (tr->parent == gtrans); /* persistent columns need to be dupped */ - if ((p && isGlobal(ot)) || + if ((p && ot->persistence != SQL_LOCAL_TEMP) || /* allways dup in recursive mode */ tr->parent != gtrans) return table_dup(tr, flags, ot, s); - else if (!isGlobal(ot)){/* is local temp, may need to be cleared */ + else if (ot->persistence == SQL_LOCAL_TEMP){/* is local temp, may need to be cleared */ if (ot->commit_action == CA_DELETE) { sql_trans_clear_table(tr, ot); } else if (ot->commit_action == CA_DROP) { @@ -4580,7 +4580,7 @@ validate_tables(sql_schema *s, sql_schem continue; ot = find_sql_table(os, t->base.name); - if (ot && isKindOfTable(ot) && isKindOfTable(t)) { + if (ot && isKindOfTable(ot) && isKindOfTable(t) && !isDeclaredTable(ot) && !isDeclaredTable(t)) { if ((t->base.wtime && (t->base.wtime < ot->base.rtime || t->base.wtime < ot->base.wtime)) || (t->base.rtime && (t->base.rtime < ot->base.wtime))) return 0; @@ -5011,7 +5011,7 @@ save_tables_snapshots(sql_schema *s) if (!t->base.wtime) continue; - if (isKindOfTable(t)) { + if (isKindOfTable(t) && !isDeclaredTable(t)) { if (store_funcs.save_snapshot(t) != LOG_OK) return SQL_ERR; } diff --git a/sql/test/scoping/Tests/scoping01.sql b/sql/test/scoping/Tests/scoping01.sql --- a/sql/test/scoping/Tests/scoping01.sql +++ b/sql/test/scoping/Tests/scoping01.sql @@ -1,7 +1,8 @@ ---TODO rename schemas with variables and transaction management +--TODO transaction management -- Test variables with different schemas -- Update rel_read and RAstatemet -- Check what must be persisted +-- upgrade drop dt_schema declare i integer; set i = 1234; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list