Changeset: 7588bd33711f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7588bd33711f
Added Files:
sql/backends/monet5/bam/Tests/mergetable.SQL.py
sql/backends/monet5/bam/Tests/sql/mergetable.sql
Modified Files:
sql/backends/monet5/bam/Tests/All
sql/backends/monet5/sql.c
sql/server/rel_schema.c
sql/storage/sql_storage.h
sql/storage/store.c
sql/storage/store_dependency.c
sql/test/mergetables/Tests/All
Branch: bamloader
Log Message:
Merge with default
diffs (196 lines):
diff --git a/sql/backends/monet5/bam/Tests/All
b/sql/backends/monet5/bam/Tests/All
--- a/sql/backends/monet5/bam/Tests/All
+++ b/sql/backends/monet5/bam/Tests/All
@@ -24,3 +24,4 @@ HAVE_SAMTOOLS?query2.9
HAVE_SAMTOOLS?query2.10
HAVE_SAMTOOLS?query2.11
HAVE_SAMTOOLS?query2.12
+HAVE_SAMTOOLS?mergetable
\ No newline at end of file
diff --git a/sql/backends/monet5/bam/Tests/mergetable.SQL.py
b/sql/backends/monet5/bam/Tests/mergetable.SQL.py
new file mode 100644
--- /dev/null
+++ b/sql/backends/monet5/bam/Tests/mergetable.SQL.py
@@ -0,0 +1,3 @@
+import bam
+
+bam.exec_sql_file("mergetable.sql", {'PWD': bam.SRCDIR})
\ No newline at end of file
diff --git a/sql/backends/monet5/bam/Tests/sql/mergetable.sql
b/sql/backends/monet5/bam/Tests/sql/mergetable.sql
new file mode 100644
--- /dev/null
+++ b/sql/backends/monet5/bam/Tests/sql/mergetable.sql
@@ -0,0 +1,30 @@
+SET SCHEMA bam;
+
+# Load files
+CALL bam_loader_repos('PWD/files', 0, 4);
+
+# Add a merge table over these files
+CREATE MERGE TABLE alignments (
+ "virtual_offset" BIGINT NOT NULL,
+ "qname" STRING NOT NULL,
+ "flag" SMALLINT NOT NULL,
+ "rname" STRING NOT NULL,
+ "pos" INT NOT NULL,
+ "mapq" SMALLINT NOT NULL,
+ "cigar" STRING NOT NULL,
+ "rnext" STRING NOT NULL,
+ "pnext" INT NOT NULL,
+ "tlen" INT NOT NULL,
+ "seq" STRING NOT NULL,
+ "qual" STRING NOT NULL
+);
+
+SELECT COUNT(*) FROM alignments;
+
+ALTER TABLE alignments ADD TABLE alignments_1;
+
+SELECT COUNT(*) FROM alignments;
+
+ALTER TABLE alignments ADD TABLE alignments_2;
+
+SELECT COUNT(*) FROM alignments;
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
@@ -564,7 +564,7 @@ alter_table(mvc *sql, char *sname, sql_t
sql_column *c = n->data;
sql_column *nc = mvc_bind_column(sql, nt, c->base.name);
- if (c->null != nc->null) {
+ if (c->null != nc->null && isTable(nt)) {
mvc_null(sql, nc, c->null);
/* for non empty check for nulls */
if (c->null == 0) {
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
@@ -604,7 +604,7 @@ table_element(mvc *sql, symbol *s, sql_s
{
int res = SQL_OK;
- if (alter && (isView(t) || ((isMergeTable(t) || isReplicaTable(t)) &&
s->token != SQL_TABLE && s->token != SQL_DROP_TABLE) || (isTable(t) &&
(s->token == SQL_TABLE || s->token == SQL_DROP_TABLE)) )){
+ if (alter && (isView(t) || ((isMergeTable(t) || isReplicaTable(t)) &&
(s->token != SQL_TABLE && s->token != SQL_DROP_TABLE && cs_size(&t->tables)>0))
|| (isTable(t) && (s->token == SQL_TABLE || s->token == SQL_DROP_TABLE)) )){
char *msg = "";
switch (s->token) {
@@ -1072,6 +1072,21 @@ rel_check_tables(mvc *sql, sql_table *nt
return -2;
}
}
+ if (cs_size(&nt->idxs) != cs_size(&nnt->idxs)) {
+ (void) sql_error(sql, 02, "3F000!ALTER MERGE TABLE: to be added
table index doesn't match MERGE TABLE definition");
+ return -1;
+ }
+ if (cs_size(&nt->idxs))
+ for (n = nt->idxs.set->h, m = nnt->idxs.set->h; n && m; n = n->next, m
= m->next) {
+ sql_idx *ni = n->data;
+ sql_idx *mi = m->data;
+
+ /* todo check def */
+ if (ni->type != mi->type) {
+ (void) sql_error(sql, 02, "3F000!ALTER MERGE TABLE: to
be added table index type doesn't match MERGE TABLE definition");
+ return -2;
+ }
+ }
return 0;
}
@@ -1120,6 +1135,9 @@ rel_alter_table(mvc *sql, dlist *qname,
if (t->s && !nt->s)
nt->s = t->s;
+ if (nt->type == tt_merge_table)
+ return sql_error(sql, 02, "42S02!ALTER TABLE:
read only MERGE TABLES are not supported");
+
if (state == tr_readonly) {
nt = mvc_readonly(sql, nt, 1);
} else {
@@ -1162,6 +1180,9 @@ rel_alter_table(mvc *sql, dlist *qname,
}
}
+ if (!isTable(nt))
+ return res;
+
/* new columns need update with default values */
updates = table_update_array(sql, nt);
e = exp_column(sql->sa, nt->base.name, "%TID%",
sql_bind_localtype("oid"), CARD_MULTI, 0, 1);
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -364,6 +364,7 @@ extern void sql_trans_end(sql_session *s
extern list* sql_trans_schema_user_dependencies(sql_trans *tr, int schema_id);
extern void sql_trans_create_dependency(sql_trans *tr, int id, int depend_id,
short depend_type);
extern void sql_trans_drop_dependencies(sql_trans *tr, int depend_id);
+extern void sql_trans_drop_dependency(sql_trans *tr, int id, int depend_id,
short depend_type);
extern list* sql_trans_get_dependencies(sql_trans *tr, int id, short
depend_type, list *ignore_ids);
extern int sql_trans_get_dependency_type(sql_trans *tr, int depend_id, short
depend_type);
extern int sql_trans_check_dependency(sql_trans *tr, int id, int depend_id,
short depend_type);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3916,7 +3916,8 @@ sql_trans_add_table(sql_trans *tr, sql_t
sql_table *sysobj = find_sql_table(syss, "objects");
int nr = list_length(mt->tables.set);
- /* TODO add dependency betweem mt/pt */
+ /* merge table depends on part table */
+ sql_trans_create_dependency(tr, pt->base.id, mt->base.id,
TABLE_DEPENDENCY);
cs_add(&mt->tables, pt, TR_NEW);
pt->p = mt;
mt->s->base.wtime = mt->base.wtime = tr->wtime = tr->wstime;
@@ -3932,7 +3933,8 @@ sql_trans_del_table(sql_trans *tr, sql_t
node *n = cs_find_name(&mt->tables, pt->base.name);
oid rid = table_funcs.column_find_row(tr, find_sql_column(sysobj,
"name"), pt->base.name, NULL);
- /* TODO drop dependency betweem mt/pt */
+ /* merge table depends on part table */
+ sql_trans_create_dependency(tr, pt->base.id, mt->base.id,
TABLE_DEPENDENCY);
cs_del(&mt->tables, n, pt->base.flag);
mt->s->base.wtime = mt->base.wtime = tr->wtime = tr->wstime;
table_funcs.table_delete(tr, sysobj, rid);
diff --git a/sql/storage/store_dependency.c b/sql/storage/store_dependency.c
--- a/sql/storage/store_dependency.c
+++ b/sql/storage/store_dependency.c
@@ -63,6 +63,25 @@ sql_trans_drop_dependencies(sql_trans* t
table_funcs.rids_destroy(rs);
}
+/*Function to drop the dependency between object and target, ie
obj_id/depend_id*/
+void
+sql_trans_drop_dependency(sql_trans* tr, sqlid obj_id, sqlid depend_id, short
depend_type)
+{
+ oid rid;
+ sql_schema * s = find_sql_schema(tr, "sys");
+ sql_table* deps = find_sql_table(s, "dependencies");
+ sql_column *dep_obj_id = find_sql_column(deps, "id");
+ sql_column *dep_dep_id = find_sql_column(deps, "depend_id");
+ sql_column *dep_dep_type = find_sql_column(deps, "depend_type");
+ rids *rs;
+
+ rs = table_funcs.rids_select(tr, dep_obj_id, &obj_id, &obj_id,
dep_dep_id, &depend_id, &depend_id, dep_dep_type, &depend_type, &depend_type,
NULL);
+ for(rid = table_funcs.rids_next(rs); rid != oid_nil; rid =
table_funcs.rids_next(rs))
+ table_funcs.table_delete(tr, deps, rid);
+ table_funcs.rids_destroy(rs);
+}
+
+
/*It returns a list with depend_id_1, depend_type_1, depend_id_2,
depend_type_2, ....*/
list*
sql_trans_get_dependencies(sql_trans* tr, int id, short depend_type, list *
ignore_ids)
diff --git a/sql/test/mergetables/Tests/All b/sql/test/mergetables/Tests/All
--- a/sql/test/mergetables/Tests/All
+++ b/sql/test/mergetables/Tests/All
@@ -5,7 +5,6 @@ emptymergequery
alter
types
forex
-#mergedrop corrupts the database
-#mergekey crashes based on select
-#crash0 crashes the server
-
+mergedrop
+mergekey
+crash0
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list