Changeset: e9bdcf3cf60c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e9bdcf3cf60c
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/include/sql_catalog.h
        sql/scripts/75_storagemodel.sql
        sql/server/rel_schema.c
        sql/server/rel_trans.h
        sql/server/rel_updates.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_parser.h
        sql/server/sql_parser.y
        sql/server/sql_scan.c
        sql/storage/bat/bat_storage.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: mosaic
Log Message:

added parsing of INSERT ONLY
added parsing and initial handling (ie storing only) of
        alter table table_NAME alter column column_Name set storage 'storage 
string';
        Sofar only the storage string is saved. Next step is to call the proper 
compression algo's.


diffs (truncated from 576 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -731,7 +731,7 @@ stmt_col( mvc *sql, sql_column *c, stmt 
 { 
        stmt *sc = stmt_bat(sql->sa, c, RDONLY);
 
-       if (isTable(c->t) && !c->t->readonly &&
+       if (isTable(c->t) && c->t->access != TABLE_READONLY &&
           (c->base.flag != TR_NEW || c->t->base.flag != TR_NEW /* alter */) &&
           (c->t->persistence == SQL_PERSIST || c->t->persistence == 
SQL_DECLARED_TABLE) && !c->t->commit_action) {
                stmt *i = stmt_bat(sql->sa, c, RD_INS);
@@ -749,7 +749,7 @@ stmt_idx( mvc *sql, sql_idx *i, stmt *de
 { 
        stmt *sc = stmt_idxbat(sql->sa, i, RDONLY);
 
-       if (isTable(i->t) && !i->t->readonly &&
+       if (isTable(i->t) && i->t->access != TABLE_READONLY &&
           (i->base.flag != TR_NEW || i->t->base.flag != TR_NEW /* alter */) &&
           (i->t->persistence == SQL_PERSIST || i->t->persistence == 
SQL_DECLARED_TABLE) && !i->t->commit_action) {
                stmt *ic = stmt_idxbat(sql->sa, i, RD_INS);
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -534,10 +534,10 @@ alter_table(mvc *sql, char *sname, sql_t
                }
        }
 
-       if (t->readonly != nt->readonly) {
-               if (t->readonly && table_has_updates(sql->session->tr, nt)) 
-                       return sql_message("40000!ALTER TABLE: set READONLY not 
possible with outstanding updates (wait until updates are flushed)\n");
-               mvc_readonly(sql, nt, t->readonly);
+       if (t->access != nt->access) {
+               if (t->access && table_has_updates(sql->session->tr, nt)) 
+                       return sql_message("40000!ALTER TABLE: set READ or 
INSERT ONLY not possible with outstanding updates (wait until updates are 
flushed)\n");
+               mvc_access(sql, nt, t->access);
        }
 
        /* check for changes */
@@ -583,6 +583,10 @@ alter_table(mvc *sql, char *sname, sql_t
                }
                if (c->def != nc->def)
                        mvc_default(sql, nc, c->def);
+               if (c->storage_type != nc->storage_type) {
+                       /* TODO here we should call the storage related 
functions */
+                       mvc_storage(sql, nc, c->storage_type);
+               }
        }
        for (; n; n = n->next) {
                /* propagate alter table .. add column */
@@ -2205,7 +2209,7 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
 
        nr = store_funcs.count_col(tr, c, 1);
 
-       if (isTable(t) && !t->readonly && (t->base.flag != TR_NEW /* alter */ ) 
&&
+       if (isTable(t) && t->access == TABLE_WRITABLE && (t->base.flag != 
TR_NEW /* alter */ ) &&
            t->persistence == SQL_PERSIST && !t->commit_action)
                inr = store_funcs.count_col(tr, c, 0);
        nr -= inr;
@@ -3967,7 +3971,7 @@ SQLcompress(Client cntxt, MalBlkPtr mb, 
        t = mvc_bind_table(m, s, *tbl);
        if (t == NULL)
                throw(SQL, "sql.compress", "42S02!Table missing");
-       if ( !t->readonly)
+       if (t->access != TABLE_READONLY)
                throw(SQL, "sql.compress", "!Table must be read only");
        tr = m->session->tr;
        t->base.wtime = s->base.wtime = tr->wtime = tr->wstime;
@@ -3991,11 +3995,11 @@ SQLcompress(Client cntxt, MalBlkPtr mb, 
                d = c->data;
                if (d->bid)
                        BBPdecref(d->bid, TRUE);
-               if (d->ibid)
-                       BBPdecref(d->ibid, TRUE);
-               d->bid = 0;
+               //if (d->ibid)
+                       //BBPdecref(d->ibid, TRUE);
+               d->bid = bid;
                d->ibase = 0;
-               d->ibid = bid;  /* use the insert bat */
+               //d->ibid = 0;  /* use the insert bat */
                c->base.wtime = tr->wstime;
                c->base.rtime = tr->stime;
        }
@@ -4029,7 +4033,7 @@ SQLdecompress(Client cntxt, MalBlkPtr mb
        t = mvc_bind_table(m, s, *tbl);
        if (t == NULL)
                throw(SQL, "sql.decompress", "42S02!Table missing");
-       if ( !t->readonly)
+       if (t->access != TABLE_READONLY)
                throw(SQL, "sql.compress", "!Table must be read only");
        tr = m->session->tr;
        t->base.wtime = s->base.wtime = tr->wtime = tr->wstime;
@@ -4053,11 +4057,11 @@ SQLdecompress(Client cntxt, MalBlkPtr mb
                d = c->data;
                if (d->bid)
                        BBPdecref(d->bid, TRUE);
-               if (d->ibid)
-                       BBPdecref(d->ibid, TRUE);
-               d->bid = 0;
+               //if (d->ibid)
+                       //BBPdecref(d->ibid, TRUE);
+               d->bid = bid;
                d->ibase = 0;
-               d->ibid = bid;  /* use the insert bat */
+               //d->ibid = 0;  /* use the insert bat */
                c->base.wtime = tr->wstime;
                c->base.rtime = tr->stime;
        }
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -28,6 +28,7 @@
 #define tr_readonly    1
 #define tr_writable    2
 #define tr_serializable 4
+#define tr_append      8
 
 #define ACT_NO_ACTION 0
 #define ACT_CASCADE 1
@@ -464,13 +465,17 @@ typedef enum table_types {
 #define isReplicaTable(x) (x->type==tt_replica_table)
 #define isKindOfTable(x)  (isTable(x) || isMergeTable(x) || isRemote(x) || 
isReplicaTable(x))
 
+#define TABLE_WRITABLE 0
+#define TABLE_READONLY 1
+#define TABLE_APPENDONLY       2
+
 typedef struct sql_table {
        sql_base base;
        sht type;               /* table, view, etc */
+       sht access;             /* writable, readonly, appendonly */
        bit system;             /* system or user table */
        temp_t persistence;     /* persistent, global or local temporary */
        ca_t commit_action;     /* on commit action */
-       bit readonly;   
        char *query;            /* views may require some query */
        int  sz;
 
diff --git a/sql/scripts/75_storagemodel.sql b/sql/scripts/75_storagemodel.sql
--- a/sql/scripts/75_storagemodel.sql
+++ b/sql/scripts/75_storagemodel.sql
@@ -28,11 +28,11 @@
 -- of columns and foreign key indices, and possible temporary hash indices.
 -- For strings we take a sample to determine their average length.
 
-create function sys.storage()
+create function sys."storage"()
 returns table ("schema" string, "table" string, "column" string, "type" 
string, location string, "count" bigint, typewidth int, columnsize bigint, 
heapsize bigint, hashes bigint, imprints bigint, sorted boolean)
-external name sql.storage;
+external name sql."storage";
 
-create view sys.storage as select * from sys.storage();
+create view sys."storage" as select * from sys."storage"();
 
 -- To determine the footprint of an arbitrary database, we first have
 -- to define its schema, followed by an indication of the properties of each 
column.
@@ -57,7 +57,7 @@ begin
        delete from sys.storagemodelinput;
 
        insert into sys.storagemodelinput
-       select X."schema", X."table", X."column", X."type", X.typewidth, 
X.count, 0, X.typewidth, false, X.sorted from sys.storage() X;
+       select X."schema", X."table", X."column", X."type", X.typewidth, 
X.count, 0, X.typewidth, false, X.sorted from sys."storage"() X;
 
        update sys.storagemodelinput
        set reference = true
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
@@ -623,6 +623,9 @@ table_element(mvc *sql, symbol *s, sql_s
                case SQL_NULL:
                        msg = "set column options for"; 
                        break;
+               case SQL_STORAGE:
+                       msg = "set column storage for"; 
+                       break;
                case SQL_DROP_DEFAULT:
                        msg = "drop default column option from"; 
                        break;
@@ -687,6 +690,20 @@ table_element(mvc *sql, symbol *s, sql_s
                _DELETE(r);
        }
        break;
+       case SQL_STORAGE:
+       {
+               dlist *l = s->data.lval;
+               char *cname = l->h->data.sval;
+               char *storage_type = l->h->next->data.sval;
+               sql_column *c = mvc_bind_column(sql, t, cname);
+
+               if (!c) {
+                       sql_error(sql, 02, "42S22!ALTER TABLE: no such column 
'%s'\n", cname);
+                       return SQL_ERR;
+               }
+               mvc_storage(sql, c, storage_type);
+       }
+       break;
        case SQL_NOT_NULL:
        case SQL_NULL:
        {
@@ -1097,9 +1114,11 @@ rel_alter_table(mvc *sql, dlist *qname, 
                                nt->s = t->s;
 
                        if (state == tr_readonly) {
-                               nt = mvc_readonly(sql, nt, 1);
+                               nt = mvc_access(sql, nt, TABLE_READONLY);
+                       } else if (state == tr_append) {
+                               nt = mvc_access(sql, nt, TABLE_APPENDONLY);
                        } else {
-                               nt = mvc_readonly(sql, nt, 0);
+                               nt = mvc_access(sql, nt, TABLE_WRITABLE);
                        }
                        return rel_table(sql, DDL_ALTER_TABLE, sname, nt, 0);
                }
diff --git a/sql/server/rel_trans.h b/sql/server/rel_trans.h
--- a/sql/server/rel_trans.h
+++ b/sql/server/rel_trans.h
@@ -24,10 +24,11 @@
 #include "sql_mvc.h"
 #include "sql_relation.h"
 
-#define tr_none                0
-#define tr_readonly    1
-#define tr_writable    2
-#define tr_serializable 4
+//#define tr_none              0
+//#define tr_readonly  1
+//#define tr_writable  2
+//#define tr_serializable 4
+//#define tr_append    8
 
 extern sql_rel *rel_transactions(mvc *sql, symbol *sym);
 
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -331,7 +331,7 @@ insert_into(mvc *sql, dlist *qname, dlis
                return sql_error(sql, 02, "42S02!INSERT INTO: no such table 
'%s'", tname);
        } else if (isView(t)) {
                return sql_error(sql, 02, "INSERT INTO: cannot insert into view 
'%s'", tname);
-       } else if (t->readonly) {
+       } else if (t->access == TABLE_READONLY) {
                return sql_error(sql, 02, "INSERT INTO: cannot insert into read 
only table '%s'", tname);
        }
        if (t && !isTempTable(t) && STORE_READONLY)
@@ -826,8 +826,8 @@ update_table(mvc *sql, dlist *qname, dli
                return sql_error(sql, 02, "42S02!UPDATE: no such table '%s'", 
tname);
        } else if (isView(t)) {
                return sql_error(sql, 02, "UPDATE: cannot update view '%s'", 
tname);
-       } else if (t->readonly) {
-               return sql_error(sql, 02, "UPDATE: cannot update read only 
table '%s'", tname);
+       } else if (t->access == TABLE_READONLY || t->access == 
TABLE_APPENDONLY) {
+               return sql_error(sql, 02, "UPDATE: cannot update read or append 
only table '%s'", tname);
        } else {
                sql_exp *e = NULL, **updates;
                sql_rel *r = NULL;
@@ -1004,8 +1004,8 @@ delete_table(mvc *sql, dlist *qname, sym
                return sql_error(sql, 02, "42S02!DELETE FROM: no such table 
'%s'", tname);
        } else if (isView(t)) {
                return sql_error(sql, 02, "DELETE FROM: cannot delete from view 
'%s'", tname);
-       } else if (t->readonly) {
-               return sql_error(sql, 02, "DELETE FROM: cannot delete from read 
only table '%s'", tname);
+       } else if (t->access == TABLE_READONLY || t->access == 
TABLE_APPENDONLY) {
+               return sql_error(sql, 02, "DELETE FROM: cannot delete from read 
or append only table '%s'", tname);
        }
        if (t && !isTempTable(t) && STORE_READONLY)
                return sql_error(sql, 02, "DELETE FROM: delete from table '%s' 
not allowed in readonly mode", tname);
@@ -1132,7 +1132,7 @@ copyfrom(mvc *sql, dlist *qname, dlist *
        }
        if (!t) 
                return sql_error(sql, 02, "42S02!COPY INTO: no such table 
'%s'", tname);
-       if (t->readonly) 
+       if (t->access == TABLE_READONLY) 
                return sql_error(sql, 02, "COPY INTO: cannot copy into read 
only table '%s'", tname);
        if (t && !isTempTable(t) && STORE_READONLY)
                return sql_error(sql, 02, "COPY INTO: copy into table '%s' not 
allowed in readonly mode", tname);
@@ -1242,7 +1242,7 @@ bincopyfrom(mvc *sql, dlist *qname, dlis
        }
        if (!t) 
                return sql_error(sql, 02, "42S02!COPY INTO: no such table 
'%s'", tname);
-       if (t->readonly) 
+       if (t->access == TABLE_READONLY) 
                return sql_error(sql, 02, "COPY INTO: cannot copy into read 
only table '%s'", tname);
        if (t && !isTempTable(t) && STORE_READONLY)
                return sql_error(sql, 02, "COPY INTO: copy into table '%s' not 
allowed in readonly mode", tname);
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -80,7 +80,7 @@ mvc_init(int debug, store_type store, in
                mvc_create_column_(m, t, "type", "smallint", 16);
                mvc_create_column_(m, t, "system", "boolean", 1);
                mvc_create_column_(m, t, "commit_action", "smallint", 16);
-               mvc_create_column_(m, t, "readonly", "boolean", 1);
+               mvc_create_column_(m, t, "access", "smallint", 16);
                mvc_create_column_(m, t, "temporary", "smallint", 16);
 
                if (!first) {
@@ -1202,17 +1202,31 @@ mvc_drop_default(mvc *m, sql_column *col
        }
 }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to