Changeset: e2316a532be7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e2316a532be7
Modified Files:
sql/server/rel_schema.c
sql/server/rel_schema.h
Branch: Aug2024
Log Message:
Merges with Dec2023
diffs (138 lines):
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/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]