Changeset: d99800f98e70 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d99800f98e70
Modified Files:
        clients/Tests/MAL-signatures-hge.test
        clients/mapilib/connect_openssl.c
        cmake/monetdb-findpackages.cmake
        gdk/gdk.h
        gdk/gdk_string.c
        monetdb5/modules/kernel/aggr.c
        sql/ChangeLog
        sql/backends/monet5/sql_upgrades.c
        sql/scripts/49_strings.sql
        
sql/test/emptydb-previous-upgrade-chain-hge/Tests/upgrade.stable.out.int128
        sql/test/emptydb-previous-upgrade-chain/Tests/upgrade.stable.out
        sql/test/emptydb-previous-upgrade-chain/Tests/upgrade.stable.out.int128
        sql/test/emptydb-previous-upgrade-hge/Tests/upgrade.stable.out.int128
        sql/test/emptydb-previous-upgrade/Tests/upgrade.stable.out
        sql/test/emptydb-previous-upgrade/Tests/upgrade.stable.out.int128
        sql/test/emptydb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out
        sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.int128
        sql/test/emptydb-upgrade-hge/Tests/upgrade.stable.out.int128
        sql/test/emptydb-upgrade/Tests/upgrade.stable.out
        sql/test/emptydb-upgrade/Tests/upgrade.stable.out.int128
        sql/test/emptydb/Tests/check.stable.out.int128
        
sql/test/testdb-previous-upgrade-chain-hge/Tests/upgrade.stable.out.int128
        sql/test/testdb-previous-upgrade-chain/Tests/upgrade.stable.out
        sql/test/testdb-previous-upgrade-chain/Tests/upgrade.stable.out.int128
        sql/test/testdb-previous-upgrade-hge/Tests/upgrade.stable.out.int128
        sql/test/testdb-previous-upgrade/Tests/upgrade.stable.out
        sql/test/testdb-previous-upgrade/Tests/upgrade.stable.out.int128
        sql/test/testdb-upgrade-chain-hge/Tests/upgrade.stable.out.int128
        sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
        sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out.int128
        sql/test/testdb-upgrade-hge/Tests/upgrade.stable.out.int128
        sql/test/testdb-upgrade/Tests/upgrade.stable.out
        sql/test/testdb-upgrade/Tests/upgrade.stable.out.int128
Branch: default
Log Message:

Implemented digest aggregates.  See sql/ChangeLog.


diffs (truncated from 1285 to 300 lines):

