Update of /cvsroot/monetdb/sql/src/backends/monet5
In directory 
sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv10921/src/backends/monet5

Modified Files:
        sql.mx sql_gencode.mx sql_optimizer.mx sql_scenario.mx 
        sql_user.mx 
Log Message:
moved most of the DDL statements into mal 


Index: sql_scenario.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql_scenario.mx,v
retrieving revision 1.371
retrieving revision 1.372
diff -u -d -r1.371 -r1.372
--- sql_scenario.mx     7 Jan 2010 15:24:31 -0000       1.371
+++ sql_scenario.mx     10 Jan 2010 15:33:33 -0000      1.372
@@ -235,7 +235,7 @@
        char *debug_str = GDKgetenv("sql_debug");
        int readonly  = GDKgetenv_isyes("gdk_readonly");
        int single_user = GDKgetenv_isyes("gdk_single_user");
-       char *gmt = "GMT";
+       char *gmt = "GMT", *dbname = NULL;
        tzone tz;
 
 #ifdef _SQL_SCENARIO_DEBUG
@@ -260,11 +260,12 @@
                SQLdebug |= 64;
        if (readonly)
                SQLdebug |= 32;
-       if (((SQLdebug&16)==16 && mvc_init(FALSE, store_bpm, 0) < 0) ||
-                       ((SQLdebug&96)==96 && mvc_init(FALSE, store_suro, 0) < 
0) ||
-                       ((SQLdebug&96)==64 && mvc_init(FALSE, store_su, 0) < 0) 
||
-                       ((SQLdebug&96)==32 && mvc_init(FALSE, store_ro, 0) < 0) 
||
-                       ((SQLdebug&112)==0 && mvc_init(FALSE, store_bat, 0) < 
0))
+       dbname = GDKgetenv("gdk_dbname");
+       if (((SQLdebug&16)==16 && mvc_init(dbname, FALSE, store_bpm, 0) < 0) ||
+                       ((SQLdebug&96)==96 && mvc_init(dbname, FALSE, 
store_suro, 0) < 0) ||
+                       ((SQLdebug&96)==64 && mvc_init(dbname, FALSE, store_su, 
0) < 0) ||
+                       ((SQLdebug&96)==32 && mvc_init(dbname, FALSE, store_ro, 
0) < 0) ||
+                       ((SQLdebug&112)==0 && mvc_init(dbname, FALSE, 
store_bat, 0) < 0))
                throw(SQL, "SQLinit", "Catalogue initialization failed");
        SQLinitialized = TRUE;
        mal_unset_lock(sql_contextLock,"SQL init");

Index: sql_gencode.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql_gencode.mx,v
retrieving revision 1.349
retrieving revision 1.350
diff -u -d -r1.349 -r1.350
--- sql_gencode.mx      7 Jan 2010 15:24:31 -0000       1.349
+++ sql_gencode.mx      10 Jan 2010 15:33:33 -0000      1.350
@@ -471,7 +471,6 @@
        return k;
 }
 
-
 InstrPtr
 pushSchema(MalBlkPtr mb, InstrPtr q, sql_table *t)
 {
@@ -1630,6 +1629,24 @@
                        s->nr = getDestVar(q);
                        break;
                }
+               case st_catalog: {
+                       int l = -1, r = -1, k = -1;
+
+                       l = _dumpstmt(sql, mb, s->op1.stval);
+                       if (s->op2.stval)
+                               r = _dumpstmt(sql, mb, s->op2.stval);
+                       k = _dumpstmt(sql, mb, s->op3.stval);
+                       q = newStmt1(mb, sqlRef, "catalog");
+                       q = pushInt(mb, q, s->flag);
+                       q = pushArgument(mb, q, l);
+                       if (r > 0) 
+                               q = pushArgument(mb, q, r);
+                       else
+                               q = pushNil(mb, q, TYPE_str);
+                       q = pushArgument(mb, q, k);
+                       s->nr = getDestVar(q);
+                       break;
+               }
                case st_alias:
                        s->nr = _dumpstmt(sql, mb, s->op1.stval);
                        break;
