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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org