Changeset: cc821318939d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/cc821318939d
Modified Files:
        sql/server/rel_schema.c
        sql/server/rel_schema.h
Branch: Dec2023
Log Message:

Fixes crash for create remote table as subquery #7567


diffs (83 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
@@ -251,6 +251,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_table *t)
 {
@@ -1463,18 +1485,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(sql_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_*/
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to