Changeset: 301a8a02a89b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=301a8a02a89b
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_mvc.c
sql/server/sql_mvc.h
sql/server/sql_privileges.c
sql/server/sql_semantic.c
sql/server/sql_semantic.h
Branch: scoping2
Log Message:
Starting to implement search path. This is not functional yet, but there are
some steps done.
diffs (truncated from 858 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
@@ -454,13 +454,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 = cur_schema(sql);
- sql_table *t;
+ sql_schema *s = NULL;
+ sql_table *t = NULL;
- if (sname && !(s = mvc_bind_schema(sql, sname)))
- return sql_error(sql, 02, SQLSTATE(3F000) "RETURN: no
such schema '%s'", sname);
- if (!(t = find_table_on_scope(sql, &s, sname, tname)))
- return sql_error(sql, 02, SQLSTATE(42S02) "RETURN: no
such table '%s'", tname);
+ if (!(t = find_table_on_scope(sql, &s, sname, tname, "RETURN")))
+ return NULL;
if (isDeclaredTable(t)) {
rel = rel_table(sql, ddl_create_table, s->base.name, t,
SQL_DECLARED_TABLE);
@@ -1238,7 +1236,7 @@ create_trigger(sql_query *query, dlist *
const char *triggername = qname_schema_object(qname);
const char *sname = qname_schema(tqname);
const char *tname = qname_schema_object(tqname);
- sql_schema *ss = cur_schema(sql), *old_schema = cur_schema(sql);
+ sql_schema *ss = NULL, *old_schema = cur_schema(sql);
sql_table *t = NULL;
sql_trigger *st = NULL;
int instantiate = (sql->emode == m_instantiate);
@@ -1251,9 +1249,6 @@ create_trigger(sql_query *query, dlist *
dlist *stmts = triggered_action->h->next->next->data.lval;
symbol *condition = triggered_action->h->next->data.sym;
- if (sname && !(ss = mvc_bind_schema(sql, sname)))
- return sql_error(sql, 02, SQLSTATE(3F000) "%s TRIGGER: no such
schema '%s'", base, sname);
-
if (opt_ref) {
dnode *dl = opt_ref->h;
for ( ; dl; dl = dl->next) {
@@ -1268,14 +1263,16 @@ create_trigger(sql_query *query, dlist *
}
}
- if (create && !mvc_schema_privs(sql, ss))
- return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: access
denied for %s to schema '%s'", base, get_string_global_var(sql,
"current_user"), ss->base.name);
if (create) {
- if (!(t = find_table_on_scope(sql, &ss, sname, tname)))
- return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER:
unknown table '%s'", base, tname);
+ if (!(t = find_table_on_scope(sql, &ss, sname, tname, base)))
+ return NULL;
+ if (!mvc_schema_privs(sql, ss))
+ return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER:
access denied for %s to schema '%s'", base, get_string_global_var(sql,
"current_user"), ss->base.name);
+ if (isView(t))
+ return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER:
cannot create trigger on view '%s'", base, tname);
+ } else {
+ ss = cur_schema(sql);
}
- if (create && isView(t))
- return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: cannot
create trigger on view '%s'", base, tname);
if (triggerschema && strcmp(triggerschema, ss->base.name) != 0)
return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: trigger
and respective table must belong to the same schema", base);
if (create && (st = mvc_bind_trigger(sql, ss, triggername)) != NULL) {
@@ -1504,19 +1501,17 @@ static sql_rel*
create_table_from_loader(sql_query *query, dlist *qname, symbol *fcall)
{
mvc *sql = query->sql;
- sql_schema *s = cur_schema(sql);
+ sql_schema *s = NULL;
char *sname = qname_schema(qname);
char *tname = qname_schema_object(qname);
sql_subfunc *loader = NULL;
sql_rel *rel = NULL;
sql_table *t = NULL;
- if (sname && !(s = mvc_bind_schema(sql, sname)))
- return sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE FROM
LOADER: no such schema '%s'", sname);
+ if ((t = find_table_on_scope(sql, &s, sname, tname, "CREATE TABLE FROM
LOADER")))
+ return sql_error(sql, 02, SQLSTATE(42S01) "CREATE TABLE FROM
LOADER: name '%s' already in use", tname);
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);
- if ((t = find_table_on_scope(sql, &s, sname, tname)))
- return sql_error(sql, 02, SQLSTATE(42S01) "CREATE TABLE FROM
LOADER: name '%s' already in use", tname);
rel = rel_loader_function(query, fcall, new_exp_list(sql->sa), &loader);
if (!rel || !loader)
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
@@ -514,16 +514,11 @@ table_foreign_key(mvc *sql, char *name,
sql_schema *fs = ss;
sql_table *ft = NULL;
- if (rsname && !(fs = mvc_bind_schema(sql, rsname))) {
- (void) sql_error(sql, 02, SQLSTATE(3F000) "CONSTRAINT FOREIGN
KEY: no such schema '%s'", rsname);
- return SQL_ERR;
- }
- ft = find_table_on_scope(sql, &fs, rsname, rtname);
+ ft = find_table_on_scope(sql, &fs, rsname, rtname, "CONSTRAINT FOREIGN
KEY");
/* self referenced table */
if (!ft && t->s == fs && strcmp(t->base.name, rtname) == 0)
ft = t;
if (!ft) {
- sql_error(sql, 02, SQLSTATE(42S02) "CONSTRAINT FOREIGN KEY: no
such table '%s'\n", rtname);
return SQL_ERR;
} else if (list_find_name(t->keys.set, name)) {
sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT FOREIGN KEY: key
'%s' already exists", name);
@@ -856,14 +851,8 @@ table_element(sql_query *query, symbol *
sql_table *ot = NULL;
node *n;
- if (sname && !(os = mvc_bind_schema(sql, sname))) {
- sql_error(sql, 02, SQLSTATE(3F000) "%s: no such schema
'%s'", action, sname);
+ if (!(ot = find_table_on_scope(sql, &os, sname, name, action)))
return SQL_ERR;
- }
- if (!(ot = find_table_on_scope(sql, &os, sname, name))) {
- sql_error(sql, 02, SQLSTATE(3F000) "%s: no such table
'%s'", action, name);
- return SQL_ERR;
- }
for (n = ot->columns.set->h; n; n = n->next) {
sql_column *oc = n->data;
@@ -1127,30 +1116,28 @@ rel_create_view(sql_query *query, sql_sc
mvc *sql = query->sql;
const char *name = qname_schema_object(qname);
const char *sname = qname_schema(qname);
- sql_schema *s = cur_schema(sql);
+ sql_schema *s = NULL;
sql_table *t = NULL;
int instantiate = (sql->emode == m_instantiate || !persistent);
int deps = (sql->emode == m_deps);
int create = (!instantiate && !deps);
- const char *base = replace ? "CREATE OR REPLACE" : "CREATE";
+ const char *base = replace ? "CREATE OR REPLACE VIEW" : "CREATE VIEW";
(void) ss;
(void) check; /* Stefan: unused!? */
- if (sname && !(s = mvc_bind_schema(sql, sname)))
- return sql_error(sql, 02, SQLSTATE(3F000) "CREATE VIEW: no such
schema '%s'", sname);
- if (create && (!mvc_schema_privs(sql, s) && !(isTempSchema(s) &&
persistent == SQL_LOCAL_TEMP)))
- return sql_error(sql, 02, SQLSTATE(42000) "%s VIEW: access
denied for %s to schema '%s'", base, get_string_global_var(sql,
"current_user"), s->base.name);
-
+ t = find_table_on_scope(sql, &s, sname, name, base);
if (create) {
- if ((t = find_table_on_scope(sql, &s, sname, name))) {
+ if (t) {
+ if ((!mvc_schema_privs(sql, s) && !(isTempSchema(s) &&
persistent == SQL_LOCAL_TEMP)))
+ return sql_error(sql, 02, SQLSTATE(42000) "%s:
access denied for %s to schema '%s'", base, get_string_global_var(sql,
"current_user"), s->base.name);
if (replace) {
if (!isView(t)) {
- return sql_error(sql, 02,
SQLSTATE(42000) "%s VIEW: unable to drop view '%s': is a table", base, name);
+ return sql_error(sql, 02,
SQLSTATE(42000) "%s: unable to drop view '%s': is a table", base, name);
} else if (t->system) {
- return sql_error(sql, 02,
SQLSTATE(42000) "%s VIEW: cannot replace system view '%s'", base, name);
+ return sql_error(sql, 02,
SQLSTATE(42000) "%s: cannot replace system view '%s'", base, name);
} else if (mvc_check_dependency(sql,
t->base.id, VIEW_DEPENDENCY, NULL)) {
- return sql_error(sql, 02,
SQLSTATE(42000) "%s VIEW: cannot replace view '%s', there are database objects
which depend on it", base, t->base.name);
+ return sql_error(sql, 02,
SQLSTATE(42000) "%s: cannot replace view '%s', there are database objects which
depend on it", base, t->base.name);
} else {
str output;
if ((output = mvc_drop_table(sql, s, t,
0)) != MAL_SUCCEED) {
@@ -1160,10 +1147,12 @@ rel_create_view(sql_query *query, sql_sc
}
}
} else {
- return sql_error(sql, 02, SQLSTATE(42S01) "%s
VIEW: name '%s' already in use", base, name);
+ return sql_error(sql, 02, SQLSTATE(42S01) "%s:
name '%s' already in use", base, name);
}
}
- }
+ } else if (!t)
+ return NULL;
+
if (ast) {
sql_rel *sq = NULL;
char *q = QUERY(sql->scanner);
@@ -1172,7 +1161,7 @@ rel_create_view(sql_query *query, sql_sc
SelectNode *sn = (SelectNode *) ast;
if (sn->limit || sn->sample)
- return sql_error(sql, 01, SQLSTATE(42000) "%s
VIEW: %s not supported", base, sn->limit ? "LIMIT" : "SAMPLE");
+ return sql_error(sql, 01, SQLSTATE(42000) "%s:
%s not supported", base, sn->limit ? "LIMIT" : "SAMPLE");
}
sq = schema_selects(query, s, ast);
@@ -1203,7 +1192,8 @@ rel_create_view(sql_query *query, sql_sc
}
return rel_table(sql, ddl_create_view, s->base.name, t,
SQL_PERSIST);
}
- t = find_table_on_scope(sql, &s, sname, name);
+ s = NULL;
+ t = find_table_on_scope(sql, &s, sname, name, base);
if (!persistent && column_spec)
sq = view_rename_columns(sql, name, sq, column_spec);
if (sq && sq->op == op_project && sq->l && sq->exps && sq->card
== CARD_AGGR) {
@@ -1395,11 +1385,10 @@ rel_create_schema(sql_query *query, dlis
}
static str
-get_schema_name(mvc *sql, char *sname, char *tname)
+get_schema_name(mvc *sql, sql_schema *s, char *sname, char *tname, const char
*err)
{
if (!sname) {
- sql_schema *s = cur_schema(sql);
- sql_table *t = find_table_on_scope(sql, &s, sname, tname);
+ sql_table *t = find_table_on_scope(sql, &s, sname, tname, err);
if (t && t->s)
return t->s->base.name;
@@ -1414,24 +1403,18 @@ 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 = cur_schema(sql);
+ sql_schema *s = NULL;
sql_table *t = NULL, *nt = NULL;
sql_rel *res = NULL, *r;
sql_exp **updates, *e;
- if (sname && !(s = mvc_bind_schema(sql, sname))) {
+ if (!(t = find_table_on_scope(sql, &s, sname, tname, "ALTER TABLE"))) {
if (if_exists)
return rel_psm_block(sql->sa, new_exp_list(sql->sa));
- return sql_error(sql, 02, SQLSTATE(3F000) "ALTER TABLE: no such
schema '%s'", sname);
+ 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 (!(t = find_table_on_scope(sql, &s, sname, tname))) {
- if (if_exists)
- return rel_psm_block(sql->sa, new_exp_list(sql->sa));
- return sql_error(sql, 02, SQLSTATE(42S02) "ALTER TABLE: no such
table '%s' in schema '%s'", tname, 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))
@@ -1443,19 +1426,12 @@ sql_alter_table(sql_query *query, dlist
if ((te->token == SQL_TABLE || te->token == SQL_DROP_TABLE)) {
dlist *nqname = te->data.lval->h->data.lval;
- sql_schema *spt = NULL;
+ sql_schema *spt = s;
sql_table *pt = NULL;
char *nsname = qname_schema(nqname);
char *ntname = qname_schema_object(nqname);
- /* partition sname */
- if (!nsname)
- nsname = sname;
-
- if (nsname && !(spt = mvc_bind_schema(sql, nsname)))
- return sql_error(sql, 02, SQLSTATE(3F000) "ALTER TABLE:
no such schema '%s'", sname);
-
- if (!(pt = find_table_on_scope(sql, &spt, nsname, ntname)))
+ if (!(pt = find_table_on_scope(sql, &spt, nsname, ntname,
"ALTER TABLE")))
return sql_error(sql, 02, SQLSTATE(42S02) "ALTER TABLE:
no such table '%s' in schema '%s'", ntname, spt->base.name);
if (isView(pt))
return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE:
can't add/drop a view into a %s",
@@ -1553,7 +1529,7 @@ sql_alter_table(sql_query *query, dlist
char *kname = l->h->data.sval;
int drop_action = l->h->next->data.i_val;
- sname = get_schema_name(sql, sname, tname);
+ sname = get_schema_name(sql, s, sname, tname, "DROP
CONSTRAINT");
return rel_drop(sql->sa, ddl_drop_constraint, sname, kname,
drop_action, 0);
}
@@ -1859,7 +1835,6 @@ rel_grant_func(mvc *sql, sql_schema *cur
return res;
}
-
static sql_rel *
rel_grant_privs(mvc *sql, sql_schema *cur, dlist *privs, dlist *grantees, int
grant, int grantor)
{
@@ -1871,12 +1846,10 @@ rel_grant_privs(mvc *sql, sql_schema *cu
dlist *qname = obj->data.lval;
char *sname = qname_schema(qname);
char *tname = qname_schema_object(qname);
- sql_schema *s = cur;
+ sql_schema *s = NULL;
sql_table *t = NULL;
- if (sname && !(s = mvc_bind_schema(sql, sname)))
- return sql_error(sql, 02, SQLSTATE(3F000) "GRANT: no
such schema '%s'", sname);
- if ((t = find_table_on_scope(sql, &s, sname, tname)))
+ if ((t = find_table_on_scope(sql, &s, sname, tname, "GRANT")))
token = SQL_TABLE;
}
@@ -2053,12 +2026,10 @@ rel_revoke_privs(mvc *sql, sql_schema *c
dlist *qname = obj->data.lval;
char *sname = qname_schema(qname);
char *tname = qname_schema_object(qname);
- sql_schema *s = cur;
+ sql_schema *s = NULL;
sql_table *t = NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list