From 3adc033e00b9dae8a92f41e14b4e4cfa3d59e8ff Mon Sep 17 00:00:00 2001 From: xiongjiwei Date: Mon, 11 Oct 2021 15:13:25 +0800 Subject: [PATCH] coprocessor: add gbk_chinese_ci support in coprocessor (#11024) Signed-off-by: xiongjiwei Co-authored-by: Ti Chi Robot --- .../collation/collator/gbk_chinese_ci.data | Bin 0 -> 131072 bytes .../collator/{gbk_bin.rs => gbk_collation.rs} | 37 ++++++++++++--- .../src/codec/collation/collator/mod.rs | 42 ++++++++++++++++-- .../src/codec/collation/mod.rs | 1 + .../tidb_query_datatype/src/def/field_type.rs | 1 + 5 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 components/tidb_query_datatype/src/codec/collation/collator/gbk_chinese_ci.data rename components/tidb_query_datatype/src/codec/collation/collator/{gbk_bin.rs => gbk_collation.rs} (64%) diff --git a/components/tidb_query_datatype/src/codec/collation/collator/gbk_chinese_ci.data b/components/tidb_query_datatype/src/codec/collation/collator/gbk_chinese_ci.data new file mode 100644 index 0000000000000000000000000000000000000000..a10335ac035836278ecaf25ceb6b5a9cd4ca4e21 GIT binary patch literal 131072 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 Collator for T { type Charset = CharsetGbk; type Weight = u16; - const IS_CASE_INSENSITIVE: bool = false; + const IS_CASE_INSENSITIVE: bool = T::IS_CASE_INSENSITIVE; #[inline] fn char_weight(ch: char) -> Self::Weight { @@ -21,7 +22,7 @@ impl Collator for CollatorGbkBin { return '?' as u16; } - (&GBK_BIN_TABLE[r * 2..r * 2 + 2]).read_u16().unwrap() + (&Self::WEIGHT_TABLE[r * 2..r * 2 + 2]).read_u16().unwrap() } #[inline] @@ -61,6 +62,28 @@ impl Collator for CollatorGbkBin { } } +/// Collator for `gbk_bin` collation with padding behavior (trims right spaces). +#[derive(Debug)] +pub struct CollatorGbkBin; + +impl GbkCollator for CollatorGbkBin { + const IS_CASE_INSENSITIVE: bool = false; + const WEIGHT_TABLE: &'static [u8; (0xffff + 1) * 2] = GBK_BIN_TABLE; +} + +/// Collator for `gbk_chinese_ci` collation with padding behavior (trims right spaces). +#[derive(Debug)] +pub struct CollatorGbkChineseCi; + +impl GbkCollator for CollatorGbkChineseCi { + const IS_CASE_INSENSITIVE: bool = true; + const WEIGHT_TABLE: &'static [u8; (0xffff + 1) * 2] = GBK_CHINESE_CI_TABLE; +} + // GBK_BIN_TABLE are the encoding tables from Unicode to GBK code, it is totally the same with golang's GBK encoding. // If there is no mapping code in GBK, use 0x3F(?) instead. It should not happened. -static GBK_BIN_TABLE: &[u8; (0xffff + 1) * 2] = include_bytes!("gbk_bin.data"); +const GBK_BIN_TABLE: &[u8; (0xffff + 1) * 2] = include_bytes!("gbk_bin.data"); + +// GBK_CHINESE_CI_TABLE are the sort key tables for GBK codepoint. +// If there is no mapping code in GBK, use 0x3F(?) instead. It should not happened. +const GBK_CHINESE_CI_TABLE: &[u8; (0xffff + 1) * 2] = include_bytes!("gbk_chinese_ci.data"); diff --git a/components/tidb_query_datatype/src/codec/collation/collator/mod.rs b/components/tidb_query_datatype/src/codec/collation/collator/mod.rs index 33697ff396e..f1c694d0f67 100644 --- a/components/tidb_query_datatype/src/codec/collation/collator/mod.rs +++ b/components/tidb_query_datatype/src/codec/collation/collator/mod.rs @@ -1,14 +1,14 @@ // Copyright 2020 TiKV Project Authors. Licensed under Apache-2.0. mod binary; -mod gbk_bin; +mod gbk_collation; mod latin1_bin; mod utf8mb4_binary; mod utf8mb4_general_ci; mod utf8mb4_unicode_ci; pub use binary::*; -pub use gbk_bin::*; +pub use gbk_collation::*; pub use latin1_bin::*; pub use utf8mb4_binary::*; pub use utf8mb4_general_ci::*; @@ -45,9 +45,10 @@ mod tests { (Collation::Utf8Mb4UnicodeCi, 3), (Collation::Latin1Bin, 4), (Collation::GbkBin, 5), + (Collation::GbkChineseCi, 6), ]; let cases = vec![ - // (sa, sb, [Utf8Mb4Bin, Utf8Mb4BinNoPadding, Utf8Mb4GeneralCi, Utf8Mb4UnicodeCi, GBKBin]) + // (sa, sb, [Utf8Mb4Bin, Utf8Mb4BinNoPadding, Utf8Mb4GeneralCi, Utf8Mb4UnicodeCi, Latin1, GBKBin, GbkChineseCi]) ( "a".as_bytes(), "a".as_bytes(), @@ -58,6 +59,7 @@ mod tests { Ordering::Equal, Ordering::Equal, Ordering::Equal, + Ordering::Equal, ], ), ( @@ -70,6 +72,7 @@ mod tests { Ordering::Equal, Ordering::Equal, Ordering::Equal, + Ordering::Equal, ], ), ( @@ -82,6 +85,7 @@ mod tests { Ordering::Equal, Ordering::Greater, Ordering::Greater, + Ordering::Equal, ], ), ( @@ -94,6 +98,7 @@ mod tests { Ordering::Greater, Ordering::Greater, Ordering::Greater, + Ordering::Greater, ], ), ( @@ -106,6 +111,7 @@ mod tests { Ordering::Less, Ordering::Less, Ordering::Less, + Ordering::Less, ], ), ( @@ -118,6 +124,7 @@ mod tests { Ordering::Equal, Ordering::Less, Ordering::Less, + Ordering::Less, ], ), ( @@ -130,6 +137,7 @@ mod tests { Ordering::Equal, Ordering::Less, Ordering::Less, + Ordering::Less, ], ), ( @@ -142,6 +150,7 @@ mod tests { Ordering::Equal, Ordering::Greater, Ordering::Less, + Ordering::Less, ], ), ( @@ -154,6 +163,20 @@ mod tests { Ordering::Less, Ordering::Less, Ordering::Greater, + Ordering::Greater, + ], + ), + ( + "啊".as_bytes(), + "把".as_bytes(), + [ + Ordering::Less, + Ordering::Less, + Ordering::Less, + Ordering::Less, + Ordering::Less, + Ordering::Less, + Ordering::Less, ], ), ]; @@ -209,9 +232,10 @@ mod tests { (Collation::Utf8Mb4UnicodeCi, 3), (Collation::Latin1Bin, 4), (Collation::GbkBin, 5), + (Collation::GbkChineseCi, 6), ]; let cases = vec![ - // (str, [Utf8Mb4Bin, Utf8Mb4BinNoPadding, Utf8Mb4GeneralCi, Utf8Mb4UnicodeCi, GBKbin]) + // (str, [Utf8Mb4Bin, Utf8Mb4BinNoPadding, Utf8Mb4GeneralCi, Utf8Mb4UnicodeCi, Latin1, GBKBin, GbkChineseCi]) ( "a", [ @@ -221,6 +245,7 @@ mod tests { vec![0x0E, 0x33], vec![0x61], vec![0x61], + vec![0x41], ], ), ( @@ -232,6 +257,7 @@ mod tests { vec![0x0E, 0x33], vec![0x41], vec![0x41], + vec![0x41], ], ), ( @@ -243,6 +269,7 @@ mod tests { vec![0x0E, 0x33], vec![0x41], vec![0x41], + vec![0x41], ], ), ( @@ -254,6 +281,7 @@ mod tests { vec![0xff, 0xfd], vec![0xF0, 0x9F, 0x98, 0x83], vec![0x3F], + vec![0x3F], ], ), ( @@ -290,6 +318,10 @@ mod tests { 0x46, 0x6f, 0x6f, 0x20, 0x3f, 0x20, 0x62, 0x61, 0x72, 0x20, 0x3f, 0x20, 0x62, 0x61, 0x7a, 0x20, 0x3f, 0x20, 0x71, 0x75, 0x78, ], + vec![ + 0x46, 0x4f, 0x4f, 0x20, 0x3f, 0x20, 0x42, 0x41, 0x52, 0x20, 0x3f, 0x20, + 0x42, 0x41, 0x5a, 0x20, 0x3f, 0x20, 0x51, 0x55, 0x58, + ], ], ), ( @@ -304,6 +336,7 @@ mod tests { ], vec![0xEF, 0xB7, 0xBB], vec![0x3f], + vec![0x3f], ], ), ( @@ -315,6 +348,7 @@ mod tests { vec![0xFB, 0x40, 0xCE, 0x2D, 0xFB, 0x40, 0xE5, 0x87], vec![0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87], vec![0xD6, 0xD0, 0xCE, 0xC4], + vec![0xD3, 0x21, 0xC1, 0xAD], ], ), ]; diff --git a/components/tidb_query_datatype/src/codec/collation/mod.rs b/components/tidb_query_datatype/src/codec/collation/mod.rs index e1e8d731362..ed9cbe654ef 100644 --- a/components/tidb_query_datatype/src/codec/collation/mod.rs +++ b/components/tidb_query_datatype/src/codec/collation/mod.rs @@ -28,6 +28,7 @@ macro_rules! match_template_collator { Utf8Mb4UnicodeCi => CollatorUtf8Mb4UnicodeCi, Latin1Bin => CollatorLatin1Bin, GbkBin => CollatorGbkBin, + GbkChineseCi => CollatorGbkChineseCi, ], $($tail)* } diff --git a/components/tidb_query_datatype/src/def/field_type.rs b/components/tidb_query_datatype/src/def/field_type.rs index d6e77e6b2d6..561f1f53c1a 100644 --- a/components/tidb_query_datatype/src/def/field_type.rs +++ b/components/tidb_query_datatype/src/def/field_type.rs @@ -112,6 +112,7 @@ pub enum Collation { Utf8Mb4UnicodeCi = -224, Latin1Bin = -47, GbkBin = -87, + GbkChineseCi = -28, } impl Collation {