diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2021-12-14 11:45:34 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2021-12-14 11:45:34 +0200 |
commit | bc9f505f80633e537d5077534f4d8809c65c8162 (patch) | |
tree | 64b10a617bef8a4245cf81445339bb7d2d2e4e22 /mysql-test | |
parent | ea9489536911b083c5e28b15c071cf6931247b7e (diff) | |
download | mariadb-git-preview-10.8-MDEV-27208.tar.gz |
MDEV-27208: Extend CRC32() and implement CRC32C()preview-10.8-MDEV-27208
We used to define a native unary function crc32() that computes the CRC-32
of a string using the ISO 3309 polynomial that is being used by zlib
and many others.
Often, CRC is computed in pieces. To faciliate this, we introduce an
optional second parameter: CRC32('MariaDB')=CRC32('DB',CRC32('Maria')).
InnoDB and MyRocks use a different polynomial, which was implemented
in SSE4.2 instructions that were introduced in the
Intel Nehalem microarchitecture. This is commonly called CRC-32C
(Castagnoli).
We introduce a native function that uses the Castagnoli polynomial:
CRC32C('MariaDB')=CRC32C('DB',CRC32C('Maria')). This allows
SELECT...INTO DUMPFILE to be used for the creation of files with
valid checksums, such as a logically empty InnoDB redo log file
ib_logfile0 corresponding to a particular log sequence number.
Diffstat (limited to 'mysql-test')
-rw-r--r-- | mysql-test/main/func_math.result | 41 | ||||
-rw-r--r-- | mysql-test/main/func_math.test | 11 |
2 files changed, 36 insertions, 16 deletions
diff --git a/mysql-test/main/func_math.result b/mysql-test/main/func_math.result index ec2521bcfd7..43eb6377b83 100644 --- a/mysql-test/main/func_math.result +++ b/mysql-test/main/func_math.result @@ -1840,24 +1840,39 @@ CRC32(99999999999999999999999999999999) SELECT CRC32(-99999999999999999999999999999999); CRC32(-99999999999999999999999999999999) 1052326872 +SELECT CRC32C(NULL), CRC32C(''), CRC32C('MariaDB'), CRC32C('mariadb'); +CRC32C(NULL) CRC32C('') CRC32C('MariaDB') CRC32C('mariadb') +NULL 0 809606978 1378644259 +SELECT CRC32(NULL,1),CRC32C(NULL,1), CRC32('',1), CRC32C('',1); +CRC32(NULL,1) CRC32C(NULL,1) CRC32('',1) CRC32C('',1) +NULL NULL 1 1 +SELECT CRC32('MariaDB',NULL),CRC32C('MariaDB',NULL); +CRC32('MariaDB',NULL) CRC32C('MariaDB',NULL) +NULL NULL +SELECT CRC32('',CRC32('MySQL')),CRC32('SQL',CRC32('My')); +CRC32('',CRC32('MySQL')) CRC32('SQL',CRC32('My')) +3259397556 3259397556 +SELECT CRC32C('',CRC32C('MariaDB')),CRC32C('DB',CRC32C('Maria')); +CRC32C('',CRC32C('MariaDB')) CRC32C('DB',CRC32C('Maria')) +809606978 809606978 DROP TABLE IF EXISTS t; Warnings: Note 1051 Unknown table 'test.t' CREATE TABLE t(a INT, b VARCHAR(2)); INSERT INTO t VALUES (1,'a'), (2,'qw'), (1,'t'), (3,'t'); -SELECT crc32(SUM(a)) FROM t; -crc32(SUM(a)) -1790921346 -SELECT crc32(AVG(a)) FROM t GROUP BY b; -crc32(AVG(a)) -768278432 -2875100430 -2875100430 -SELECT crc32(MAX(b)) FROM t GROUP BY a; -crc32(MAX(b)) -2238339752 -3114057431 -2238339752 +SELECT crc32(SUM(a)),crc32c(SUM(a)) FROM t; +crc32(SUM(a)) crc32c(SUM(a)) +1790921346 3058990603 +SELECT crc32(AVG(a)),crc32c(AVG(a)) FROM t GROUP BY b; +crc32(AVG(a)) crc32c(AVG(a)) +768278432 1816172052 +2875100430 1492934094 +2875100430 1492934094 +SELECT crc32(MAX(b)),crc32c(MAX(b)) FROM t GROUP BY a; +crc32(MAX(b)) crc32c(MAX(b)) +2238339752 3833565251 +3114057431 4173859780 +2238339752 3833565251 SELECT a, b, crc32(a) FROM t GROUP BY a,b HAVING crc32(MAX(a))=450215437; a b crc32(a) 2 qw 450215437 diff --git a/mysql-test/main/func_math.test b/mysql-test/main/func_math.test index 572e0fd0f6b..92d2e015404 100644 --- a/mysql-test/main/func_math.test +++ b/mysql-test/main/func_math.test @@ -849,15 +849,20 @@ SELECT CRC32('01234567'), CRC32('012345678'); SELECT CRC32('~!@$%^*'), CRC32('-0.0001'); SELECT CRC32(99999999999999999999999999999999); SELECT CRC32(-99999999999999999999999999999999); +SELECT CRC32C(NULL), CRC32C(''), CRC32C('MariaDB'), CRC32C('mariadb'); +SELECT CRC32(NULL,1),CRC32C(NULL,1), CRC32('',1), CRC32C('',1); +SELECT CRC32('MariaDB',NULL),CRC32C('MariaDB',NULL); +SELECT CRC32('',CRC32('MySQL')),CRC32('SQL',CRC32('My')); +SELECT CRC32C('',CRC32C('MariaDB')),CRC32C('DB',CRC32C('Maria')); # Test cases for using the function in aggregate functions, group-by, having # and order-by clauses DROP TABLE IF EXISTS t; CREATE TABLE t(a INT, b VARCHAR(2)); INSERT INTO t VALUES (1,'a'), (2,'qw'), (1,'t'), (3,'t'); -SELECT crc32(SUM(a)) FROM t; -SELECT crc32(AVG(a)) FROM t GROUP BY b; -SELECT crc32(MAX(b)) FROM t GROUP BY a; +SELECT crc32(SUM(a)),crc32c(SUM(a)) FROM t; +SELECT crc32(AVG(a)),crc32c(AVG(a)) FROM t GROUP BY b; +SELECT crc32(MAX(b)),crc32c(MAX(b)) FROM t GROUP BY a; SELECT a, b, crc32(a) FROM t GROUP BY a,b HAVING crc32(MAX(a))=450215437; SELECT a,b,concat(a,b),crc32(concat(a,b)) FROM t ORDER BY crc32(concat(a,b)); DROP TABLE t; |