diff --git a/clients/Tests/MAL-signatures-hge.test 
b/clients/Tests/MAL-signatures-hge.test
--- a/clients/Tests/MAL-signatures-hge.test
+++ b/clients/Tests/MAL-signatures-hge.test
@@ -1044,6 +1044,36 @@ command aggr.quantile_avg(X_0:bat[:any_1
 AGGRquantile_avg_cst
 Quantile aggregate
 aggr
+ripemd160
+command aggr.ripemd160(X_0:bat[:str]):str
+AGGRripemd160
+Ungrouped RIPEMD160
+aggr
+sha1
+command aggr.sha1(X_0:bat[:str]):str
+AGGRsha1
+Ungrouped SHA1
+aggr
+sha224
+command aggr.sha224(X_0:bat[:str]):str
+AGGRsha224
+Ungrouped SHA224
+aggr
+sha256
+command aggr.sha256(X_0:bat[:str]):str
+AGGRsha256
+Ungrouped SHA256
+aggr
+sha384
+command aggr.sha384(X_0:bat[:str]):str
+AGGRsha384
+Ungrouped SHA384
+aggr
+sha512
+command aggr.sha512(X_0:bat[:str]):str
+AGGRsha512
+Ungrouped SHA512
+aggr
 stdev
 command aggr.stdev(X_0:bat[:bte], X_1:bat[:oid], X_2:bat[:any_1]):bat[:dbl]
 AGGRstdev3_dbl
@@ -2034,6 +2064,36 @@ command aggr.subquantile_avg(X_0:bat[:an
 AGGRsubquantilecand_avg
 Grouped quantile aggregate with candidate list
 aggr
+subripemd160
+command aggr.subripemd160(X_0:bat[:str], X_1:bat[:oid], X_2:bat[:any_1], 
X_3:bit):bat[:str]
+AGGRripemd160grouped
+Grouped RIPEMD160
+aggr
+subsha1
+command aggr.subsha1(X_0:bat[:str], X_1:bat[:oid], X_2:bat[:any_1], 
X_3:bit):bat[:str]
+AGGRsha1grouped
+Grouped SHA1
+aggr
+subsha224
+command aggr.subsha224(X_0:bat[:str], X_1:bat[:oid], X_2:bat[:any_1], 
X_3:bit):bat[:str]
+AGGRsha224grouped
+Grouped SHA224
+aggr
+subsha256
+command aggr.subsha256(X_0:bat[:str], X_1:bat[:oid], X_2:bat[:any_1], 
X_3:bit):bat[:str]
+AGGRsha256grouped
+Grouped SHA256
+aggr
+subsha384
+command aggr.subsha384(X_0:bat[:str], X_1:bat[:oid], X_2:bat[:any_1], 
X_3:bit):bat[:str]
+AGGRsha384grouped
+Grouped SHA384
+aggr
+subsha512
+command aggr.subsha512(X_0:bat[:str], X_1:bat[:oid], X_2:bat[:any_1], 
X_3:bit):bat[:str]
+AGGRsha512grouped
+Grouped SHA512
+aggr
 substdev
 command aggr.substdev(X_0:bat[:bte], X_1:bat[:oid], X_2:bat[:any_1], 
X_3:bit):bat[:dbl]
 AGGRsubstdev_dbl
diff --git a/clients/mapilib/connect_openssl.c 
b/clients/mapilib/connect_openssl.c
--- a/clients/mapilib/connect_openssl.c
+++ b/clients/mapilib/connect_openssl.c
@@ -139,7 +139,7 @@ verify_server_certificate_hash(Mapi mid,
        }
        assert(buf);
 
-       // Compute the has of the DER using the deprecated API so we stay
+       // Compute the hash of the DER using the deprecated API so we stay
        // compatible with OpenSSL 1.1.1.
        SHA256_CTX sha256;
        if (1 != SHA256_Init(&sha256)) {
diff --git a/cmake/monetdb-findpackages.cmake b/cmake/monetdb-findpackages.cmake
--- a/cmake/monetdb-findpackages.cmake
+++ b/cmake/monetdb-findpackages.cmake
@@ -126,7 +126,7 @@ if(WITH_MALLOC)
 endif()
 
 if(WITH_OPENSSL)
-  find_package(OpenSSL 1.1.1)
+  find_package(OpenSSL 3.0.0)
 endif()
 
 find_package(Sphinx)
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1549,6 +1549,9 @@ gdk_export BAT *BATtolower(BAT *b, BAT *
 gdk_export BAT *BATcasefold(BAT *b, BAT *s);
 gdk_export gdk_return GDKasciify(char **restrict buf, size_t *restrict buflen, 
const char *restrict s);
 gdk_export BAT *BATasciify(BAT *b, BAT *s);
+#ifdef HAVE_OPENSSL
+gdk_return BATaggrdigest(allocator *ma, BAT **bnp, char **shap, const char 
*digest, BAT *b, BAT *g, BAT *e, BAT *s, bool skip_nils);
+#endif
 
 gdk_export BAT *BATsample(BAT *b, BUN n);
 gdk_export BAT *BATsample_with_seed(BAT *b, BUN n, uint64_t seed);
diff --git a/gdk/gdk_string.c b/gdk/gdk_string.c
--- a/gdk/gdk_string.c
+++ b/gdk/gdk_string.c
@@ -9688,3 +9688,122 @@ BATasciify(BAT *b, BAT *s)
        BBPreclaim(bn);
        return NULL;
 }
+
+#ifdef HAVE_OPENSSL
+
+#include <openssl/evp.h>
+
+gdk_return
+BATaggrdigest(allocator *ma, BAT **bnp, char **shap, const char *digest,
+             BAT *b, BAT *g, BAT *e, BAT *s, bool skip_nils)
+{
+       oid min, max;
+       BUN ngrp;
+       struct canditer ci;
+       const char *err;
+       const oid *gids = g ? (const oid *) Tloc(g, 0) : NULL;
+       oid gid = 0;
+       QryCtx *qry_ctx = MT_thread_get_qry_ctx();
+       BAT *bn = NULL;
+
+       /* exactly one of bnp and shap should be non-NULL */
+       assert(bnp == NULL || shap == NULL);
+       assert(bnp != NULL || shap != NULL);
+
+       if ((err = BATgroupaggrinit(b, g, e, s, &min, &max, &ngrp, &ci)) != 
NULL) {
+               GDKerror("%s\n", err);
+               return GDK_FAIL;
+       }
+
+       if (bnp) {
+               if ((bn = COLnew(min, TYPE_str, ngrp, TRANSIENT)) == NULL)
+                       return GDK_FAIL;
+               *bnp = bn;
+       }
+
+       BATiter bi = bat_iterator(b);
+
+       allocator *ta = MT_thread_getallocator();
+       allocator_state ta_state = ma_open(ta);
+
+       const EVP_MD *md;
+       md = EVP_get_digestbyname(digest);
+       EVP_MD_CTX **mdctx = ma_zalloc(ta, ngrp * sizeof(*mdctx));
+       if (mdctx == NULL)
+               goto bailout;
+
+       TIMEOUT_LOOP_IDX_DECL(i, ci.ncand, qry_ctx) {
+               oid p = canditer_next(&ci) - b->hseqbase;
+               if (gids)
+                       gid = gids[p];
+               else if (g)
+                       gid = p;
+               const char *s = BUNtvar(bi, p);
+               if (strNil(s)) {
+                       if (!skip_nils) {
+                               EVP_MD_CTX_free(mdctx[gid]);
+                               mdctx[gid] = (EVP_MD_CTX *) -1;
+                       }
+                       continue;
+               }
+               if (mdctx[gid] == NULL) {
+                       mdctx[gid] = EVP_MD_CTX_new();
+                       if (mdctx[gid] == NULL || 
!EVP_DigestInit_ex2(mdctx[gid], md, NULL)) {
+                               goto bailout;
+                       }
+               } else if (mdctx[gid] == (EVP_MD_CTX *) -1) {
+                       continue;
+               }
+               /* calculate digest including terminating NUL byte */
+               if (!EVP_DigestUpdate(mdctx[gid], s, strlen(s) + 1)) {
+                       goto bailout;
+               }
+       }
+       TIMEOUT_CHECK(qry_ctx,
+                     GOTO_LABEL_TIMEOUT_HANDLER(bailout, qry_ctx));
+
+       unsigned char md_value[EVP_MAX_MD_SIZE];
+       unsigned int md_len;
+       char digestbuf[EVP_MAX_MD_SIZE * 2 + 1];
+
+       for (gid = 0; gid < ngrp; gid++) {
+               if (mdctx[gid] == NULL || mdctx[gid] == (EVP_MD_CTX *) -1) {
+                       strcpy_len(digestbuf, str_nil, sizeof(digestbuf));
+               } else {
+                       if (!EVP_DigestFinal_ex(mdctx[gid], md_value, &md_len)) 
{
+                               goto bailout;
+                       }
+                       for (unsigned int x = 0; x < md_len; x++) {
+                               digestbuf[x * 2] = 
"0123456789abcdef"[md_value[x] >> 4];
+                               digestbuf[x * 2 + 1] = 
"0123456789abcdef"[md_value[x] & 0xF];
+                       }
+                       digestbuf[2 * md_len] = 0;
+                       EVP_MD_CTX_free(mdctx[gid]);
+               }
+               if (bnp) {
+                       if (BUNappend(bn, digestbuf, false) != GDK_SUCCEED) {
+                               goto bailout;
+                       }
+               } else {
+                       if ((*shap = ma_strdup(ma, digestbuf)) == NULL) {
+                               goto bailout;
+                       }
+               }
+       }
+       bat_iterator_end(&bi);
+       ma_close(ta, &ta_state);
+       return GDK_SUCCEED;
+
+  bailout:
+       bat_iterator_end(&bi);
+       if (mdctx) {
+               for (gid = 0; gid < ngrp; gid++)
+                       if (mdctx[gid] != (EVP_MD_CTX *) -1)
+                               EVP_MD_CTX_free(mdctx[gid]);
+       }
+       ma_close(ta, &ta_state);
+       BBPreclaim(bn);
+       return GDK_FAIL;
+}
+
+#endif
diff --git a/monetdb5/modules/kernel/aggr.c b/monetdb5/modules/kernel/aggr.c
--- a/monetdb5/modules/kernel/aggr.c
+++ b/monetdb5/modules/kernel/aggr.c
@@ -1271,6 +1271,145 @@ AGGRsubstr_group_concat_sep(Client ctx, 
 }
 
 static str
+grpdigest(Client ctx,
+                 bat *retval1, str *retval2, /* one or the other! */
+                 const bat *bid, const bat *gid,
+                 const bat *eid, bool skip_nils,
+                 const char *digest,
+                 const char *malfunc)
+{
+#ifdef HAVE_OPENSSL
+       BAT *b = BATdescriptor(*bid);
+       BAT *g = gid ? BATdescriptor(*gid) : NULL;
+       BAT *e = eid ? BATdescriptor(*eid) : NULL;
+       BAT *bn = NULL;
+
+       /* one or the other, not both */
+       assert(retval1 == NULL || retval2 == NULL);
+       assert(retval1 != NULL || retval2 != NULL);
+
+       if (b == NULL || (gid != NULL && g == NULL) || (eid != NULL && e == 
NULL)) {
+               BBPreclaim(b);
+               BBPreclaim(g);
+               BBPreclaim(e);
+               throw(MAL, malfunc, SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
+       }
+       if (BATaggrdigest(ctx->curprg->def->ma,
+                                         retval1 ? &bn : NULL, retval2,
+                                         digest,
+                                         b, g, e, NULL, skip_nils) != 
GDK_SUCCEED) {
+               BBPreclaim(b);
+               BBPreclaim(g);
+               BBPreclaim(e);
+               throw(MAL, malfunc, GDK_EXCEPTION);
+       }
+       if (retval1) {
+               *retval1 = bn->batCacheid;
+               BBPkeepref(bn);
+       }
+       BBPreclaim(b);
+       BBPreclaim(g);
+       BBPreclaim(e);
+       return MAL_SUCCEED;
+#else
+       (void) ctx;
+       (void) retval1;
+       (void) retval2;
+       (void) bid;
+       (void) gid;
+       (void) eid;
+       (void) skip_nils;
+       (void) digest;
+       throw(MAL, malfunc,
+                 SQLSTATE(0A000) PROGRAM_NYI ": no OpenSSL library available");
+#endif
+}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to