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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list