@@ -2174,12 +2191,13 @@
        Symbol backup = NULL;
        stmt *s;
        int i, retseen =0, sideeffects =0;
+       sql_allocator *sa = sa_create();        /* NIELS: leaks, will be 
resolved once we keep rel,sa,mb (for recompiles) */
 
        /* nothing to do for internal and ready (not recompiling) functions */
        if (!f->sql || f->sql > 1)
                return;
        f->sql++;
-       s = sql_parse(m, f->imp, m_instantiate);
+       s = sql_parse(m, sa, f->imp, m_instantiate);
        if (!s) {
                fputs(m->errstr, stderr);
                return;

Index: sql_user.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql_user.mx,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -d -r1.51 -r1.52
--- sql_user.mx 7 Jan 2010 15:24:31 -0000       1.51
+++ sql_user.mx 10 Jan 2010 15:33:33 -0000      1.52
@@ -240,7 +240,7 @@
        mvc_create_func(m, s, "db_users", l, &tpe, FALSE, FALSE, "sql", 
"db_users", 1);
        list_destroy(l);
 
-       t = mvc_create_view(m, s, "users",
+       t = mvc_create_view(m, s, "users", SQL_PERSIST,
                        "SELECT u.\"name\" AS \"name\", "
                                "ui.\"fullname\", ui.\"default_schema\" "
                        "FROM db_users() AS u LEFT JOIN "

Index: sql_optimizer.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql_optimizer.mx,v
retrieving revision 1.242
retrieving revision 1.243
diff -u -d -r1.242 -r1.243
--- sql_optimizer.mx    7 Jan 2010 15:24:31 -0000       1.242
+++ sql_optimizer.mx    10 Jan 2010 15:33:33 -0000      1.243
@@ -359,15 +359,17 @@
                                sql_table *t = mvc_bind_table(m, s, tname);
                                sql_column *c = mvc_bind_column(m, t, cname);
 
-                               not_null = !c->null;
+                               if (c) {
+                                       not_null = !c->null;
 
-                               if (active_store_type == store_bpm && c->data) {
-                                       bpm = c->data;
-                                       part = bpm->nr;
+                                       if (active_store_type == store_bpm && 
c->data) {
+                                               bpm = c->data;
+                                               part = bpm->nr;
+                                       }
+                                       cnt = store_funcs.count_col(c);
+                                       assert(cnt <= (size_t) GDK_oid_max);
+                                       rows = (oid) cnt;
                                }
-                               cnt = store_funcs.count_col(c);
-                               assert(cnt <= (size_t) GDK_oid_max);
-                               rows = (oid) cnt;
                        }       
                        if (rows > 1 && mode != RD_INS)
                                varSetProp(mb, k, rowsProp, op_eq, VALset(&vr, 
TYPE_oid, &rows));

Index: sql.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/backends/monet5/sql.mx,v
retrieving revision 1.387
retrieving revision 1.388
diff -u -d -r1.387 -r1.388
--- sql.mx      8 Jan 2010 13:40:18 -0000       1.387
+++ sql.mx      10 Jan 2010 15:33:33 -0000      1.388
@@ -44,6 +44,18 @@
 address SQLtransaction
 comment "a transaction statement (type can be commit,release,rollback or 
start)";
 
+pattern catalog(type:int,sname:str,name:str,action:int):void
+address SQLcatalog
+comment "a catalog statement";
+
+pattern catalog(type:int,sname:str,t:ptr,temp:int):void
+address SQLcatalog
+comment "a catalog statement";
+
+pattern catalog(type:int,sname:str,t:ptr,restart:lng):void
+address SQLcatalog
+comment "a catalog statement";
+
 pattern eval(cmd:str):void 
 address SQLstatement
 comment "Compile and execute a single sql statement";
@@ -968,6 +980,7 @@
 extern BAT *mvc_bind_idxbat(mvc *m, char *sname, char *tname, char *iname, int 
access);
 
 sql5_export str SQLtransaction(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
+sql5_export str SQLcatalog(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 
 sql5_export str mvc_append_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str mvc_update_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
@@ -1177,6 +1190,7 @@
 #include <sql_datetime.h>
 #include <rel_optimizer.h>
 #include <rel_select.h>
+#include <rel_exp.h>
 #include <rel_dump.h>
 #include <rel_bin.h>
 #include <math.h>
@@ -1226,7 +1240,8 @@
 from the statement cache. Compile and optimize it for later
 consumption, e.g. display
 @c
-stmt *
+/*
+static stmt *
 sql_symbols2stmt(mvc *c, symbol *s) 
 {
        dnode *d;
@@ -1244,6 +1259,7 @@
        }
        return stmt_list(l);
 }
+*/
 
 stmt *
 sql_symbol2stmt(mvc *c, symbol *sym)
@@ -1252,8 +1268,10 @@
        int status;
        sql_rel *r;
 
+/*
        if (sym->token == SQL_MULSTMT) 
                return sql_symbols2stmt(c, sym);
+*/
 
        status = c->session->status;
        r = rel_semantic(c, sym);
@@ -1417,6 +1435,416 @@
        return MAL_SUCCEED;
 }
 
+static str
+create_table_or_view( mvc *sql, char *sname, sql_table *t, int temp)
+{
+       sql_schema *s = mvc_bind_schema(sql, sname);
+       sql_table *nt = NULL;
+       node *n;
+
+       if (STORE_READONLY(active_store_type)) 
+               return sql_error(sql, 06, "schema statements cannot be executed 
on a readonly database.");
+
+       if (!s) 
+               return sql_message("CREATE %s: schema '%s' doesn't exist", 
(t->query)?"TABLE":"VIEW", sname);
+
+       if (mvc_bind_table(sql, s, t->base.name)) {
+               char *cd = (temp == SQL_DECLARED_TABLE)?"DECLARE":"CREATE";
+               return sql_message("%s TABLE: name '%s' already in use", cd, 
t->base.name);
+       } else if (temp != SQL_DECLARED_TABLE &&!schema_privs(sql->role_id, s)){
+               return sql_message("CREATE TABLE: insufficient privileges for 
user '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name);
+       }
+
+       /* first check default values */
+       for (n = t->columns.set->h; n; n = n->next) {
+               sql_column *c = n->data;
+
+               if (c->def) {
+                       char buf[BUFSIZ];
+                       sql_rel *r = NULL;
+                       sql_exp *e;
+
+                       sql->sa = sa_create();
+                       snprintf(buf, BUFSIZ, "select %s;", c->def);
+                       r = rel_parse(sql, buf, m_deps); 
+                       if (!r || !is_project(r->op) || !r->exps || 
list_length(r->exps) != 1 || (e = rel_check_type(sql, &c->type, 
exp_dup(r->exps->h->data), type_equal)) == NULL) 
+                               throw(SQL, "sql.catalog", sql->errstr);
+                       exp_destroy(e);
+                       sa_destroy(sql->sa);
+                       sql->sa = NULL;
+                       rel_destroy(r);
+               }
+       }
+
+       nt = sql_trans_create_table(sql->session->tr, s, t->base.name, 
t->query, t->type, t->system, temp, t->commit_action, t->sz);
+
+       for (n = t->columns.set->h; n; n = n->next) {
+               sql_column *c = n->data;
+               mvc_copy_column(sql, nt, c);
+       }
+       if (t->idxs.set) {
+               for (n = t->idxs.set->h; n; n = n->next) {
+                       sql_idx *i = n->data;
+                       mvc_copy_idx(sql, nt, i);
+               }
+       }
+       if (t->keys.set) {
+               for (n = t->keys.set->h; n; n = n->next) {
+                       sql_key *k = n->data;
+
+                       mvc_copy_key(sql, nt, k);
+               }
+       }
+       /* TODO copy triggers */
+       /* also create dependencies */
+       if (t->query) {
+               sql_rel *r = NULL;
+               sql->sa = sa_create();
+               r = rel_parse(sql, t->query, m_deps); 
+               sa_destroy(sql->sa);
+               sql->sa = NULL;
+               rel_destroy(r);
+       }
+       return MAL_SUCCEED;
+}
+
+static str
+alter_table( mvc *sql, char *sname, sql_table *t)
+{
+       sql_schema *s = mvc_bind_schema(sql, sname);
+       sql_table *nt = NULL;
+       node *n;
+
+       if (!s) 
+               return sql_message("ALTER TABLE: no such schema '%s'", sname);
+
+       if ((nt = mvc_bind_table(sql, s, t->base.name)) == NULL) {
+                return sql_message("ALTER TABLE: no such table '%s'", 
t->base.name);
+
+       } else if (!schema_privs(sql->role_id, s)){
+               return sql_message("ALTER TABLE: insufficient privileges for 
user '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name);
+       }
+
+       /* check for changes */
+       if (t->columns.dset) for (n = t->columns.dset->h; n; n = n->next) {
+               /* propagate alter table .. drop column */
+               sql_column *c = n->data;
+               sql_column *nc = mvc_bind_column(sql, nt, c->base.name);
+               mvc_drop_column(sql, nt, nc, c->drop_action);
+       }
+       /* check for changes on current cols */
+       for (n = t->columns.set->h; n != t->columns.nelm; n = n->next) {
+
+               /* null or default value changes */
+               sql_column *c = n->data;
+               sql_column *nc = mvc_bind_column(sql, nt, c->base.name);
+
+               if (c->null != nc->null) {
+                       mvc_null(sql, nc, c->null);
+                       /* for non empty check for nulls */
+                       if (c->null == 0){
+                               BAT *b = store_funcs.bind_col(sql->session->tr, 
nc, 0);
+
+                               /* TODO also check updates and inserts */
+                               if (BATcount(b) && b->T->nonil != TRUE) {
+                                       BUN bun = BUNfnd(BATmirror(b), 
ATOMnilptr(b->ttype));
+                                       if (bun != BUN_NONE)
+                                               return sql_message ("ALTER 
TABLE: NOT NULL constraint violated for column %s.%s", c->t->base.name, 
c->base.name );
+                               }
+                               BBPunfix(b->batCacheid);
+                       }
+               }
+               if (c->def != nc->def)
+                       mvc_default(sql, nc, c->def);
+       }
+       for (; n; n = n->next) {
+               /* propagate alter table .. add column */
+               sql_column *c = n->data;
+               mvc_copy_column(sql, nt, c);
+       }
+       if (t->idxs.set) {
+               /* alter drop index */
+               if (t->idxs.dset) for (n = t->idxs.dset->h; n; n = n->next) {
+                       sql_idx *i = n->data;
+                       sql_idx *ni = mvc_bind_idx(sql, s, i->base.name);
+                       mvc_drop_idx(sql, s, ni);
+               }
+               /* alter add index */
+               for (n = t->idxs.nelm; n; n = n->next) {
+                       sql_idx *i = n->data;
+                       mvc_copy_idx(sql, nt, i);
+               }
+       }
+       if (t->keys.set) {
+               /* alter drop key */
+               if (t->keys.dset) for (n = t->keys.dset->h; n; n = n->next) {
+                       sql_key *k = n->data;
+                       sql_key *nk = mvc_bind_key(sql, s, k->base.name);
+                       mvc_drop_key(sql, s, nk, k->drop_action);
+               }
+               /* alter add key */
+               for (n = t->keys.nelm; n; n = n->next) {
+                       sql_key *k = n->data;
+                       mvc_copy_key(sql, nt, k);
+               }
+       }
+
+       /* TODO copy triggers */
+       /* also create dependencies */
+       return MAL_SUCCEED;
+}
+
+
+
+static char *
+drop_table(mvc *sql, char *sname, char *tname, int drop_action)
+{
+       sql_schema *s = NULL;
+       sql_table *t = NULL;
+       node *n; 
+
+       if (sname && !(s=mvc_bind_schema(sql, sname))) 
+               return sql_message("DROP TABLE: no such schema '%s'", sname);
+       if (!s)
+               s = cur_schema(sql);
+       t = mvc_bind_table(sql, s, tname);
+       if (!t && !sname) {
+               s = tmp_schema(sql);
+               t = mvc_bind_table(sql, s, tname);
+       }
+       if (!t) { 
+               return sql_message("DROP TABLE: no such table '%s'", tname);
+       } else if (!isTable(t)) {
+               return sql_message("DROP TABLE: cannot drop VIEW '%s'", tname);
+       } else if (t->system) {
+               return sql_message("DROP TABLE: cannot drop system table '%s'", 
tname);
+       } else if (!schema_privs(sql->role_id, s)) {
+               return sql_message("DROP TABLE: access denied for %s to schema 
;'%s'", stack_get_string(sql, "current_user"), s->base.name);
+       }
+       if ( !drop_action && t->keys.set) {
+               for (n = t->keys.set->h; n; n = n->next) {
+                       sql_key *k = n->data;
+
+                       if (k->type == ukey || k->type == pkey) {
+                               sql_ukey *uk = (sql_ukey *) k;
+
+                               if (uk->keys && list_length(uk->keys)) {
+                                       node *l = uk->keys->h;
+
+                                       for (; l; l = l->next) {
+                                               k = l->data;
+                                               /* make sure it is not a self 
referencing key */
+                                               if (k->t != t) 
+                                                       return 
sql_message("DROP TABLE: FOREIGN KEY %s.%s depends on %s", k->t->base.name, 
k->base.name, tname);
+                                       }
+                               }
+                       }
+               }
+       }
+
+       if (!drop_action && mvc_check_dependency(sql, t->base.id, 
TABLE_DEPENDENCY, NULL))
+               return sql_message("DROP TABLE: unable to drop table %s (there 
are database objects which depend on it)\n", t->base.name);
+       
+       mvc_drop_table(sql, s, t, drop_action);
+       return MAL_SUCCEED;
+}
+
+static char *
+drop_view(mvc *sql, char *sname, char *tname, int drop_action)
+{
+       sql_table *t = NULL;
+       sql_schema *ss = NULL;
+
+       if (sname != NULL && (ss = mvc_bind_schema(sql, sname)) == NULL)
+               return sql_message("DROP VIEW: no such schema '%s'", sname);
+
+       if (ss == NULL)
+               ss = cur_schema(sql);
+
+       t = mvc_bind_table(sql, ss, tname);
+
+       if (!schema_privs(sql->role_id, ss)) {  
+               return sql_message("DROP VIEW: access denied for %s to schema 
'%s'", stack_get_string(sql, "current_user"), ss->base.name);
+       } else if (!t) {
+               return sql_message("DROP VIEW: unknown view '%s'", tname);
+       } else if (!isView(t)) {
+               return sql_message("DROP VIEW: unable to drop view '%s'", 
tname);
+       } else if (t->system) {
+               return sql_message("DROP VIEW: cannot drop system view '%s'", 
tname);
+       } else if (! drop_action && mvc_check_dependency(sql, t->base.id, 
VIEW_DEPENDENCY, NULL)) {
+                       return sql_message("unable to drop view %s (there are 
database objects which depend on it)\n", t->base.name);
+       } else {
+               mvc_drop_table(sql, ss, t, drop_action);
+               return MAL_SUCCEED;
+       }
+}
+
+static str
+create_seq( mvc *sql, char *sname, sql_sequence *seq)
+{
+       sql_schema *s = NULL;
+
+       if (sname && !(s = mvc_bind_schema(sql, sname)))
+               return sql_message("CREATE SEQUENCE: no such schema '%s'", 
sname);
+       if (s == NULL)
+               s = cur_schema(sql);
+       if (find_sql_sequence(s, seq->base.name)) {
+               return sql_message("CREATE SEQUENCE: name '%s' already in use", 
seq->base.name);
+       } else if (!schema_privs(sql->role_id, s)) {
+               return sql_message( "CREATE SEQUENCE: insufficient privileges 
for '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name);
+       }
+       sql_trans_create_sequence(sql->session->tr, s, seq->base.name, 
seq->start, seq->minvalue, seq->maxvalue, seq->increment, seq->cacheinc, 
seq->cycle);  
+       return NULL;
+}
+
+static str
+alter_seq( mvc *sql, char *sname, sql_sequence *seq, lng *val)
+{
+       sql_schema *s = NULL;
+       sql_sequence *nseq = NULL;
+
+       if (sname && !(s = mvc_bind_schema(sql, sname)))
+               return sql_message("ALTER SEQUENCE: no such schema '%s'", 
sname);
+       if (s == NULL)
+               s = cur_schema(sql);
+       if (!(nseq = find_sql_sequence(s, seq->base.name))) {
+               return sql_message( "ALTER SEQUENCE: no such sequence '%s'", 
seq->base.name);
+       } else if (!schema_privs(sql->role_id, s)) {
+               return sql_message( "ALTER SEQUENCE: insufficient privileges 
for '%s' in schema '%s'", stack_get_string(sql, "current_user"), s->base.name);
+       }
+
+       /* first alter the known values */
+       sql_trans_alter_sequence(sql->session->tr, nseq, seq->minvalue, 
seq->maxvalue, seq->increment, seq->cacheinc, seq->cycle);
+       if (val)
+               sql_trans_sequence_restart(sql->session->tr, nseq, *val);
+       return MAL_SUCCEED;
+}
+
+
+
+
+static str
+drop_seq(mvc *sql, char *sname, char *name)
+{
+       sql_schema *s = NULL;
+
+       if (sname && !(s = mvc_bind_schema(sql, sname)))
+               return sql_message("DROP SEQUENCE: no such schema '%s'", sname);
+       if (!s)
+               s = cur_schema(sql);
+       if (!find_sql_sequence(s, name)) {
+               return sql_message("DROP SEQUENCE: no such sequence '%s'", 
name);
+       } else if (!schema_privs(sql->role_id, s)) {
+               return sql_message("DROP SEQUENCE: insufficient privileges for 
'%s' in schema '%s'", stack_get_string(sql, "current_user"),  s->base.name);
+       }
+       sql_trans_drop_sequence(sql->session->tr, s, name, 0);  
+       return NULL;
+}
+
+
+str
+SQLcatalog(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+       mvc *sql = NULL;
+       str msg = getContext(cntxt, mb, &sql, NULL);
+       int type = *(int*) getArgReference(stk, pci, 1);
+       str sname = *(str*) getArgReference(stk, pci, 2);
+
+       if (msg)
+               return msg;
+
+       if (STORE_READONLY(active_store_type)) 
+               return sql_message("schema statements cannot be executed on a 
readonly database.");
+
+       switch (type) {
+       case DDL_CREATE_SEQ:
+       {
+               sql_sequence *s = *(sql_sequence**) getArgReference(stk, pci, 
3);
+               msg = create_seq(sql, sname, s);
+       }       break;
+       case DDL_ALTER_SEQ:
+       {
+               lng *val;
+               sql_sequence *s = *(sql_sequence**) getArgReference(stk, pci, 
3);
+               if (getArgType(mb, pci, 4) == TYPE_lng) 
+                       val = getArgReference(stk, pci, 4);
+               msg = alter_seq(sql, sname, s, val);
+       }       break;
+       case DDL_DROP_SEQ: {
+               str name = *(str*) getArgReference(stk, pci, 3);
+
+               msg = drop_seq( sql, sname, name);
+       }       break;
+       case DDL_CREATE_SCHEMA: {
+               str name = *(str*) getArgReference(stk, pci, 3);
+               int auth_id = sql->role_id;
+
+               if (name && strcmp(name, str_nil) == 0)
+                       name = NULL;
+
+               if (name && (auth_id = sql_find_auth(sql, name)) < 0) {
+                       msg = sql_message("CREATE SCHEMA: no such authorization 
'%s'", name);
+               }
+               if (sql->user_id != USER_MONETDB && sql->role_id != 
ROLE_SYSADMIN) {
+                       msg = sql_message("CREATE SCHEMA: insufficient 
privileges for user '%s'", stack_get_string(sql, "current_user"));
+               }
+               if (mvc_bind_schema(sql, sname)) {
+                       msg = sql_message("CREATE SCHEMA: name '%s' already in 
use", sname);
+               } else {
+                       (void)mvc_create_schema(sql, sname, auth_id, 
sql->user_id);
+               }
+       }       break;
+       case DDL_DROP_SCHEMA: {
+               int action = *(int*) getArgReference(stk, pci, 4);
+               sql_schema *s = mvc_bind_schema(sql, sname);
+
+               if (!s) {
+                       msg = sql_message("DROP SCHEMA: name %s does not 
exist", sname);
+               } else if (!schema_privs(sql->role_id, s)) {
+                       msg = sql_message("DROP SCHEMA: access denied for %s to 
schema ;'%s'", stack_get_string(sql, "current_user"), s->base.name);
+               } else if (s == cur_schema(sql)) {
+                       msg = sql_message("DROP SCHEMA: cannot drop current 
schema");
+               } else if (strcmp(sname, "sys") == 0 || strcmp(sname, "tmp") == 
0) {
+                       msg = sql_message("DROP SCHEMA: access denied for 
'%s'", sname);
+               } else if (sql_schema_has_user(sql, s)) {
+                       msg = sql_message("DROP SCHEMA: unable to drop schema 
'%s' (there are database objects which depend on it", sname);
+               } else {
+                       mvc_drop_schema(sql, s, action);
+               }
+       }       break;
+       case DDL_CREATE_TABLE: 
+       case DDL_CREATE_VIEW: 
+       {
+               sql_table *t = *(sql_table**) getArgReference(stk, pci, 3);
+               int temp = *(int*) getArgReference(stk, pci, 4);
+
+               msg = create_table_or_view(sql, sname, t, temp);
+       }       break;
+       case DDL_DROP_TABLE: {
+               int action = *(int*) getArgReference(stk, pci, 4);
+               str name = *(str*) getArgReference(stk, pci, 3);
+
+               msg = drop_table( sql, sname, name, action);
+       }       break;
+       case DDL_DROP_VIEW: {
+               int action = *(int*) getArgReference(stk, pci, 4);
+               str name = *(str*) getArgReference(stk, pci, 3);
+
+               msg = drop_view( 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;
+       default:
+               throw(SQL, "sql.catalog", "catalog unknown type");
+       }
+       if (msg)
+               throw(SQL, "sql.catalog", msg);
+       return MAL_SUCCEED;
+}
+
 /* setVariable(int *ret, str *name, any value) */
 str
 setVariable(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
@@ -3210,15 +3638,15 @@
        q = (@2*) Tloc(b, BUNlast(b));
        bn->T->nonil= b->T->nonil;
        if ( b->T->nonil){
-               for (; p<q; p++)
-                       *o++ = (@1)*p;
+               for (; p<q; p++, o++)
+                       *o = (@1)*p;
        } else{
-               for (; p<q; p++)
+               for (; p<q; p++, o++)
                if (*p == @2_nil) {
-                       *o++ = @1_nil;
+                       *o = @1_nil;
                        bn->T->nonil= FALSE;
                } else
-                       *o++ = (@1)*p;
+                       *o = (@1)*p;
        }
        BATsetcount(bn, BATcount(b));
        bn->tsorted = 0;
@@ -3279,29 +3707,30 @@
        q = (@2*) Tloc(b, BUNlast(b));
        bn->T->nonil= b->T->nonil;
        if ( b->T->nonil){
-               for (; p<q; p++){
+               for (; p<q; p++, o++){
                        val = *p;
                        /* see if the number fits in the data type */
                        if ((@3)(@1)val > (@3) g...@1_min && val > (@3) 
g...@1_min && val <= (@3) g...@1_max)   {
-                               *o++ = (@1)val;
+                               *o = (@1)val;
                        } else {
                                msg= createException(SQL, "convert", "value (" 
@4 ") exceeds limits of type @1", val);
                                break;
                        }
                }
-       } else{
-               for (; p<q; p++)
-               if (*p == @2_nil) {
-                       *o++ = @1_nil;
-                       bn->T->nonil= FALSE;
-               } else {
-                       val = *p;
-                       /* see if the number fits in the data type */
-                       if ((@3)(@1)val > (@3) g...@1_min && val > (@3) 
g...@1_min && val <= (@3) g...@1_max)   {
-                               *o++ = (@1)val;
+       } else {
+               for (; p<q; p++, o++) {
+                       if (*p == @2_nil) {
+                               *o = @1_nil;
+                               bn->T->nonil= FALSE;
                        } else {
-                               msg= createException(SQL, "convert", "value (" 
@4 ") exceeds limits of type @1", val);
-                               break;
+                               val = *p;
+                               /* see if the number fits in the data type */
+                               if ((@3)(@1)val > (@3) g...@1_min && val > (@3) 
g...@1_min && val <= (@3) g...@1_max)   {
+                                       *o = (@1)val;
+                               } else {
+                                       msg= createException(SQL, "convert", 
"value (" @4 ") exceeds limits of type @1", val);
+                                       break;
+                               }
                        }
                }
        }
@@ -3409,15 +3838,17 @@
        q = (@2*) Tloc(b, BUNlast(b));
        bn->T->nonil= b->T->nonil;
        if ( b->T->nonil){
-               for (; p<q; p++)
-                       *o = (@1) ((*p +  (*p<0)?-5:5) / scales[scale]);
-       } else{
-               for (; p<q; p++)
-               if (*p == @2_nil) {
-                       *o = @1_nil;
-                       bn->T->nonil= FALSE;
-               } else
+               for (; p<q; p++, o++)
                        *o = (@1) ((*p +  (*p<0)?-5:5) / scales[scale]);
+       } else {
+               for (; p<q; p++, o++) {
+                       if (*p == @2_nil) {
+                               *o = @1_nil;
+                               bn->T->nonil= FALSE;
+                       } else {
+                               *o = (@1) ((*p +  (*p<0)?-5:5) / scales[scale]);
+                       }
+               }
        }
        BATsetcount(bn, BATcount(b));
        bn->tsorted = 0;
@@ -3738,15 +4169,15 @@
        q = (@2*) Tloc(b, BUNlast(b));
        bn->T->nonil= b->T->nonil;
        if ( b->T->nonil){
-               for (; p<q; p++) 
-                       *o = (@1) (*p/scales[scale]);
+               for (; p<q; p++, o++) 
+                       *o = (((@1)*p)/scales[scale]);
        } else{
-               for (; p<q; p++) {
+               for (; p<q; p++, o++) {
                        if (*p == @2_nil) {
                                *o = @1_nil;
                                bn->T->nonil= FALSE;
                        } else 
-                               *o = (@1) (*p/scales[scale]);
+                               *o = (((@1)*p)/scales[scale]);
                }
        }
        BATsetcount(bn, BATcount(b));
@@ -3924,7 +4355,7 @@
        q = (@2*) Tloc(b, BUNlast(b));
        bn->T->nonil= b->T->nonil;
        if ( b->T->nonil){
-               for (; p<q; p++) {
+               for (; p<q; p++, o++) {
                        val = (@2) ((*p+ (*p<0)?-5:5)/scales[scale]);
                        /* see if the number fits in the data type */
                        if (val > g...@1_min && val <= g...@1_max)
@@ -3936,7 +4367,7 @@
                        }
                }
        } else{
-               for (; p<q; p++) {
+               for (; p<q; p++, o++) {
                        if (*p == @2_nil) {
                                *o = @1_nil;
                                bn->T->nonil= FALSE;


------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to