summaryrefslogtreecommitdiff
path: root/mysql-test
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-12-14 11:45:34 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2021-12-14 11:45:34 +0200
commitbc9f505f80633e537d5077534f4d8809c65c8162 (patch)
tree64b10a617bef8a4245cf81445339bb7d2d2e4e22 /mysql-test
parentea9489536911b083c5e28b15c071cf6931247b7e (diff)
downloadmariadb-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.result41
-rw-r--r--mysql-test/main/func_math.test11
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;