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

Reply via email to