Changeset: 45ec1b5189dc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=45ec1b5189dc
Modified Files:
        sql/server/rel_psm.c
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/server/sql_privileges.c
        sql/server/sql_semantic.c
        sql/server/sql_semantic.h
        sql/test/BugTracker-2015/Tests/adddrop_unknown_table.Bug-3718.stable.err
        sql/test/mergetables/Tests/alter.stable.err
        sql/test/mergetables/Tests/mergedropcrash.stable.err
Branch: scoping2
Log Message:

Updated table/view scoping function. Use the table's schema to find the output 
schema. Approved outputs


diffs (truncated from 871 to 300 lines):

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
@@ -424,14 +424,11 @@ rel_psm_return( sql_query *query, sql_su
                dlist *l = return_sym->data.lval;
                const char *sname = qname_schema(l);
                const char *tname = qname_schema_object(l);
-               sql_schema *s = NULL;
                sql_table *t = NULL;
 
-               if (!(t = find_table_or_view_on_scope(sql, &s, sname, tname, 
"RETURN", false)))
+               if (!(t = find_table_or_view_on_scope(sql, NULL, sname, tname, 
"RETURN", false)))
                        return NULL;
-
                if (isDeclaredTable(t)) {
-                       assert(!s);
                        rel = rel_table(sql, ddl_create_table, 
cur_schema(sql)->base.name, t, SQL_DECLARED_TABLE);
                } else {
                        rel = rel_basetable(sql, t, t->base.name);
@@ -1417,10 +1414,13 @@ psm_analyze(sql_query *query, char *anal
        append(tl, exp_subtype(sample_exp));
 
        if (sname && tname) {
-               sql_schema *s = NULL;
-               if (!find_table_or_view_on_scope(sql, &s, sname, tname, 
"ANALYZE", false))
+               sql_table *t = NULL;
+
+               if (!(t = find_table_or_view_on_scope(sql, NULL, sname, tname, 
"ANALYZE", false)))
                        return NULL;
-               sname = s->base.name;
+               if (isDeclaredTable(t))
+                       return sql_error(sql, 02, SQLSTATE(42000) "Cannot 
analyze a declared table");
+               sname = t->s->base.name;
        }
        /* call analyze( [schema, [ table ]], opt_sample_size, opt_minmax ) */
        if (sname) {
@@ -1444,13 +1444,11 @@ psm_analyze(sql_query *query, char *anal
                call = exp_op(sql->sa, exps, f);
                append(analyze_calls, call);
        } else {
-               dnode *n;
-
                if (!sname || !tname)
                        return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) 
"Analyze schema or table name missing");
                if (!(f = sql_bind_func_(sql, "sys", analyzeType, tl, F_PROC)))
                        return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) 
"Analyze procedure missing");
-               for( n = columns->h; n; n = n->next) {
+               for(dnode *n = columns->h; n; n = n->next) {
                        const char *cname = n->data.sval;
                        list *nexps = list_dup(exps, NULL);
                        sql_exp *cname_exp = exp_atom_clob(sql->sa, cname);
@@ -1468,17 +1466,17 @@ static sql_rel*
 create_table_from_loader(sql_query *query, dlist *qname, symbol *fcall)
 {
        mvc *sql = query->sql;
-       sql_schema *s = NULL;
+       sql_schema *s = cur_schema(sql);
        char *sname = qname_schema(qname);
        char *tname = qname_schema_object(qname);
        sql_subfunc *loader = NULL;
        sql_rel *rel = NULL;
        sql_table *t = NULL;
 
-       if ((t = find_table_or_view_on_scope(sql, &s, sname, tname, "CREATE 
TABLE FROM LOADER", false)))
+       if (sname && !(s = mvc_bind_schema(sql, sname)))
+               return sql_error(sql, ERR_NOTFOUND, SQLSTATE(3F000) "CREATE 
TABLE FROM LOADER: no such schema '%s'", sname);
+       if ((t = mvc_bind_table(sql, s, tname)))
                return sql_error(sql, 02, SQLSTATE(42S01) "CREATE TABLE FROM 
LOADER: name '%s' already in use", tname);
-       sql->errstr[0] = '\0'; /* reset table not found error */
-       sql->session->status = 0;
        if (!mvc_schema_privs(sql, s))
                return sql_error(sql, 02, SQLSTATE(42000) "CREATE TABLE FROM 
LOADER: insufficient privileges for user '%s' in schema '%s'", 
get_string_global_var(sql, "current_user"), s->base.name);
 
@@ -1486,7 +1484,7 @@ create_table_from_loader(sql_query *quer
        if (!rel || !loader)
                return NULL;
 
-       loader->sname = sname ? sa_strdup(sql->sa, sname) : NULL;
+       loader->sname = s ? sa_strdup(sql->sa, s->base.name) : NULL;
        loader->tname = tname ? sa_strdup(sql->sa, tname) : NULL;
 
        return rel;
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
@@ -324,7 +324,6 @@ column_constraint_type(mvc *sql, const c
                char *rsname = qname_schema(n->data.lval);
                char *rtname = qname_schema_object(n->data.lval);
                int ref_actions = n->next->next->next->data.i_val;
-               sql_schema *rs = ss;
                sql_table *rt;
                sql_fkey *fk;
                list *cols;
@@ -332,9 +331,9 @@ column_constraint_type(mvc *sql, const c
                sql_kc *kc;
 
                assert(n->next->next->next->type == type_int);
-               rt = find_table_or_view_on_scope(sql, &rs, rsname, rtname, 
"CONSTRAINT FOREIGN KEY", isView(t));
+               rt = find_table_or_view_on_scope(sql, ss, rsname, rtname, 
"CONSTRAINT FOREIGN KEY", isView(t));
                /* self referenced table */
-               if (!rt && t->s == rs && strcmp(t->base.name, rtname) == 0) {
+               if (!rt && t->s == ss && strcmp(t->base.name, rtname) == 0) {
                        sql->errstr[0] = '\0'; /* reset table not found error */
                        sql->session->status = 0;
                        rt = t;
@@ -486,12 +485,11 @@ table_foreign_key(mvc *sql, char *name, 
        dnode *n = s->data.lval->h;
        char *rsname = qname_schema(n->data.lval);
        char *rtname = qname_schema_object(n->data.lval);
-       sql_schema *fs = ss;
        sql_table *ft = NULL;
 
-       ft = find_table_or_view_on_scope(sql, &fs, rsname, rtname, "CONSTRAINT 
FOREIGN KEY", isView(t));
+       ft = find_table_or_view_on_scope(sql, ss, rsname, rtname, "CONSTRAINT 
FOREIGN KEY", isView(t));
        /* self referenced table */
-       if (!ft && t->s == fs && strcmp(t->base.name, rtname) == 0) {
+       if (!ft && t->s == ss && strcmp(t->base.name, rtname) == 0) {
                sql->errstr[0] = '\0'; /* reset table not found error */
                sql->session->status = 0;
                ft = t;
@@ -819,13 +817,11 @@ table_element(sql_query *query, symbol *
        {
                char *sname = qname_schema(s->data.lval);
                char *name = qname_schema_object(s->data.lval);
-               sql_schema *os = ss;
                sql_table *ot = NULL;
-               node *n;
 
-               if (!(ot = find_table_or_view_on_scope(sql, &os, sname, name, 
action, isView(t))))
+               if (!(ot = find_table_or_view_on_scope(sql, ss, sname, name, 
action, isView(t))))
                        return SQL_ERR;
-               for (n = ot->columns.set->h; n; n = n->next) {
+               for (node *n = ot->columns.set->h; n; n = n->next) {
                        sql_column *oc = n->data;
 
                        if (!isView(t) && oc->base.name && oc->base.name[0] == 
'%') {
@@ -1346,10 +1342,9 @@ sql_drop_table(sql_query *query, dlist *
        mvc *sql = query->sql;
        char *sname = qname_schema(qname);
        char *tname = qname_schema_object(qname);
-       sql_schema *s = NULL;
        sql_table *t = NULL;
 
-       if (!(t = find_table_or_view_on_scope(sql, &s, sname, tname, "DROP 
TABLE", false))) {
+       if (!(t = find_table_or_view_on_scope(sql, NULL, sname, tname, "DROP 
TABLE", false))) {
                if (if_exists) {
                        sql->errstr[0] = '\0'; /* reset table not found error */
                        sql->session->status = 0;
@@ -1358,7 +1353,7 @@ sql_drop_table(sql_query *query, dlist *
                return NULL;
        }
 
-       return rel_drop(sql->sa, ddl_drop_table, s->base.name, tname, nr, 
if_exists);
+       return rel_drop(sql->sa, ddl_drop_table, t->s->base.name, tname, nr, 
if_exists);
 }
 
 static sql_rel *
@@ -1367,10 +1362,9 @@ sql_drop_view(sql_query *query, dlist *q
        mvc *sql = query->sql;
        char *sname = qname_schema(qname);
        char *tname = qname_schema_object(qname);
-       sql_schema *s = NULL;
        sql_table *t = NULL;
 
-       if (!(t = find_table_or_view_on_scope(sql, &s, sname, tname, "DROP 
VIEW", true))) {
+       if (!(t = find_table_or_view_on_scope(sql, NULL, sname, tname, "DROP 
VIEW", true))) {
                if (if_exists) {
                        sql->errstr[0] = '\0'; /* reset table not found error */
                        sql->session->status = 0;
@@ -1379,7 +1373,7 @@ sql_drop_view(sql_query *query, dlist *q
                return NULL;
        }
 
-       return rel_drop(sql->sa, ddl_drop_view, s->base.name, tname, nr, 
if_exists);
+       return rel_drop(sql->sa, ddl_drop_view, t->s->base.name, tname, nr, 
if_exists);
 }
 
 static sql_rel *
@@ -1388,12 +1382,11 @@ sql_alter_table(sql_query *query, dlist 
        mvc *sql = query->sql;
        char *sname = qname_schema(qname);
        char *tname = qname_schema_object(qname);
-       sql_schema *s = NULL;
        sql_table *t = NULL, *nt = NULL;
        sql_rel *res = NULL, *r;
        sql_exp **updates, *e;
 
-       if (!(t = find_table_or_view_on_scope(sql, &s, sname, tname, "ALTER 
TABLE", false))) {
+       if (!(t = find_table_or_view_on_scope(sql, NULL, sname, tname, "ALTER 
TABLE", false))) {
                if (if_exists) {
                        sql->errstr[0] = '\0'; /* reset table not found error */
                        sql->session->status = 0;
@@ -1401,26 +1394,25 @@ sql_alter_table(sql_query *query, dlist 
                }
                return NULL;
        }
-       if (!mvc_schema_privs(sql, s))
-               return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: access 
denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), 
s->base.name);
        if (isDeclaredTable(t))
                return sql_error(sql, 02, SQLSTATE(42S02) "ALTER TABLE: can't 
alter declared table '%s'", tname);
        if (isTempSchema(t->s))
                return sql_error(sql, 02, SQLSTATE(42S02) "ALTER TABLE: can't 
alter temporary table '%s'", tname);
+       if (!mvc_schema_privs(sql, t->s))
+               return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: access 
denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), 
t->s->base.name);
 
        assert(te);
        if (t->persistence != SQL_DECLARED_TABLE)
-               sname = s->base.name;
+               sname = t->s->base.name;
 
        if ((te->token == SQL_TABLE || te->token == SQL_DROP_TABLE)) {
                dlist *nqname = te->data.lval->h->data.lval;
-               sql_schema *spt = s;
                sql_table *pt = NULL;
                char *nsname = qname_schema(nqname);
                char *ntname = qname_schema_object(nqname);
 
-               if (!(pt = find_table_or_view_on_scope(sql, &spt, nsname, 
ntname, "ALTER TABLE", false)))
-                       return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42S02) 
"ALTER TABLE: no such table '%s' in schema '%s'", ntname, spt->base.name);
+               if (!(pt = find_table_or_view_on_scope(sql, t->s, nsname, 
ntname, "ALTER TABLE", false)))
+                       return NULL;
                if (isView(pt))
                        return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
can't add/drop a view into a %s",
                                                                
TABLE_TYPE_DESCRIPTION(t->type, t->properties));
@@ -1430,7 +1422,7 @@ sql_alter_table(sql_query *query, dlist 
                if (isTempSchema(pt->s))
                        return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
can't add/drop a temporary table into a %s",
                                                                
TABLE_TYPE_DESCRIPTION(t->type, t->properties));
-               nsname = spt->base.name;
+               nsname = pt->s->base.name;
                if (strcmp(sname, nsname) != 0)
                        return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: 
all children tables of '%s.%s' must be "
                                                                "part of schema 
'%s'", sname, tname, sname);
@@ -1450,7 +1442,7 @@ sql_alter_table(sql_query *query, dlist 
                        }
                        if ((isMergeTable(pt) || isReplicaTable(pt)) && 
list_empty(pt->members.set))
                                return sql_error(sql, 02, SQLSTATE(42000) "The 
%s %s.%s should have at least one table associated",
-                                                                
TABLE_TYPE_DESCRIPTION(pt->type, pt->properties), spt->base.name, 
pt->base.name);
+                                                                
TABLE_TYPE_DESCRIPTION(pt->type, pt->properties), pt->s->base.name, 
pt->base.name);
 
                        if (extra->token == SQL_MERGE_PARTITION) { /* partition 
to hold null values only */
                                dlist* ll = extra->data.lval;
@@ -1510,7 +1502,7 @@ sql_alter_table(sql_query *query, dlist 
        }
 
        nt = dup_sql_table(sql->sa, t);
-       if (!nt || (table_element(query, te, s, nt, 1, t->persistence == 
SQL_DECLARED_TABLE, "ALTER TABLE") == SQL_ERR))
+       if (!nt || (table_element(query, te, t->s, nt, 1, t->persistence == 
SQL_DECLARED_TABLE, "ALTER TABLE") == SQL_ERR))
                return NULL;
 
        if (te->token == SQL_DROP_CONSTRAINT) {
@@ -1709,16 +1701,15 @@ rel_grant_global(mvc *sql, sql_schema *c
 static sql_rel *
 rel_grant_table(mvc *sql, dlist *privs, dlist *qname, dlist *grantees, int 
grant, int grantor)
 {
-       sql_schema *s = NULL;
        sql_rel *res = NULL;
-       dnode *gn;
        int all = PRIV_SELECT | PRIV_UPDATE | PRIV_INSERT | PRIV_DELETE | 
PRIV_TRUNCATE;
        char *sname = qname_schema(qname);
        char *tname = qname_schema_object(qname);
+       sql_table *t = NULL;
 
-       if (!find_table_or_view_on_scope(sql, &s, sname, tname, "GRANT", false))
+       if (!(t = find_table_or_view_on_scope(sql, NULL, sname, tname, "GRANT", 
false)))
                return NULL;
-       for (gn = grantees->h; gn; gn = gn->next) {
+       for (dnode *gn = grantees->h; gn; gn = gn->next) {
                dnode *opn;
                char *grantee = gn->data.sval;
 
@@ -1726,7 +1717,7 @@ rel_grant_table(mvc *sql, dlist *privs, 
                        grantee = "public";
 
                if (!privs) {
-                       if ((res = rel_list(sql->sa, res, rel_priv(sql->sa, 
s->base.name, tname, grantee, all, NULL, grant, grantor, ddl_grant))) == NULL) {
+                       if ((res = rel_list(sql->sa, res, rel_priv(sql->sa, 
t->s->base.name, tname, grantee, all, NULL, grant, grantor, ddl_grant))) == 
NULL) {
                                rel_destroy(res);
                                return NULL;
                        }
@@ -1762,12 +1753,12 @@ rel_grant_table(mvc *sql, dlist *privs, 
 
                                for (cn = op->data.lval->h; cn; cn = cn->next) {
                                        char *cname = cn->data.sval;
-                                       if ((res = rel_list(sql->sa, res, 
rel_priv(sql->sa, s->base.name, tname, grantee, priv, cname, grant, grantor, 
ddl_grant))) == NULL) {
+                                       if ((res = rel_list(sql->sa, res, 
rel_priv(sql->sa, t->s->base.name, tname, grantee, priv, cname, grant, grantor, 
ddl_grant))) == NULL) {
                                                rel_destroy(res);
                                                return NULL;
                                        }
                                }
-                       } else if ((res = rel_list(sql->sa, res, 
rel_priv(sql->sa, s->base.name, tname, grantee, priv, NULL, grant, grantor, 
ddl_grant))) == NULL) {
+                       } else if ((res = rel_list(sql->sa, res, 
rel_priv(sql->sa, t->s->base.name, tname, grantee, priv, NULL, grant, grantor, 
ddl_grant))) == NULL) {
                                rel_destroy(res);
                                return NULL;
                        }
@@ -1874,16 +1865,15 @@ rel_revoke_global(mvc *sql, sql_schema *
 static sql_rel *
 rel_revoke_table(mvc *sql, dlist *privs, dlist *qname, dlist *grantees, int 
grant, int grantor)
 {
-       sql_schema *s = NULL;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to