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