Changeset: c9f6755cc596 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c9f6755cc596
Modified Files:
configure.ag
sql/backends/monet5/sql.mx
sql/include/sql_relation.h
sql/server/rel_bin.c
sql/server/rel_exp.c
sql/server/rel_schema.c
sql/server/rel_semantic.c
sql/server/rel_sequence.c
sql/server/sql_mvc.c
sql/server/sql_mvc.h
sql/server/sql_parser.y
sql/server/sql_privileges.c
sql/server/sql_privileges.h
sql/server/sql_schema.c
sql/server/sql_semantic.c
sql/server/sql_statement.c
sql/storage/sql_storage.h
sql/storage/store_connections.c
sql/test/BugDay_2005-10-06_2.9.3/Tests/index_management.SF-927326.stable.err
sql/test/BugTracker-2009/Tests/unique_constraint_on_char.SF-2873564.stable.err
sql/test/UserDump/Tests/create.stable.out
Branch: default
Log Message:
move the CREATE/ALTER/DROP USER and CREATE/DROP index and type
into the relational and mal layer
diffs (truncated from 1156 to 300 lines):
diff --git a/configure.ag b/configure.ag
--- a/configure.ag
+++ b/configure.ag
@@ -1008,7 +1008,7 @@
dnl (Mserver produces tons of incorrect BATpropcheck
warnings);
dnl hence, we omit -funroll-all-loops, here.
case "$gcc_ver" in
- 4.*) CFLAGS="$CFLAGS -ftree-vectorize";;
+ 4.*) CFLAGS="$CFLAGS -ftree-vectorize -march=atom";;
dnl "-ftree-vectorize" is only available with
newer versions of gcc, only;
dnl did not check the exact version, but 4.1 has
it, while 3.4.5 does not.
esac
@@ -1016,7 +1016,7 @@
x86_64-*-*|i*86-*-*)
CFLAGS="$CFLAGS -O6 -fomit-frame-pointer
-finline-functions -malign-loops=4 -malign-jumps=4 -malign-functions=4
-fexpensive-optimizations -funroll-all-loops -funroll-loops
-frerun-cse-after-loop -frerun-loop-opt"
case "$gcc_ver" in
- 4.*) CFLAGS="$CFLAGS -ftree-vectorize";;
+ 4.*) CFLAGS="$CFLAGS -ftree-vectorize -march=atom";;
dnl "-ftree-vectorize" is only available with
newer versions of gcc, only;
dnl did not check the exact version, but 4.1 has
it, while 3.4.5 does not.
esac
diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -66,10 +66,18 @@
address SQLcatalog
comment "a grant/revoke role statement";
+pattern
catalog(type:int,user:str,passwd:str,enc:int,schema:str,fullname:str):void
+address SQLcatalog
+comment "a user catalog statement";
+
pattern
catalog(type:int,tname:str,grantee:str,privs:int,cname:str,grant:int,grantor:int):void
address SQLcatalog
comment "a grant/revoke privileges statement";
+pattern catalog(type:int,iname:str,itype:int,sname:str,tname:str...):void
+address SQLcatalog
+comment "a create index catalog statement";
+
pattern eval(cmd:str):void
address SQLstatement
comment "Compile and execute a single sql statement";
@@ -1931,6 +1939,65 @@
}
static str
+create_index( mvc *sql, char *iname, int itype, char *sname, char *tname,
MalStkPtr stk, InstrPtr pci)
+{
+ sql_schema *s = NULL;
+ sql_table *t = NULL;
+ sql_idx *i = NULL;
+
+ if (!(s = mvc_bind_schema(sql, sname)))
+ return sql_message("CREATE INDEX: no such schema '%s'", sname);
+
+ i = mvc_bind_idx(sql, s, iname);
+ t = mvc_bind_table(sql, s, tname);
+ if (i) {
+ return sql_message("CREATE INDEX: name '%s' already in use",
iname);
+ } else if (!t) {
+ return sql_message("CREATE INDEX: no such table '%s'", tname);
+ } else if (isView(t)) {
+ return sql_message("CREATE INDEX: cannot create index on view
'%s'", tname);
+ } else {
+ int n;
+ sql_idx *i = mvc_create_idx(sql, t, iname, (idx_type) itype);
+
+ if (!i)
+ return sql_message("CREATE INDEX: failed to create
index '%s'", iname);
+
+ for (n=6; n<pci->argc; n++) {
+ char *cname = *(str*)getArgReference(stk, pci, n);
+ sql_column *c = mvc_bind_column(sql, t, cname);
+
+ if (!c) {
+ return sql_message("CREATE INDEX: no such
column '%s'", cname);
+ } else {
+ mvc_create_ic(sql, i, c);
+ mvc_create_dependency(sql, c->base.id,
i->base.id, INDEX_DEPENDENCY);
+ }
+ }
+ }
+ return NULL;
+}
+
+static str
+drop_index( mvc *sql, char *sname, char *iname)
+{
+ sql_schema *s = NULL;
+ sql_idx *i = NULL;
+
+ if (!(s=mvc_bind_schema(sql, sname)))
+ return sql_message("DROP INDEX: no such schema '%s'", sname);
+ i = mvc_bind_idx(sql, s, iname);
+ if (!i) {
+ return sql_message("DROP INDEX: no such index '%s'", iname);
+ } else if (!schema_privs(sql->role_id, s)) {
+ return sql_message("DROP INDEX: access denied for %s to schema
;'%s'", stack_get_string(sql, "current_user"), s->base.name);
+ } else {
+ mvc_drop_idx(sql, s, i);
+ }
+ return NULL;
+}
+
+static str
create_seq( mvc *sql, char *sname, sql_sequence *seq)
{
sql_schema *s = NULL;
@@ -2097,16 +2164,23 @@
msg = drop_view( sql, sname, name, action);
} break;
- case DDL_ALTER_TABLE:
- {
+ case DDL_DROP_CONSTRAINT: {
+ int action = *(int*) getArgReference(stk, pci, 4);
+ str name = *(str*) getArgReference(stk, pci, 3);
+
+ msg = drop_key( sql, sname, name, action);
+ } break;
+ case DDL_ALTER_TABLE: {
sql_table *t = *(sql_table**) getArgReference(stk, pci, 3);
msg = alter_table(sql, sname, t);
} break;
- case DDL_DROP_CONSTRAINT: {
- int action = *(int*) getArgReference(stk, pci, 4);
- str name = *(str*) getArgReference(stk, pci, 3);
-
- msg = drop_key( sql, sname, name, action);
+ case DDL_CREATE_TYPE: {
+ char *impl = *(str*) getArgReference(stk, pci, 3);
+ if (!mvc_create_type(sql, sql->session->schema, sname, 0, 0, 0,
impl))
+ msg = sql_message("CREATE TYPE: unknown external type
'%s'", impl);
+ } break;
+ case DDL_DROP_TYPE: {
+ msg = sql_message("DROP TYPE: not implemented ('%s')", sname);
} break;
case DDL_GRANT_ROLES: {
char *auth = SaveArgReference(stk, pci, 3);
@@ -2134,6 +2208,27 @@
int grantor = *(int*)getArgReference(stk, pci, 7);
msg = sql_revoke_table_privs( sql, grantee, privs, sname,
cname, grant, grantor);
} break;
+ case DDL_CREATE_USER: {
+ char *passwd = *(str*)getArgReference(stk, pci, 3);
+ int enc = *(int*)getArgReference(stk, pci, 4);
+ char *schema = SaveArgReference(stk, pci, 5);
+ char *fullname = SaveArgReference(stk, pci, 6);
+ msg = sql_create_user( sql, sname, passwd, enc, fullname,
schema);
+ } break;
+ case DDL_DROP_USER: {
+ msg = sql_drop_user( sql, sname);
+ } break;
+ case DDL_ALTER_USER: {
+ char *passwd = SaveArgReference(stk, pci, 3);
+ int enc = *(int*)getArgReference(stk, pci, 4);
+ char *schema = SaveArgReference(stk, pci, 5);
+ char *oldpasswd = SaveArgReference(stk, pci, 6);
+ msg = sql_alter_user( sql, sname, passwd, enc, schema,
oldpasswd);
+ } break;
+ case DDL_RENAME_USER: {
+ char *newuser = *(str*)getArgReference(stk, pci, 3);
+ msg = sql_rename_user( sql, sname, newuser);
+ } break;
case DDL_CREATE_ROLE: {
char *role = sname;
int grantor = *(int*)getArgReference(stk, pci, 4);
@@ -2143,6 +2238,16 @@
char *role = sname;
msg = sql_drop_role( sql, role);
} break;
+ case DDL_CREATE_INDEX: {
+ int itype = *(int*)getArgReference(stk, pci, 3);
+ char *ssname = *(str*)getArgReference(stk, pci, 4);
+ char *tname = *(str*)getArgReference(stk, pci, 5);
+ msg = create_index( sql, sname, itype, ssname, tname, stk, pci);
+ } break;
+ case DDL_DROP_INDEX: {
+ char *iname = *(str*)getArgReference(stk, pci, 3);
+ msg = drop_index( sql, sname, iname );
+ } break;
default:
throw(SQL, "sql.catalog", "catalog unknown type");
}
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -93,15 +93,16 @@
#define DDL_DROP_CONSTRAINT 28
#define DDL_ALTER_TABLE 29
-#define DDL_CREATE_INDEX 30
-#define DDL_DROP_INDEX 31
+#define DDL_CREATE_TYPE 30
+#define DDL_DROP_TYPE 31
+
+#define DDL_CREATE_INDEX 32
+#define DDL_DROP_INDEX 33
#define DDL_CREATE_FUNCTION 41
#define DDL_DROP_FUNCTION 42
-#define DDL_CREATE_TYPE 43
-#define DDL_DROP_TYPE 44
-#define DDL_CREATE_TRIGGER 45
-#define DDL_DROP_TRIGGER 46
+#define DDL_CREATE_TRIGGER 43
+#define DDL_DROP_TRIGGER 44
#define DDL_GRANT_ROLES 51
#define DDL_REVOKE_ROLES 52
diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c
--- a/sql/server/rel_bin.c
+++ b/sql/server/rel_bin.c
@@ -3385,22 +3385,6 @@
}
static stmt *
-rel2bin_drop_seq(mvc *sql, sql_rel *rel, list *refs)
-{
- node *en = rel->exps->h;
- stmt *action = exp_bin(sql, en->data, NULL, NULL, NULL, NULL);
- stmt *sname = exp_bin(sql, en->next->data, NULL, NULL, NULL, NULL);
- stmt *name = exp_bin(sql, en->next->next->data, NULL, NULL, NULL, NULL);
- list *l = list_new(sql->sa);
-
- (void)refs;
- append(l, sname);
- append(l, name);
- append(l, action);
- return stmt_catalog(sql->sa, rel->flag, stmt_list(sql->sa, l));
-}
-
-static stmt *
rel2bin_trans(mvc *sql, sql_rel *rel, list *refs)
{
node *en = rel->exps->h;
@@ -3456,7 +3440,7 @@
}
static stmt *
-rel2bin_privs(mvc *sql, sql_rel *rel, list *refs)
+rel2bin_catalog2(mvc *sql, sql_rel *rel, list *refs)
{
node *en;
list *l = list_new(sql->sa);
@@ -3491,7 +3475,7 @@
s = rel2bin_seq(sql, rel, refs);
sql->type = Q_SCHEMA;
} else if (rel->flag <= DDL_DROP_SEQ) {
- s = rel2bin_drop_seq(sql, rel, refs);
+ s = rel2bin_catalog2(sql, rel, refs);
sql->type = Q_SCHEMA;
} else if (rel->flag <= DDL_TRANS) {
s = rel2bin_trans(sql, rel, refs);
@@ -3502,11 +3486,8 @@
} else if (rel->flag <= DDL_ALTER_TABLE) {
s = rel2bin_catalog_table(sql, rel, refs);
sql->type = Q_SCHEMA;
- } else if (rel->flag <= DDL_REVOKE) {
- s = rel2bin_privs(sql, rel, refs);
- sql->type = Q_SCHEMA;
} else if (rel->flag <= DDL_DROP_ROLE) {
- s = rel2bin_catalog(sql, rel, refs);
+ s = rel2bin_catalog2(sql, rel, refs);
sql->type = Q_SCHEMA;
}
return s;
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -209,7 +209,7 @@
sql_subtype clob;
sql_find_subtype(&clob, "clob", 0, 0);
- return exp_atom(sa, atom_string(sa, &clob, sa_strdup(sa, s)));
+ return exp_atom(sa, atom_string(sa, &clob, s?sa_strdup(sa, s):NULL));
}
sql_exp *
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
@@ -28,6 +28,8 @@
#include "sql_parser.h"
#include "sql_privileges.h"
+#define qname_index(qname) qname_table(qname)
+
static sql_table *
_bind_table(sql_table *t, sql_schema *ss, sql_schema *s, char *name)
{
@@ -943,6 +945,26 @@
}
static sql_rel *
+rel_schema2(sql_allocator *sa, int cat_type, char *sname, char *auth, int nr)
+{
+ sql_rel *rel = rel_create(sa);
+ list *exps = new_exp_list(sa);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list