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 -- [email protected]
To unsubscribe send an email to [email protected]