Changeset: 60d3da464f74 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=60d3da464f74
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
monetdb5/modules/atoms/uuid.c
sql/backends/monet5/sql_upgrades.c
sql/scripts/45_uuid.sql
sql/test/sys-schema/Tests/systemfunctions.stable.out
sql/test/sys-schema/Tests/systemfunctions.stable.out.int128
Branch: Oct2020
Log Message:
Fixed bug 7011. Add a version of sys.uuid function with a dummy parameter, so
it gets a bulk implementation
diffs (220 lines):
diff --git a/clients/Tests/MAL-signatures.stable.out
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -6523,6 +6523,7 @@ stdout of test 'MAL-signatures` in direc
[ "batudf", "fuse", "command batudf.fuse(X_1:bat[:int],
X_2:bat[:int]):bat[:lng] ", "UDFBATfuse;", "" ]
[ "batudf", "fuse", "command batudf.fuse(X_1:bat[:sht],
X_2:bat[:sht]):bat[:int] ", "UDFBATfuse;", "" ]
[ "batudf", "reverse", "command
batudf.reverse(X_1:bat[:str]):bat[:str] ", "UDFBATreverse;", "" ]
+[ "batuuid", "new", "unsafe command batuuid.new(X_1:bat[:int]):bat[:uuid]
", "UUIDgenerateUuidInt_bulk;", "" ]
[ "batxml", "attribute", "command batxml.attribute(X_1:str,
X_2:bat[:str]):bat[:xml] ", "BATXMLattribute;", "" ]
[ "batxml", "comment", "command
batxml.comment(X_1:bat[:str]):bat[:xml] ", "BATXMLcomment;", "" ]
[ "batxml", "concat", "command batxml.concat(X_1:bat[:xml],
X_2:bat[:xml]):bat[:xml] ", "BATXMLconcat;", "" ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -9124,6 +9124,7 @@ stdout of test 'MAL-signatures` in direc
[ "batudf", "fuse", "command batudf.fuse(X_1:bat[:lng],
X_2:bat[:lng]):bat[:hge] ", "UDFBATfuse;", "" ]
[ "batudf", "fuse", "command batudf.fuse(X_1:bat[:sht],
X_2:bat[:sht]):bat[:int] ", "UDFBATfuse;", "" ]
[ "batudf", "reverse", "command
batudf.reverse(X_1:bat[:str]):bat[:str] ", "UDFBATreverse;", "" ]
+[ "batuuid", "new", "unsafe command batuuid.new(X_1:bat[:int]):bat[:uuid]
", "UUIDgenerateUuidInt_bulk;", "" ]
[ "batxml", "attribute", "command batxml.attribute(X_1:str,
X_2:bat[:str]):bat[:xml] ", "BATXMLattribute;", "" ]
[ "batxml", "comment", "command
batxml.comment(X_1:bat[:str]):bat[:xml] ", "BATXMLcomment;", "" ]
[ "batxml", "concat", "command batxml.concat(X_1:bat[:xml],
X_2:bat[:xml]):bat[:xml] ", "BATXMLconcat;", "" ]
diff --git a/monetdb5/modules/atoms/uuid.c b/monetdb5/modules/atoms/uuid.c
--- a/monetdb5/modules/atoms/uuid.c
+++ b/monetdb5/modules/atoms/uuid.c
@@ -189,22 +189,9 @@ UUIDcompare(const void *L, const void *R
#endif
}
-static str
-#ifdef HAVE_HGE
-UUIDgenerateUuid(uuid *retval)
-#else
-UUIDgenerateUuid(uuid **retval)
-#endif
+static inline void
+UUIDgenerateUuid_internal(uuid *u)
{
- uuid *u;
-
-#ifdef HAVE_HGE
- u = retval;
-#else
- if (*retval == NULL && (*retval = GDKmalloc(UUID_SIZE)) == NULL)
- throw(MAL, "uuid.new", SQLSTATE(HY013) MAL_MALLOC_FAIL);
- u = *retval;
-#endif
#ifdef HAVE_UUID
uuid_generate(u->u);
#else
@@ -226,6 +213,25 @@ UUIDgenerateUuid(uuid **retval)
/* make sure this is version 4 (random UUID) */
u->u[6] = (u->u[6] & 0x0F) | 0x40;
#endif
+}
+
+static str
+#ifdef HAVE_HGE
+UUIDgenerateUuid(uuid *retval)
+#else
+UUIDgenerateUuid(uuid **retval)
+#endif
+{
+ uuid *u;
+
+#ifdef HAVE_HGE
+ u = retval;
+#else
+ if (*retval == NULL && (*retval = GDKmalloc(UUID_SIZE)) == NULL)
+ throw(MAL, "uuid.new", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ u = *retval;
+#endif
+ UUIDgenerateUuid_internal(u);
return MAL_SUCCEED;
}
@@ -241,6 +247,42 @@ UUIDgenerateUuidInt(uuid **retval, int *
}
static str
+UUIDgenerateUuidInt_bulk(bat *ret, const bat *bid)
+{
+ BAT *b = NULL, *bn = NULL;
+ BUN n = 0;
+ str msg = MAL_SUCCEED;
+ uuid *restrict bnt = NULL;
+
+ if ((b = BATdescriptor(*bid)) == NULL) {
+ msg = createException(MAL, "uuid.generateuuidint_bulk",
SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
+ goto bailout;
+ }
+ n = BATcount(b);
+ if ((bn = COLnew(b->hseqbase, TYPE_uuid, n, TRANSIENT)) == NULL) {
+ msg = createException(MAL, "uuid.generateuuidint_bulk",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ bnt = Tloc(bn, 0);
+ for (BUN i = 0 ; i < n ; i++)
+ UUIDgenerateUuid_internal(&(bnt[i]));
+ bn->tnonil = true;
+ bn->tnil = false;
+ BATsetcount(bn, n);
+ bn->tsorted = n < 2;
+ bn->tkey = n < 2;
+
+bailout:
+ if (b)
+ BBPunfix(b->batCacheid);
+ if (msg && bn)
+ BBPreclaim(bn);
+ else if (bn)
+ BBPkeepref(*ret = bn->batCacheid);
+ return msg;
+}
+
+static str
UUIDisaUUID(bit *retval, str *s)
{
uuid u;
@@ -361,6 +403,7 @@ mel_func uuid_init_funcs[] = {
command("uuid", "prelude", UUIDprelude, false, "", args(1,1, arg("",void))),
command("uuid", "new", UUIDgenerateUuid, true, "Generate a new uuid",
args(1,1, arg("",uuid))),
command("uuid", "new", UUIDgenerateUuidInt, true, "Generate a new uuid (dummy
version for side effect free multiplex loop)", args(1,2,
arg("",uuid),arg("d",int))),
+ command("batuuid", "new", UUIDgenerateUuidInt_bulk, true, "Generate a new
uuid (dummy version for side effect free multiplex loop)", args(1,2,
batarg("",uuid),batarg("d",int))),
command("uuid", "uuid", UUIDstr2uuid, false, "Coerce a string to a uuid,
validating its format", args(1,2, arg("",uuid),arg("s",str))),
command("uuid", "str", UUIDuuid2str, false, "Coerce a uuid to its string
type", args(1,2, arg("",str),arg("u",uuid))),
command("uuid", "isaUUID", UUIDisaUUID, false, "Test a string for a UUID
format", args(1,2, arg("",bit),arg("u",str))),
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
@@ -2515,30 +2515,29 @@ sql_update_oct2020_sp1(Client c, mvc *sq
{
size_t bufsize = 1024, pos = 0;
char *buf = NULL, *err = NULL;
- res_table *output = NULL;
- BAT *b = NULL;
+
+ if (!sql_bind_func(sql->sa, mvc_bind_schema(sql, "sys"), "uuid",
sql_bind_localtype("int"), NULL, F_FUNC)) {
+ if ((buf = GDKmalloc(bufsize)) == NULL)
+ throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
- if ((buf = GDKmalloc(bufsize)) == NULL)
- throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ if (!*systabfixed && (err = sql_fix_system_tables(c, sql,
prev_schema)) != NULL) {
+ GDKfree(buf);
+ return err;
+ }
+ *systabfixed = true;
- /* if there are 4 'log' functions of the same name in the catalog:
((base 'e' or any base) * (flt or dbl)), then upgrade */
- pos += snprintf(buf + pos, bufsize - pos,
- "select id from sys.functions where
name = 'log' and mod = 'mmath' and func = 'log' and system = true;\n");
- assert(pos < bufsize);
- if ((err = SQLstatementIntern(c, buf, "update", true, false, &output)))
- goto bailout;
- if ((b = BATdescriptor(output->cols[0].b))) {
- if (BATcount(b) == 4) {
- if (!*systabfixed && (err = sql_fix_system_tables(c,
sql, prev_schema)) != NULL)
- goto bailout;
- *systabfixed = true;
- }
+ pos += snprintf(buf + pos, bufsize - pos, "set schema sys;\n");
+ /* 45_uuid.sql */
+ pos += snprintf(buf + pos, bufsize - pos,
+ "create function sys.uuid(d int) returns uuid\n"
+ " external name uuid.\"new\";\n"
+ "GRANT EXECUTE ON FUNCTION sys.uuid(int) TO PUBLIC;");
+
+ pos += snprintf(buf + pos, bufsize - pos, "set schema
\"%s\";\n", prev_schema);
+ assert(pos < bufsize);
+ printf("Running database upgrade commands:\n%s\n", buf);
+ err = SQLstatementIntern(c, buf, "update", true, false, NULL);
}
-bailout:
- if (b)
- BBPunfix(b->batCacheid);
- if (output)
- res_table_destroy(output);
GDKfree(buf);
return err; /* usually MAL_SUCCEED */
}
diff --git a/sql/scripts/45_uuid.sql b/sql/scripts/45_uuid.sql
--- a/sql/scripts/45_uuid.sql
+++ b/sql/scripts/45_uuid.sql
@@ -14,6 +14,11 @@ create function sys.uuid()
returns uuid external name uuid."new";
GRANT EXECUTE ON FUNCTION sys.uuid() TO PUBLIC;
+-- generate a new uuid with a dummy parameter, so it can be called for a column
+create function sys.uuid(d int)
+returns uuid external name uuid."new";
+GRANT EXECUTE ON FUNCTION sys.uuid(int) TO PUBLIC;
+
create function sys.isaUUID(s string)
returns boolean external name uuid."isaUUID";
GRANT EXECUTE ON FUNCTION sys.isaUUID(string) TO PUBLIC;
diff --git a/sql/test/sys-schema/Tests/systemfunctions.stable.out
b/sql/test/sys-schema/Tests/systemfunctions.stable.out
--- a/sql/test/sys-schema/Tests/systemfunctions.stable.out
+++ b/sql/test/sys-schema/Tests/systemfunctions.stable.out
@@ -3659,6 +3659,8 @@ stdout of test 'systemfunctions` in dire
[ "sys", "user_statistics", 5, "bigint", "" ]
[ "sys", "user_statistics", 6, "clob", "" ]
[ "sys", "uuid", 0, "uuid", "create function sys.uuid()\nreturns
uuid external name uuid.\"new\";" ]
+[ "sys", "uuid", 0, "uuid", "create function sys.uuid(d
int)\nreturns uuid external name uuid.\"new\";" ]
+[ "sys", "uuid", 1, "int", "" ]
[ "sys", "vacuum", 0, "clob", "create procedure vacuum(sys
string, tab string)\nexternal name sql.vacuum;" ]
[ "sys", "vacuum", 1, "clob", "" ]
[ "sys", "var", 0, "char", "create function \"sys\".\"var\"()
returns table(\"schema\" string, \"name\" string, \"type\" string, \"value\"
string) external name \"sql\".\"sql_variables\";" ]
diff --git a/sql/test/sys-schema/Tests/systemfunctions.stable.out.int128
b/sql/test/sys-schema/Tests/systemfunctions.stable.out.int128
--- a/sql/test/sys-schema/Tests/systemfunctions.stable.out.int128
+++ b/sql/test/sys-schema/Tests/systemfunctions.stable.out.int128
@@ -4139,6 +4139,8 @@ stdout of test 'systemfunctions` in dire
[ "sys", "user_statistics", 5, "bigint", "" ]
[ "sys", "user_statistics", 6, "clob", "" ]
[ "sys", "uuid", 0, "uuid", "create function sys.uuid()\nreturns
uuid external name uuid.\"new\";" ]
+[ "sys", "uuid", 0, "uuid", "create function sys.uuid(d
int)\nreturns uuid external name uuid.\"new\";" ]
+[ "sys", "uuid", 1, "int", "" ]
[ "sys", "vacuum", 0, "clob", "create procedure vacuum(sys
string, tab string)\nexternal name sql.vacuum;" ]
[ "sys", "vacuum", 1, "clob", "" ]
[ "sys", "var", 0, "char", "create function \"sys\".\"var\"()
returns table(\"schema\" string, \"name\" string, \"type\" string, \"value\"
string) external name \"sql\".\"sql_variables\";" ]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list