Changeset: 9ef27526d702 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9ef27526d702
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_upgrades.c
        sql/scripts/49_strings.sql
Branch: odbc_loader
Log Message:

Add upgrade code to normalize the URLs of existing remote tables

Create sys.normalize_monetdb_url(url string) to do so


diffs (103 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -31,6 +31,7 @@
 #include "rel_exp.h"
 #include "rel_dump.h"
 #include "rel_physical.h"
+#include "rel_remote.h"
 #include "mal.h"
 #include "mal_client.h"
 #include "mal_interpreter.h"
@@ -5584,6 +5585,44 @@ bailout:
        throw(SQL, "SQLread_dump_rel", SQLSTATE(HY013) MAL_MALLOC_FAIL);
 }
 
+static str
+SQLnormalize_monetdb_url(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci)
+{
+       (void)mb;
+       str *ret = getArgReference_str(stk, pci, 0);
+       str url = *getArgReference_str(stk, pci, 1);
+       allocator *sa;
+       backend *be = NULL;
+       str msg;
+       msettings_error err;
+       str normalized;
+
+       if (strNil(url))
+               throw(MAL, "SQLnormalize_monetdb_url", SQLSTATE(42000) "url 
cannot be nil");
+
+       if ((msg = getBackendContext(cntxt, &be)) != NULL)
+               return msg;
+       sa = be->mvc->sa;
+
+       msettings *mp = sa_msettings_create(sa);
+       if (mp == NULL)
+               throw(SQL, "SQLnormalize_monetdb_url", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+
+       err = msettings_parse_url(mp, url);
+       if (err != NULL)
+               throw(SQL, "SQLnormalize_monetdb_url", SQLSTATE(42000) "Invalid 
URL: %s", err);
+
+       normalized = sa_msettings_to_string(mp, sa, strlen(url));
+       if (normalized == NULL)
+               throw(SQL, "SQLnormalize_monetdb_url", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+
+       *ret = _STRDUP(normalized);
+
+       return MAL_SUCCEED;
+}
+
+
+
 
 static mel_func sql_init_funcs[] = {
  pattern("sql", "shutdown", SQLshutdown_wrap, true, "", args(1,3, 
arg("",str),arg("delay",bte),arg("force",bit))),
@@ -6518,6 +6557,7 @@ static mel_func sql_init_funcs[] = {
  pattern("sql", "stop_vacuum", SQLstr_stop_vacuum, true, "stop auto vacuum", 
args(0,2, arg("sname",str),arg("tname",str))),
  pattern("sql", "check", SQLcheck, false, "Return sql string of check 
constraint.", args(1,3, arg("sql",str), arg("sname", str), arg("name", str))),
  pattern("sql", "read_dump_rel", SQLread_dump_rel, false, "Reads sql_rel 
string into sql_rel object and then writes it to the return value", args(1,2, 
arg("sql",str), arg("sql_rel", str))),
+ pattern("sql", "normalize_monetdb_url", SQLnormalize_monetdb_url, false, 
"Normalize mapi:monetdb://, monetdb:// or monetdbs:// URL", args(1,2, 
arg("",str),arg("u",str))),
  { .imp=NULL }
 };
 #include "mal_import.h"
diff --git a/sql/backends/monet5/sql_upgrades.c 
b/sql/backends/monet5/sql_upgrades.c
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -4735,6 +4735,23 @@ sql_update_default(Client c, mvc *sql, s
                        return err;
        }
 
+       sql_find_subtype(&tp, "varchar", 0, 0);
+       if (!sql_bind_func(sql, s->base.name, "normalize_monetdb_url", &tp, 
NULL, F_FUNC, true, true)) {
+               sql->session->status = 0; /* if the function was not found 
clean the error */
+               sql->errstr[0] = '\0';
+               const char query[] =
+                       "create function sys.normalize_monetdb_url(u string)\n"
+                       "returns string external name 
sql.normalize_monetdb_url;\n"
+                       "grant execute on function 
sys.normalize_monetdb_url(string) to public;\n"
+                       "update sys.functions set system = true where system <> 
true and name = 'normalize_monetdb_url' and schema_id = 2000;\n"
+                       "update sys._tables set query = 
sys.normalize_monetdb_url(query) where type in (5,6);";
+               printf("Running database upgrade commands:\n%s\n", query);
+               fflush(stdout);
+               err = SQLstatementIntern(c, query, "update", true, false, NULL);
+               if (err)
+                       return err;
+       }
+
        return err;
 }
 
diff --git a/sql/scripts/49_strings.sql b/sql/scripts/49_strings.sql
--- a/sql/scripts/49_strings.sql
+++ b/sql/scripts/49_strings.sql
@@ -66,3 +66,8 @@ GRANT EXECUTE ON AGGREGATE sys.group_con
 create aggregate sys.group_concat(str string, sep string) returns string with 
order
        external name "aggr"."str_group_concat";
 GRANT EXECUTE ON AGGREGATE sys.group_concat(string, string) TO PUBLIC;
+
+create function sys.normalize_monetdb_url(u string)
+returns string external name sql.normalize_monetdb_url;
+grant execute on function sys.normalize_monetdb_url(string) to public;
+
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to