Changeset: 359aea568f73 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/359aea568f73
Modified Files:
        MonetDB.spec
        sql/server/rel_schema.c
        sql/storage/store.c
Branch: default
Log Message:

Merges Aug2024


diffs (164 lines):

diff --git a/MonetDB.spec b/MonetDB.spec
--- a/MonetDB.spec
+++ b/MonetDB.spec
@@ -711,6 +711,9 @@ Group: Applications/Databases
 Requires: %{name}-SQL%{?_isa} = %{version}-%{release}
 Requires: %{name}-server-devel%{?_isa} = %{version}-%{release}
 Requires: %{name}-embedded-devel%{?_isa} = %{version}-%{release}
+Obsoletes: %{name}-SQL-server5-devel < 11.50.0
+Provides: %{name}-SQL-server5-devel = %{version}-%{release}
+Provides: %{name}-SQL-server5-devel%{?_isa} = %{version}-%{release}
 
 %description SQL-devel
 MonetDB is a database management system that is developed from a
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
@@ -253,6 +253,28 @@ mvc_create_table_as_subquery(mvc *sql, s
        return t;
 }
 
+sql_table *
+mvc_create_remote_as_subquery(mvc *sql, sql_rel *sq, sql_schema *s, const char 
*tname, dlist *column_spec, const char *loc, const char *action)
+{
+       sql_table *t = NULL;
+       switch(mvc_create_remote(&t, sql, s, tname, SQL_DECLARED_TABLE, loc)) {
+               case -1:
+                       return sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+               case -2:
+               case -3:
+                       return sql_error(sql, 02, SQLSTATE(42000) "%s TABLE: 
transaction conflict detected", action);
+               case -4:
+                       return sql_error(sql, 02, SQLSTATE(42000) "%s TABLE: 
the partition's expression is too long", action);
+               case -5:
+                       return NULL;
+               default:
+                       break;
+       }
+       if (as_subquery(sql, t, tt_remote, sq, column_spec, action) != 0)
+               return NULL;
+       return t;
+}
+
 static char *
 table_constraint_name(mvc *sql, symbol *s, sql_schema *ss, sql_table *t)
 {
@@ -1540,18 +1562,32 @@ rel_create_table(sql_query *query, int t
                                                         
TABLE_TYPE_DESCRIPTION(tt, properties));
 
                /* create table */
-               if ((t = mvc_create_table_as_subquery(sql, sq, s, name, 
column_spec, temp, commit_action, (temp == SQL_DECLARED_TABLE)?"DECLARE 
TABLE":"CREATE TABLE")) == NULL) {
-                       rel_destroy(sq);
-                       return NULL;
+               if (tt == tt_remote) {
+                       if (!mapiuri_valid(loc))
+                               return sql_error(sql, 02, SQLSTATE(42000) "%s 
TABLE: incorrect uri '%s' for remote table '%s'", action, loc, name);
+                       if ((t = mvc_create_remote_as_subquery(sql, sq, s, 
name, column_spec, loc, (temp == SQL_DECLARED_TABLE)?"DECLARE TABLE":"CREATE 
TABLE")) == NULL) {
+                               rel_destroy(sq);
+                               return NULL;
+                       }
+               } else {
+                       if ((t = mvc_create_table_as_subquery(sql, sq, s, name, 
column_spec, temp, commit_action, (temp == SQL_DECLARED_TABLE)?"DECLARE 
TABLE":"CREATE TABLE")) == NULL) {
+                               rel_destroy(sq);
+                               return NULL;
+                       }
                }
 
                /* insert query result into this table */
-               temp = (tt == tt_table)?temp:SQL_PERSIST;
-               res = rel_table(sql, ddl_create_table, s->base.name, t, temp);
-               if (with_data) {
-                       res = rel_insert(query->sql, res, sq);
+               if (tt == tt_remote) {
+                       res = rel_create_remote(sql, ddl_create_table, 
s->base.name, t, pw_encrypted, username, password);
+                       /* we cannot insert in remote so just remove the 
subquery */
+                       rel_destroy(sq);
                } else {
-                       rel_destroy(sq);
+                       res = rel_table(sql, ddl_create_table, s->base.name, t, 
(tt == tt_table)?temp:SQL_PERSIST);
+                       if (with_data) {
+                               res = rel_insert(query->sql, res, sq);
+                       } else {
+                               rel_destroy(sq);
+                       }
                }
                return res;
        }
diff --git a/sql/server/rel_schema.h b/sql/server/rel_schema.h
--- a/sql/server/rel_schema.h
+++ b/sql/server/rel_schema.h
@@ -29,5 +29,6 @@ extern sql_rel *rel_create_table(sql_que
 
 extern sql_rel *rel_list(allocator *sa, sql_rel *l, sql_rel *r);
 extern sql_table *mvc_create_table_as_subquery(mvc *sql, sql_rel *sq, 
sql_schema *s, const char *tname, dlist *column_spec, int temp, int 
commit_action, const char* action);
+extern sql_table *mvc_create_remote_as_subquery(mvc *sql, sql_rel *sq, 
sql_schema *s, const char *tname, dlist *column_spec, const char *loc, const 
char *action);
 
 #endif /*_REL_SCHEMA_H_*/
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -7273,7 +7273,8 @@ sql_session_destroy(sql_session *s)
 {
        if (s->tr) {
                sqlstore *store = s->tr->store;
-               store->singleuser--;
+               if (store->singleuser)
+                       store->singleuser--;
        }
        // TODO check if s->tr is not always there
        assert(!s->tr || s->tr->active == 0);
diff --git a/sql/test/remote/Tests/All b/sql/test/remote/Tests/All
--- a/sql/test/remote/Tests/All
+++ b/sql/test/remote/Tests/All
@@ -4,3 +4,4 @@ HAVE_DATA_PATH?invalid_creds
 HAVE_DATA_PATH?different_user
 THREADS>=2?partition_elim
 remote_info_missing
+create-remote-flavors
diff --git a/sql/test/remote/Tests/create-remote-flavors.test 
b/sql/test/remote/Tests/create-remote-flavors.test
new file mode 100644
--- /dev/null
+++ b/sql/test/remote/Tests/create-remote-flavors.test
@@ -0,0 +1,42 @@
+statement ok
+create table foo (n int, m text);
+
+statement ok
+insert into foo values (1, 'alice'), (2, 'bob')
+
+statement ok
+create table foo_empty (n int, m text);
+
+statement ok
+create remote table rmt_1 (n int) on 'mapi:monetdb://localhost:50001/other'
+
+statement error 42000!CREATE TABLE: cannot create REMOTE TABLE 'with data' 
+create remote table rmt_2 as
+    select * from foo with data
+    on 'mapi:monetdb://localhost:50001/other'
+
+statement ok
+create remote table rmt_2 as
+    select * from foo with no data
+    on 'mapi:monetdb://localhost:50001/other'
+
+statement ok
+create remote table rmt_3 (n_rmt, l_rmt) as
+    select * from foo with no data
+    on 'mapi:monetdb://localhost:50001/other'
+
+statement error 42000!CREATE TABLE: cannot create REMOTE TABLE 'with data' 
+create remote table rmt_4 as
+    select * from foo_empty with data
+    on 'mapi:monetdb://localhost:50001/other'
+
+statement ok
+create remote table rmt_4 as
+    select * from foo_empty with no data
+    on 'mapi:monetdb://localhost:50001/other'
+
+statement ok
+create remote table rmt_5 (n_rmt, l_rmt) as
+    select * from foo_empty with no data
+    on 'mapi:monetdb://localhost:50001/other'
+
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to