Changeset: f13608dcf4f5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f13608dcf4f5 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 Branch: scoping2 Log Message:
Cleaned some error messages and made server run diffs (truncated from 591 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 @@ -457,7 +457,7 @@ rel_psm_return( sql_query *query, sql_su sql_schema *s = NULL; sql_table *t = NULL; - if (!(t = find_table_on_scope(sql, &s, sname, tname, "RETURN"))) + if (!(t = find_table_or_view_on_scope(sql, &s, sname, tname, "RETURN", false))) return NULL; if (isDeclaredTable(t)) { @@ -1243,7 +1243,7 @@ create_trigger(sql_query *query, dlist * int create = (!instantiate && sql->emode != m_deps), event, orientation; list *sq = NULL; sql_rel *r = NULL; - char *q, *base = replace ? "CREATE OR REPLACE" : "CREATE"; + char *q, *base = replace ? "CREATE OR REPLACE TRIGGER" : "CREATE TRIGGER"; dlist *columns = trigger_event->data.lval; const char *old_name = NULL, *new_name = NULL; dlist *stmts = triggered_action->h->next->next->data.lval; @@ -1264,23 +1264,23 @@ create_trigger(sql_query *query, dlist * } if (create) { - if (!(t = find_table_on_scope(sql, &ss, sname, tname, base))) + if (!(t = find_table_or_view_on_scope(sql, &ss, sname, tname, base, false))) 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); + return sql_error(sql, 02, SQLSTATE(42000) "%s: 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); + return sql_error(sql, 02, SQLSTATE(42000) "%s: cannot create trigger on view '%s'", base, tname); } else { ss = cur_schema(sql); } 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); + return sql_error(sql, 02, SQLSTATE(42000) "%s: trigger and respective table must belong to the same schema", base); if (create && (st = mvc_bind_trigger(sql, ss, triggername)) != NULL) { if (replace) { if (mvc_drop_trigger(sql, ss, st)) - return sql_error(sql, 02, SQLSTATE(HY013) "%s TRIGGER: %s", base, MAL_MALLOC_FAIL); + return sql_error(sql, 02, SQLSTATE(HY013) "%s: %s", base, MAL_MALLOC_FAIL); } else { - return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: name '%s' already in use", base, triggername); + return sql_error(sql, 02, SQLSTATE(42000) "%s: name '%s' already in use", base, triggername); } } @@ -1288,30 +1288,30 @@ create_trigger(sql_query *query, dlist * switch (trigger_event->token) { case SQL_INSERT: { if (old_name) - return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: old name not allowed at insert events", base); + return sql_error(sql, 02, SQLSTATE(42000) "%s: old name not allowed at insert events", base); event = 0; } break; case SQL_DELETE: { if (new_name) - return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: new name not allowed at delete events", base); + return sql_error(sql, 02, SQLSTATE(42000) "%s: new name not allowed at delete events", base); event = 1; } break; case SQL_TRUNCATE: { if (new_name) - return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: new name not allowed at truncate events", base); + return sql_error(sql, 02, SQLSTATE(42000) "%s: new name not allowed at truncate events", base); event = 3; } break; case SQL_UPDATE: { if (old_name && new_name && !strcmp(old_name, new_name)) - return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: old and new names cannot be the same", base); + return sql_error(sql, 02, SQLSTATE(42000) "%s: old and new names cannot be the same", base); if (!old_name && new_name && !strcmp("old", new_name)) - return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: old and new names cannot be the same", base); + return sql_error(sql, 02, SQLSTATE(42000) "%s: old and new names cannot be the same", base); if (!new_name && old_name && !strcmp("new", old_name)) - return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: old and new names cannot be the same", base); + return sql_error(sql, 02, SQLSTATE(42000) "%s: old and new names cannot be the same", base); event = 2; } break; default: - return sql_error(sql, 02, SQLSTATE(42000) "%s TRIGGER: invalid event: %s", base, token2string(trigger_event->token)); + return sql_error(sql, 02, SQLSTATE(42000) "%s: invalid event: %s", base, token2string(trigger_event->token)); } assert(triggered_action->h->type == type_int); @@ -1508,8 +1508,10 @@ create_table_from_loader(sql_query *quer sql_rel *rel = NULL; sql_table *t = NULL; - if ((t = find_table_on_scope(sql, &s, sname, tname, "CREATE TABLE FROM LOADER"))) + if ((t = find_table_or_view_on_scope(sql, &s, sname, tname, "CREATE TABLE FROM LOADER", false))) 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); 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,10 +514,13 @@ table_foreign_key(mvc *sql, char *name, sql_schema *fs = ss; sql_table *ft = NULL; - ft = find_table_on_scope(sql, &fs, rsname, rtname, "CONSTRAINT FOREIGN KEY"); + ft = find_table_or_view_on_scope(sql, &fs, 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 == fs && strcmp(t->base.name, rtname) == 0) { + sql->errstr[0] = '\0'; /* reset table not found error */ + sql->session->status = 0; ft = t; + } if (!ft) { return SQL_ERR; } else if (list_find_name(t->keys.set, name)) { @@ -851,7 +854,7 @@ table_element(sql_query *query, symbol * sql_table *ot = NULL; node *n; - if (!(ot = find_table_on_scope(sql, &os, sname, name, action))) + if (!(ot = find_table_or_view_on_scope(sql, &os, sname, name, action, isView(t)))) return SQL_ERR; for (n = ot->columns.set->h; n; n = n->next) { sql_column *oc = n->data; @@ -1111,26 +1114,27 @@ rel_create_table(sql_query *query, int t } static sql_rel * -rel_create_view(sql_query *query, sql_schema *ss, dlist *qname, dlist *column_spec, symbol *ast, int check, int persistent, int replace) +rel_create_view(sql_query *query, dlist *qname, dlist *column_spec, symbol *ast, int check, int persistent, int replace) { mvc *sql = query->sql; const char *name = qname_schema_object(qname); const char *sname = qname_schema(qname); - sql_schema *s = NULL; + sql_schema *s = cur_schema(sql); 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 VIEW" : "CREATE VIEW"; - (void) ss; (void) check; /* Stefan: unused!? */ - t = find_table_on_scope(sql, &s, sname, name, base); + 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); + if (create) { - 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 ((t = find_table_or_view_on_scope(sql, &s, sname, name, base, true))) { if (replace) { if (!isView(t)) { return sql_error(sql, 02, SQLSTATE(42000) "%s: unable to drop view '%s': is a table", base, name); @@ -1149,10 +1153,11 @@ rel_create_view(sql_query *query, sql_sc } else { return sql_error(sql, 02, SQLSTATE(42S01) "%s: name '%s' already in use", base, name); } + } else { + sql->errstr[0] = '\0'; /* reset table not found error */ + sql->session->status = 0; } - } else if (!t) - return NULL; - + } if (ast) { sql_rel *sq = NULL; char *q = QUERY(sql->scanner); @@ -1192,8 +1197,6 @@ rel_create_view(sql_query *query, sql_sc } return rel_table(sql, ddl_create_view, s->base.name, t, SQL_PERSIST); } - 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) { @@ -1384,17 +1387,46 @@ rel_create_schema(sql_query *query, dlis } } -static str -get_schema_name(mvc *sql, sql_schema *s, char *sname, char *tname, const char *err) +static sql_rel * +sql_drop_table(sql_query *query, dlist *qname, int nr, int if_exists) { - if (!sname) { - sql_table *t = find_table_on_scope(sql, &s, sname, tname, err); + 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 (if_exists) { + sql->errstr[0] = '\0'; /* reset table not found error */ + sql->session->status = 0; + return rel_psm_block(sql->sa, new_exp_list(sql->sa)); + } + return NULL; + } - if (t && t->s) - return t->s->base.name; - return s->base.name; + return rel_drop(sql->sa, ddl_drop_table, s->base.name, tname, nr, if_exists); +} + +static sql_rel * +sql_drop_view(sql_query *query, dlist *qname, int nr, int if_exists) +{ + 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 (if_exists) { + sql->errstr[0] = '\0'; /* reset table not found error */ + sql->session->status = 0; + return rel_psm_block(sql->sa, new_exp_list(sql->sa)); + } + return NULL; } - return sname; + + return rel_drop(sql->sa, ddl_drop_view, s->base.name, tname, nr, if_exists); } static sql_rel * @@ -1408,9 +1440,12 @@ sql_alter_table(sql_query *query, dlist sql_rel *res = NULL, *r; sql_exp **updates, *e; - if (!(t = find_table_on_scope(sql, &s, sname, tname, "ALTER TABLE"))) { - if (if_exists) + if (!(t = find_table_or_view_on_scope(sql, &s, sname, tname, "ALTER TABLE", false))) { + if (if_exists) { + sql->errstr[0] = '\0'; /* reset table not found error */ + sql->session->status = 0; return rel_psm_block(sql->sa, new_exp_list(sql->sa)); + } return NULL; } if (!mvc_schema_privs(sql, s)) @@ -1431,7 +1466,7 @@ sql_alter_table(sql_query *query, dlist char *nsname = qname_schema(nqname); char *ntname = qname_schema_object(nqname); - if (!(pt = find_table_on_scope(sql, &spt, nsname, ntname, "ALTER TABLE"))) + if (!(pt = find_table_or_view_on_scope(sql, &spt, nsname, ntname, "ALTER TABLE", false))) 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", @@ -1529,8 +1564,9 @@ 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, s, sname, tname, "DROP CONSTRAINT"); - return rel_drop(sql->sa, ddl_drop_constraint, sname, kname, drop_action, 0); + if (!(t = find_table_or_view_on_scope(sql, &s, sname, kname, "DROP CONSTRAINT", isView(t)))) + return NULL; + return rel_drop(sql->sa, ddl_drop_constraint, s->base.name, kname, drop_action, 0); } if (t->s && !nt->s) @@ -1849,8 +1885,10 @@ rel_grant_privs(mvc *sql, sql_schema *cu sql_schema *s = NULL; sql_table *t = NULL; - if ((t = find_table_on_scope(sql, &s, sname, tname, "GRANT"))) + if ((t = find_table_or_view_on_scope(sql, &s, sname, tname, "GRANT", false))) token = SQL_TABLE; + sql->errstr[0] = '\0'; /* reset table not found error */ + sql->session->status = 0; } switch (token) { @@ -2029,8 +2067,10 @@ rel_revoke_privs(mvc *sql, sql_schema *c sql_schema *s = NULL; sql_table *t = NULL; - if ((t = find_table_on_scope(sql, &s, sname, tname, "REVOKE"))) + if ((t = find_table_or_view_on_scope(sql, &s, sname, tname, "REVOKE", false))) token = SQL_TABLE; + sql->errstr[0] = '\0'; /* reset table not found error */ + sql->session->status = 0; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list