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