diff --git a/pkg/frontend/util_test.go b/pkg/frontend/util_test.go index 91beea68df130..f5c1f25386a29 100644 --- a/pkg/frontend/util_test.go +++ b/pkg/frontend/util_test.go @@ -550,7 +550,7 @@ func TestGetExprValue(t *testing.T) { {"set @@x=(select 127)", false, 127}, {"set @@x=(select -128)", false, -128}, {"set @@x=(select -2147483648)", false, -2147483648}, - {"set @@x=(select -9223372036854775808)", false, "-9223372036854775808"}, + {"set @@x=(select -9223372036854775808)", false, int64(-9223372036854775808)}, {"set @@x=(select 18446744073709551615)", false, uint64(math.MaxUint64)}, {"set @@x=(select 1.1754943508222875e-38)", false, float32(1.1754943508222875e-38)}, {"set @@x=(select 3.4028234663852886e+38)", false, float32(3.4028234663852886e+38)}, diff --git a/pkg/sql/parsers/dialect/mysql/mysql_sql.go b/pkg/sql/parsers/dialect/mysql/mysql_sql.go index fc6b83a45a50b..9ab0cd5bdb9f1 100644 --- a/pkg/sql/parsers/dialect/mysql/mysql_sql.go +++ b/pkg/sql/parsers/dialect/mysql/mysql_sql.go @@ -1495,7 +1495,7 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line mysql_sql.y:14228 +//line mysql_sql.y:14225 //line yacctab:1 var yyExca = [...]int{ @@ -9141,7 +9141,7 @@ var yyPgo = [...]int{ 4048, 263, 282, 4042, } -//line mysql_sql.y:14228 +//line mysql_sql.y:14225 type yySymType struct { union interface{} id int @@ -28392,16 +28392,13 @@ yydefault: var yyLOCAL tree.Expr //line mysql_sql.y:12648 { - if strings.HasPrefix(yyDollar[2].str, "0x") { - yyDollar[2].str = yyDollar[2].str[2:] - } - yyLOCAL = tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_bit) + yyLOCAL = tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_hexnum) } yyVAL.union = yyLOCAL case 1959: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12655 +//line mysql_sql.y:12652 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_decimal) } @@ -28409,7 +28406,7 @@ yydefault: case 1960: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12659 +//line mysql_sql.y:12656 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_bit) } @@ -28417,7 +28414,7 @@ yydefault: case 1961: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12663 +//line mysql_sql.y:12660 { yyLOCAL = tree.NewParamExpr(yylex.(*Lexer).GetParamIndex()) } @@ -28425,7 +28422,7 @@ yydefault: case 1962: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12667 +//line mysql_sql.y:12664 { yyLOCAL = tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_ScoreBinary) } @@ -28433,7 +28430,7 @@ yydefault: case 1963: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12673 +//line mysql_sql.y:12670 { yyLOCAL = yyDollar[1].columnTypeUnion() yyLOCAL.InternalType.Unsigned = yyDollar[2].unsignedOptUnion() @@ -28443,7 +28440,7 @@ yydefault: case 1967: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12684 +//line mysql_sql.y:12681 { yyLOCAL = yyDollar[1].columnTypeUnion() yyLOCAL.InternalType.DisplayWith = yyDollar[2].lengthOptUnion() @@ -28452,7 +28449,7 @@ yydefault: case 1968: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12689 +//line mysql_sql.y:12686 { yyLOCAL = yyDollar[1].columnTypeUnion() } @@ -28460,7 +28457,7 @@ yydefault: case 1969: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12695 +//line mysql_sql.y:12692 { locale := "" yyLOCAL = &tree.T{ @@ -28476,7 +28473,7 @@ yydefault: case 1970: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12707 +//line mysql_sql.y:12704 { locale := "" yyLOCAL = &tree.T{ @@ -28492,7 +28489,7 @@ yydefault: case 1971: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12719 +//line mysql_sql.y:12716 { locale := "" yyLOCAL = &tree.T{ @@ -28508,7 +28505,7 @@ yydefault: case 1972: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12731 +//line mysql_sql.y:12728 { locale := "" yyLOCAL = &tree.T{ @@ -28525,7 +28522,7 @@ yydefault: case 1973: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12744 +//line mysql_sql.y:12741 { locale := "" yyLOCAL = &tree.T{ @@ -28542,7 +28539,7 @@ yydefault: case 1974: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12757 +//line mysql_sql.y:12754 { locale := "" yyLOCAL = &tree.T{ @@ -28559,7 +28556,7 @@ yydefault: case 1975: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12770 +//line mysql_sql.y:12767 { locale := "" yyLOCAL = &tree.T{ @@ -28576,7 +28573,7 @@ yydefault: case 1976: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12783 +//line mysql_sql.y:12780 { locale := "" yyLOCAL = &tree.T{ @@ -28593,7 +28590,7 @@ yydefault: case 1977: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12796 +//line mysql_sql.y:12793 { locale := "" yyLOCAL = &tree.T{ @@ -28610,7 +28607,7 @@ yydefault: case 1978: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12809 +//line mysql_sql.y:12806 { locale := "" yyLOCAL = &tree.T{ @@ -28627,7 +28624,7 @@ yydefault: case 1979: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12822 +//line mysql_sql.y:12819 { locale := "" yyLOCAL = &tree.T{ @@ -28644,7 +28641,7 @@ yydefault: case 1980: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12835 +//line mysql_sql.y:12832 { locale := "" yyLOCAL = &tree.T{ @@ -28661,7 +28658,7 @@ yydefault: case 1981: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12848 +//line mysql_sql.y:12845 { locale := "" yyLOCAL = &tree.T{ @@ -28678,7 +28675,7 @@ yydefault: case 1982: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12861 +//line mysql_sql.y:12858 { locale := "" yyLOCAL = &tree.T{ @@ -28695,7 +28692,7 @@ yydefault: case 1983: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12876 +//line mysql_sql.y:12873 { locale := "" if yyDollar[2].lengthScaleOptUnion().DisplayWith > 255 { @@ -28726,7 +28723,7 @@ yydefault: case 1984: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12903 +//line mysql_sql.y:12900 { locale := "" if yyDollar[2].lengthScaleOptUnion().DisplayWith > 255 { @@ -28771,7 +28768,7 @@ yydefault: case 1985: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12945 +//line mysql_sql.y:12942 { locale := "" if yyDollar[2].lengthScaleOptUnion().Scale != tree.NotDefineDec && yyDollar[2].lengthScaleOptUnion().Scale > yyDollar[2].lengthScaleOptUnion().DisplayWith { @@ -28823,7 +28820,7 @@ yydefault: case 1986: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:12993 +//line mysql_sql.y:12990 { locale := "" if yyDollar[2].lengthScaleOptUnion().Scale != tree.NotDefineDec && yyDollar[2].lengthScaleOptUnion().Scale > yyDollar[2].lengthScaleOptUnion().DisplayWith { @@ -28875,7 +28872,7 @@ yydefault: case 1987: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13041 +//line mysql_sql.y:13038 { locale := "" yyLOCAL = &tree.T{ @@ -28894,7 +28891,7 @@ yydefault: case 1988: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13058 +//line mysql_sql.y:13055 { locale := "" yyLOCAL = &tree.T{ @@ -28910,7 +28907,7 @@ yydefault: case 1989: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13070 +//line mysql_sql.y:13067 { locale := "" if yyDollar[2].lengthOptUnion() < 0 || yyDollar[2].lengthOptUnion() > 6 { @@ -28934,7 +28931,7 @@ yydefault: case 1990: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13090 +//line mysql_sql.y:13087 { locale := "" if yyDollar[2].lengthOptUnion() < 0 || yyDollar[2].lengthOptUnion() > 6 { @@ -28958,7 +28955,7 @@ yydefault: case 1991: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13110 +//line mysql_sql.y:13107 { locale := "" if yyDollar[2].lengthOptUnion() < 0 || yyDollar[2].lengthOptUnion() > 6 { @@ -28982,7 +28979,7 @@ yydefault: case 1992: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13130 +//line mysql_sql.y:13127 { locale := "" yyLOCAL = &tree.T{ @@ -29000,7 +28997,7 @@ yydefault: case 1993: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13146 +//line mysql_sql.y:13143 { locale := "" yyLOCAL = &tree.T{ @@ -29017,7 +29014,7 @@ yydefault: case 1994: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13159 +//line mysql_sql.y:13156 { locale := "" yyLOCAL = &tree.T{ @@ -29034,7 +29031,7 @@ yydefault: case 1995: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13172 +//line mysql_sql.y:13169 { locale := "" yyLOCAL = &tree.T{ @@ -29051,7 +29048,7 @@ yydefault: case 1996: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13185 +//line mysql_sql.y:13182 { locale := "" yyLOCAL = &tree.T{ @@ -29068,7 +29065,7 @@ yydefault: case 1997: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13198 +//line mysql_sql.y:13195 { locale := "" yyLOCAL = &tree.T{ @@ -29084,7 +29081,7 @@ yydefault: case 1998: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13210 +//line mysql_sql.y:13207 { locale := "" yyLOCAL = &tree.T{ @@ -29100,7 +29097,7 @@ yydefault: case 1999: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13222 +//line mysql_sql.y:13219 { locale := "" yyLOCAL = &tree.T{ @@ -29116,7 +29113,7 @@ yydefault: case 2000: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13234 +//line mysql_sql.y:13231 { locale := "" yyLOCAL = &tree.T{ @@ -29132,7 +29129,7 @@ yydefault: case 2001: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13246 +//line mysql_sql.y:13243 { locale := "" yyLOCAL = &tree.T{ @@ -29148,7 +29145,7 @@ yydefault: case 2002: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13258 +//line mysql_sql.y:13255 { locale := "" yyLOCAL = &tree.T{ @@ -29164,7 +29161,7 @@ yydefault: case 2003: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13270 +//line mysql_sql.y:13267 { locale := "" yyLOCAL = &tree.T{ @@ -29180,7 +29177,7 @@ yydefault: case 2004: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13282 +//line mysql_sql.y:13279 { locale := "" yyLOCAL = &tree.T{ @@ -29196,7 +29193,7 @@ yydefault: case 2005: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13294 +//line mysql_sql.y:13291 { locale := "" yyLOCAL = &tree.T{ @@ -29212,7 +29209,7 @@ yydefault: case 2006: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13306 +//line mysql_sql.y:13303 { locale := "" yyLOCAL = &tree.T{ @@ -29228,7 +29225,7 @@ yydefault: case 2007: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13318 +//line mysql_sql.y:13315 { locale := "" yyLOCAL = &tree.T{ @@ -29245,7 +29242,7 @@ yydefault: case 2008: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13331 +//line mysql_sql.y:13328 { locale := "" yyLOCAL = &tree.T{ @@ -29262,7 +29259,7 @@ yydefault: case 2009: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13344 +//line mysql_sql.y:13341 { locale := "" yyLOCAL = &tree.T{ @@ -29279,7 +29276,7 @@ yydefault: case 2010: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13357 +//line mysql_sql.y:13354 { locale := "" yyLOCAL = &tree.T{ @@ -29296,7 +29293,7 @@ yydefault: case 2011: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13370 +//line mysql_sql.y:13367 { locale := "" yyLOCAL = &tree.T{ @@ -29313,7 +29310,7 @@ yydefault: case 2012: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:13385 +//line mysql_sql.y:13382 { yyLOCAL = &tree.Do{ Exprs: yyDollar[2].exprsUnion(), @@ -29323,7 +29320,7 @@ yydefault: case 2013: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:13393 +//line mysql_sql.y:13390 { yyLOCAL = &tree.Declare{ Variables: yyDollar[2].strsUnion(), @@ -29335,7 +29332,7 @@ yydefault: case 2014: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:13402 +//line mysql_sql.y:13399 { yyLOCAL = &tree.Declare{ Variables: yyDollar[2].strsUnion(), @@ -29347,7 +29344,7 @@ yydefault: case 2015: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13412 +//line mysql_sql.y:13409 { yyLOCAL = tree.NewSpatialType(yyDollar[1].str) } @@ -29355,7 +29352,7 @@ yydefault: case 2034: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:13440 +//line mysql_sql.y:13437 { yyLOCAL = make([]string, 0, 4) yyLOCAL = append(yyLOCAL, yyDollar[1].str) @@ -29364,7 +29361,7 @@ yydefault: case 2035: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:13445 +//line mysql_sql.y:13442 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].str) } @@ -29372,7 +29369,7 @@ yydefault: case 2036: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:13451 +//line mysql_sql.y:13448 { yyLOCAL = 0 } @@ -29380,7 +29377,7 @@ yydefault: case 2038: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:13458 +//line mysql_sql.y:13455 { yyLOCAL = 0 } @@ -29388,7 +29385,7 @@ yydefault: case 2039: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:13462 +//line mysql_sql.y:13459 { yyLOCAL = int32(yyDollar[2].item.(int64)) } @@ -29396,7 +29393,7 @@ yydefault: case 2040: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:13467 +//line mysql_sql.y:13464 { yyLOCAL = int32(-1) } @@ -29404,7 +29401,7 @@ yydefault: case 2041: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:13471 +//line mysql_sql.y:13468 { yyLOCAL = int32(yyDollar[2].item.(int64)) } @@ -29412,7 +29409,7 @@ yydefault: case 2042: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:13477 +//line mysql_sql.y:13474 { yyLOCAL = tree.GetDisplayWith(int32(yyDollar[2].item.(int64))) } @@ -29420,7 +29417,7 @@ yydefault: case 2043: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:13483 +//line mysql_sql.y:13480 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: tree.NotDefineDisplayWidth, @@ -29431,7 +29428,7 @@ yydefault: case 2044: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:13490 +//line mysql_sql.y:13487 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: tree.GetDisplayWith(int32(yyDollar[2].item.(int64))), @@ -29442,7 +29439,7 @@ yydefault: case 2045: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:13497 +//line mysql_sql.y:13494 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: tree.GetDisplayWith(int32(yyDollar[2].item.(int64))), @@ -29453,7 +29450,7 @@ yydefault: case 2046: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:13506 +//line mysql_sql.y:13503 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: 38, // this is the default precision for decimal @@ -29464,7 +29461,7 @@ yydefault: case 2047: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:13513 +//line mysql_sql.y:13510 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: tree.GetDisplayWith(int32(yyDollar[2].item.(int64))), @@ -29475,7 +29472,7 @@ yydefault: case 2048: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:13520 +//line mysql_sql.y:13517 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: tree.GetDisplayWith(int32(yyDollar[2].item.(int64))), @@ -29486,7 +29483,7 @@ yydefault: case 2049: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:13529 +//line mysql_sql.y:13526 { yyLOCAL = false } @@ -29494,7 +29491,7 @@ yydefault: case 2050: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:13533 +//line mysql_sql.y:13530 { yyLOCAL = true } @@ -29502,33 +29499,33 @@ yydefault: case 2051: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:13537 +//line mysql_sql.y:13534 { yyLOCAL = false } yyVAL.union = yyLOCAL case 2052: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:13543 +//line mysql_sql.y:13540 { } case 2053: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:13545 +//line mysql_sql.y:13542 { yyLOCAL = true } yyVAL.union = yyLOCAL case 2057: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:13555 +//line mysql_sql.y:13552 { yyVAL.str = "" } case 2058: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:13559 +//line mysql_sql.y:13556 { yyVAL.str = string(yyDollar[1].str) } diff --git a/pkg/sql/parsers/dialect/mysql/mysql_sql.y b/pkg/sql/parsers/dialect/mysql/mysql_sql.y index 744a60d1aa3f9..e040dcf75e216 100644 --- a/pkg/sql/parsers/dialect/mysql/mysql_sql.y +++ b/pkg/sql/parsers/dialect/mysql/mysql_sql.y @@ -12647,10 +12647,7 @@ literal: } | UNDERSCORE_BINARY HEXNUM { - if strings.HasPrefix($2, "0x") { - $2 = $2[2:] - } - $$ = tree.NewNumVal($2, $2, false, tree.P_bit) + $$ = tree.NewNumVal($2, $2, false, tree.P_hexnum) } | DECIMAL_VALUE { diff --git a/pkg/sql/parsers/dialect/mysql/mysql_sql_test.go b/pkg/sql/parsers/dialect/mysql/mysql_sql_test.go index 034f0bd669bba..619fdac2dce6a 100644 --- a/pkg/sql/parsers/dialect/mysql/mysql_sql_test.go +++ b/pkg/sql/parsers/dialect/mysql/mysql_sql_test.go @@ -3136,7 +3136,7 @@ var ( output: "create view t2 as select * from t1", }, { input: "insert into t1 values(_binary 0x123)", - output: "insert into t1 values (123)", + output: "insert into t1 values (0x123)", }, { input: "backup '123' filesystem '/home/abc' parallelism '1'", output: "backup 123 filesystem /home/abc parallelism 1", diff --git a/pkg/sql/plan/base_binder.go b/pkg/sql/plan/base_binder.go index ca9c5988d6c3a..b1af6b4be8c7a 100644 --- a/pkg/sql/plan/base_binder.go +++ b/pkg/sql/plan/base_binder.go @@ -1755,6 +1755,9 @@ func BindFuncExprImplByPlanExpr(ctx context.Context, name string, args []*Expr) if len(args) == 0 { return nil, moerr.NewInvalidArg(ctx, name+" function have invalid input args length", len(args)) } + if argLit := args[0].GetLit(); args[0].Typ.Id == int32(types.T_uint64) && argLit != nil && argLit.GetU64Val() == 1<<63 { + return makePlan2Int64ConstExprWithType(math.MinInt64), nil + } if args[0].Typ.Id == int32(types.T_uint64) { args[0], err = appendCastBeforeExpr(ctx, args[0], plan.Type{ Id: int32(types.T_decimal128), diff --git a/pkg/sql/plan/base_binder_test.go b/pkg/sql/plan/base_binder_test.go index 3a5e30ba5721b..7c6276e47ab8f 100644 --- a/pkg/sql/plan/base_binder_test.go +++ b/pkg/sql/plan/base_binder_test.go @@ -16,10 +16,13 @@ package plan import ( "context" + "math" "testing" "github.com/matrixorigin/matrixone/pkg/container/types" "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/parsers" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect" "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" "github.com/stretchr/testify/require" ) @@ -71,6 +74,51 @@ func TestBindFuncExprImplByPlanExpr_PowAlias(t *testing.T) { }) } +func TestBindUnaryMinusUint64MinInt64Boundary(t *testing.T) { + builder, bindCtx := genBuilderAndCtx() + whereBinder := NewWhereBinder(builder, bindCtx) + + testCases := []struct { + name string + sql string + checkValue func(t *testing.T, expr *plan.Expr) + }{ + { + name: "min int64 boundary", + sql: "-9223372036854775808", + checkValue: func(t *testing.T, expr *plan.Expr) { + require.Equal(t, int32(types.T_int64), expr.Typ.Id) + require.Equal(t, int64(math.MinInt64), expr.GetLit().GetI64Val()) + }, + }, + { + name: "below min int64 keeps decimal", + sql: "-9223372036854775809", + checkValue: func(t *testing.T, expr *plan.Expr) { + require.Equal(t, int32(types.T_decimal128), expr.Typ.Id) + require.NotNil(t, expr.GetLit().GetDecimal128Val()) + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + stmts, err := parsers.Parse(context.TODO(), dialect.MYSQL, "select "+tc.sql+" from bind_select", 1) + require.NoError(t, err) + + selectStmt := stmts[0].(*tree.Select) + selectClause := selectStmt.Select.(*tree.SelectClause) + unaryExpr, ok := selectClause.Exprs[0].Expr.(*tree.UnaryExpr) + require.True(t, ok) + + expr, err := whereBinder.bindUnaryExpr(unaryExpr, 0, false) + require.NoError(t, err) + require.NotNil(t, expr.GetLit()) + tc.checkValue(t, expr) + }) + } +} + // TestBindFuncExprImplByPlanExpr_JsonValid tests that json_valid binds // correctly with string and json inputs. func TestBindFuncExprImplByPlanExpr_JsonValid(t *testing.T) { diff --git a/pkg/sql/plan/function/func_bit_count_test.go b/pkg/sql/plan/function/func_bit_count_test.go new file mode 100644 index 0000000000000..f481855b77398 --- /dev/null +++ b/pkg/sql/plan/function/func_bit_count_test.go @@ -0,0 +1,259 @@ +// Copyright 2021 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package function + +import ( + "context" + "math" + "testing" + + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/testutil" + "github.com/stretchr/testify/require" +) + +func TestBitCountInteger(t *testing.T) { + proc := testutil.NewProcess(t) + tc := NewFunctionTestCase(proc, + []FunctionTestInput{ + NewFunctionTestInput(types.T_int64.ToType(), []int64{0, 1, 64, -1, -2}, nil), + }, + NewFunctionTestResult(types.T_uint64.ToType(), false, []uint64{0, 1, 1, 64, 63}, nil), + BitCountInteger[int64]) + ok, info := tc.Run() + require.True(t, ok, info) +} + +func TestBitCountString(t *testing.T) { + proc := testutil.NewProcess(t) + tc := NewFunctionTestCase(proc, + []FunctionTestInput{ + NewFunctionTestInput(types.T_varchar.ToType(), []string{ + "", " ", "64", "+1", "-1", "-2", "255", + "9223372036854775808", + "18446744073709551615", + "18446744073709551616", + "-9223372036854775808", + "-18446744073709551616", + }, nil), + }, + NewFunctionTestResult(types.T_uint64.ToType(), false, []uint64{ + 0, 0, 1, 1, 64, 63, 8, + 1, + 64, + 64, + 1, + 1, + }, nil), + BitCountNonBinaryString) + ok, info := tc.Run() + require.True(t, ok, info) +} + +func TestBitCountStringInvalidFormat(t *testing.T) { + _, err := bitCountFromMysqlIntegerString("123abc") + require.Error(t, err) + + _, err = bitCountFromMysqlIntegerString("1.9") + require.Error(t, err) +} + +func TestBitCountFloat(t *testing.T) { + proc := testutil.NewProcess(t) + tc := NewFunctionTestCase(proc, + []FunctionTestInput{ + NewFunctionTestInput(types.T_float64.ToType(), []float64{ + 1.4, 1.5, 2.5, 3.5, + -1.4, -1.5, -2.5, -3.5, + math.Inf(1), math.Inf(-1), + }, nil), + }, + NewFunctionTestResult(types.T_uint64.ToType(), false, []uint64{ + 1, 1, 1, 1, + 64, 63, 63, 62, + 64, 1, + }, nil), + BitCountFloat[float64]) + ok, info := tc.Run() + require.True(t, ok, info) + + _, err := bitCountFromFloat(math.NaN(), proc) + require.Error(t, err) +} + +func TestBitCountDecimal64(t *testing.T) { + proc := testutil.NewProcess(t) + typ := types.New(types.T_decimal64, 18, 1) + inputs := []string{"1.4", "1.5", "2.5", "-1.4", "-1.5", "-2.5"} + values := make([]types.Decimal64, len(inputs)) + for i, input := range inputs { + v, err := types.ParseDecimal64(input, typ.Width, typ.Scale) + require.NoError(t, err) + values[i] = v + } + + tc := NewFunctionTestCase(proc, + []FunctionTestInput{ + NewFunctionTestInput(typ, values, nil), + }, + NewFunctionTestResult(types.T_uint64.ToType(), false, []uint64{1, 1, 2, 64, 63, 63}, nil), + BitCountDecimal64) + ok, info := tc.Run() + require.True(t, ok, info) + + got, err := bitCountFromDecimal64(types.Decimal64Max, 0) + require.NoError(t, err) + require.Equal(t, uint64(63), got) + + got, err = bitCountFromDecimal64(types.Decimal64Min, 0) + require.NoError(t, err) + require.Equal(t, uint64(1), got) +} + +func TestBitCountDecimal128(t *testing.T) { + proc := testutil.NewProcess(t) + typ := types.New(types.T_decimal128, 38, 0) + inputs := []string{ + "9223372036854775807", + "9223372036854775808", + "18446744073709551615", + "-1", + "-9223372036854775808", + "-18446744073709551616", + } + values := make([]types.Decimal128, len(inputs)) + for i, input := range inputs { + v, err := types.ParseDecimal128(input, typ.Width, typ.Scale) + require.NoError(t, err) + values[i] = v + } + + tc := NewFunctionTestCase(proc, + []FunctionTestInput{ + NewFunctionTestInput(typ, values, nil), + }, + NewFunctionTestResult(types.T_uint64.ToType(), false, []uint64{63, 1, 64, 64, 1, 1}, nil), + BitCountDecimal128) + ok, info := tc.Run() + require.True(t, ok, info) + + overflow, err := types.ParseDecimal128("18446744073709551616", typ.Width, typ.Scale) + require.NoError(t, err) + _, err = bitCountFromDecimal128(overflow, typ.Scale) + require.Error(t, err) +} + +func TestBitCountDecimal256(t *testing.T) { + proc := testutil.NewProcess(t) + typ := types.New(types.T_decimal256, 65, 1) + values := []types.Decimal256{ + mustParseDecimal256(t, "1.5", 1), + mustParseDecimal256(t, "2.5", 1), + mustParseDecimal256(t, "-1.5", 1), + mustParseDecimal256(t, "9223372036854775807.0", 1), + mustParseDecimal256(t, "9223372036854775808.0", 1), + mustParseDecimal256(t, "18446744073709551615.0", 1), + mustParseDecimal256(t, "-1.0", 1), + mustParseDecimal256(t, "-18446744073709551616.0", 1), + } + + tc := NewFunctionTestCase(proc, + []FunctionTestInput{ + NewFunctionTestInput(typ, values, nil), + }, + NewFunctionTestResult(types.T_uint64.ToType(), false, []uint64{1, 2, 63, 63, 1, 64, 64, 1}, nil), + BitCountDecimal256) + ok, info := tc.Run() + require.True(t, ok, info) + + overflow := mustParseDecimal256(t, "18446744073709551616.0", typ.Scale) + _, err := bitCountFromDecimal256(overflow, typ.Scale) + require.Error(t, err) +} + +func TestBitCountBinaryString(t *testing.T) { + proc := testutil.NewProcess(t) + tc := NewFunctionTestCase(proc, + []FunctionTestInput{ + NewFunctionTestInput(types.T_varbinary.ToType(), []string{"64", "@", "\xff"}, nil), + }, + NewFunctionTestResult(types.T_uint64.ToType(), false, []uint64{7, 1, 8}, nil), + BitCountBinaryString) + ok, info := tc.Run() + require.True(t, ok, info) +} + +func TestBitCountVarcharWithIsBin(t *testing.T) { + proc := testutil.NewProcess(t) + mp := proc.Mp() + input := testutil.MakeVarlenaVector( + [][]byte{[]byte("64"), []byte("@"), {0x00}, {0xff}}, + nil, + types.T_varchar.ToType(), + mp, + ) + defer input.Free(mp) + input.SetIsBin(true) + + result := vector.NewFunctionResultWrapper(types.T_uint64.ToType(), mp) + defer result.Free() + require.NoError(t, result.PreExtendAndReset(input.Length())) + + require.NoError(t, BitCountNonBinaryString([]*vector.Vector{input}, result, proc, input.Length(), nil)) + require.Equal(t, []uint64{7, 1, 0, 8}, vector.MustFixedColNoTypeCheck[uint64](result.GetResultVector())) +} + +func TestBitCountUnhexUsesBinaryStringSemantics(t *testing.T) { + proc := testutil.NewProcess(t) + tc := NewFunctionTestCase(proc, + []FunctionTestInput{ + NewFunctionTestInput(types.T_blob.ToType(), []string{"@", "\xff", "\xff\xff"}, nil), + }, + NewFunctionTestResult(types.T_uint64.ToType(), false, []uint64{1, 8, 16}, nil), + BitCountBinaryString) + ok, info := tc.Run() + require.True(t, ok, info) + + ctx := context.Background() + unhex, err := GetFunctionByName(ctx, "unhex", []types.Type{types.T_varchar.ToType()}) + require.NoError(t, err) + require.Equal(t, types.T_blob, unhex.retType.Oid) + + bitCount, err := GetFunctionByName(ctx, "bit_count", []types.Type{unhex.retType}) + require.NoError(t, err) + require.Equal(t, int32(14), bitCount.overloadId) +} + +func TestBitCountTypeCheck(t *testing.T) { + ctx := context.Background() + + get, err := GetFunctionByName(ctx, "bit_count", []types.Type{types.T_varchar.ToType()}) + require.NoError(t, err) + require.Equal(t, int32(BIT_COUNT), get.fid) + require.Equal(t, int32(13), get.overloadId) + + get, err = GetFunctionByName(ctx, "bit_count", []types.Type{types.T_binary.ToType()}) + require.NoError(t, err) + require.Equal(t, int32(14), get.overloadId) + + get, err = GetFunctionByName(ctx, "bit_count", []types.Type{types.T_varbinary.ToType()}) + require.NoError(t, err) + require.Equal(t, int32(14), get.overloadId) + + get, err = GetFunctionByName(ctx, "bit_count", []types.Type{types.T_blob.ToType()}) + require.NoError(t, err) + require.Equal(t, int32(14), get.overloadId) +} diff --git a/pkg/sql/plan/function/func_unary.go b/pkg/sql/plan/function/func_unary.go index 09892b444561d..52d2a48fc2bd4 100644 --- a/pkg/sql/plan/function/func_unary.go +++ b/pkg/sql/plan/function/func_unary.go @@ -27,11 +27,13 @@ import ( "encoding/base64" "encoding/binary" "encoding/hex" + "errors" "fmt" "hash" "hash/crc32" "io" "math" + "math/bits" "net" "runtime" "sort" @@ -533,6 +535,177 @@ func BinFloat[T constraints.Float](ivecs []*vector.Vector, result vector.Functio }, selectList) } +func bitCountFromUint64(v uint64) uint64 { + return uint64(bits.OnesCount64(v)) +} + +const minInt64BitPattern = uint64(1) << 63 + +func bitCountFromSignedInt64Pattern(v int64) uint64 { + return bitCountFromUint64(uint64(v)) +} + +func bitCountFromMysqlIntegerString(s string) (uint64, error) { + s = strings.TrimSpace(s) + if s == "" { + return 0, nil + } + + if strings.HasPrefix(s, "-") { + val, err := strconv.ParseInt(s, 10, 64) + if err != nil { + if errors.Is(err, strconv.ErrRange) { + return bitCountFromUint64(minInt64BitPattern), nil + } + return 0, err + } + return bitCountFromUint64(uint64(val)), nil + } + + s = strings.TrimPrefix(s, "+") + val, err := strconv.ParseUint(s, 10, 64) + if err != nil { + if errors.Is(err, strconv.ErrRange) { + return bitCountFromUint64(math.MaxUint64), nil + } + return 0, err + } + return bitCountFromUint64(val), nil +} + +func bitCountFromDecimalIntegerString(s string) (uint64, error) { + s = strings.TrimSpace(s) + if s == "" { + return 0, nil + } + + if strings.HasPrefix(s, "-") { + val, err := strconv.ParseInt(s, 10, 64) + if err != nil { + if errors.Is(err, strconv.ErrRange) { + return bitCountFromUint64(minInt64BitPattern), nil + } + return 0, err + } + return bitCountFromUint64(uint64(val)), nil + } + + s = strings.TrimPrefix(s, "+") + val, err := strconv.ParseUint(s, 10, 64) + if err != nil { + if errors.Is(err, strconv.ErrRange) { + return 0, moerr.NewInvalidInputNoCtx("The input value is out of range") + } + return 0, err + } + return bitCountFromUint64(val), nil +} + +func bitCountFromFloat[T constraints.Float](v T, proc *process.Process) (uint64, error) { + val := float64(v) + if math.IsNaN(val) { + return 0, moerr.NewInvalidInput(proc.Ctx, "The input value is out of range") + } + if val <= float64(math.MinInt64) { + return bitCountFromUint64(minInt64BitPattern), nil + } + //2^63 - 1 = 9223372036854775807 + //2^64 - 1 = 18446744073709551615 + // The largest longlong that will fix into a double (LLONG_MAX is not + // exactly convertible to double, so for large double x, the test + // x <= LLONG_MAX does not guarantee x will fit in a longlong, + // and may give a compiler warning). LLONG_MIN is exact. + + // Similar, for ulonglong. + const ULLONG_MAX_DOUBLE = 18446744073709549568.0 + + rounded := math.RoundToEven(val) + if rounded <= float64(math.MinInt64) { + return bitCountFromUint64(minInt64BitPattern), nil + } + if rounded >= ULLONG_MAX_DOUBLE { + return bitCountFromUint64(uint64(math.MaxUint64)), nil + } + return bitCountFromUint64(uint64(rounded)), nil +} + +func bitCountFromDecimal64(v types.Decimal64, scale int32) (uint64, error) { + v = v.Round(scale, 0, true) + if v.Less(types.Decimal64Min) { + return bitCountFromUint64(minInt64BitPattern), nil + } + if types.Decimal64Max.Less(v) { + return bitCountFromUint64(uint64(math.MaxInt64)), nil + } + return bitCountFromSignedInt64Pattern(int64(v)), nil +} + +func bitCountFromDecimal128(v types.Decimal128, scale int32) (uint64, error) { + v = v.Round(scale, 0, true) + return bitCountFromDecimalIntegerString(v.Format(0)) +} + +func bitCountFromDecimal256(v types.Decimal256, scale int32) (uint64, error) { + v = v.Round(scale, 0, true) + return bitCountFromDecimalIntegerString(v.Format(0)) +} + +func bitCountFromNonBinaryString(v []byte) (uint64, error) { + return bitCountFromMysqlIntegerString(convertByteSliceToString(v)) +} + +func bitCountFromBinaryString(v []byte) uint64 { + var cnt uint64 + for _, b := range v { + cnt += uint64(bits.OnesCount8(b)) + } + return cnt +} + +func BitCountInteger[T constraints.Unsigned | constraints.Signed](ivecs []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int, selectList *FunctionSelectList) error { + return opUnaryFixedToFixed[T, uint64](ivecs, result, proc, length, func(v T) uint64 { + return bitCountFromUint64(uint64(v)) + }, selectList) +} + +func BitCountFloat[T constraints.Float](ivecs []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int, selectList *FunctionSelectList) error { + return opUnaryFixedToFixedWithErrorCheck[T, uint64](ivecs, result, proc, length, func(v T) (uint64, error) { + return bitCountFromFloat(v, proc) + }, selectList) +} + +func BitCountDecimal64(ivecs []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int, selectList *FunctionSelectList) error { + scale := ivecs[0].GetType().Scale + return opUnaryFixedToFixedWithErrorCheck[types.Decimal64, uint64](ivecs, result, proc, length, func(v types.Decimal64) (uint64, error) { + return bitCountFromDecimal64(v, scale) + }, selectList) +} + +func BitCountDecimal128(ivecs []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int, selectList *FunctionSelectList) error { + scale := ivecs[0].GetType().Scale + return opUnaryFixedToFixedWithErrorCheck[types.Decimal128, uint64](ivecs, result, proc, length, func(v types.Decimal128) (uint64, error) { + return bitCountFromDecimal128(v, scale) + }, selectList) +} + +func BitCountDecimal256(ivecs []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int, selectList *FunctionSelectList) error { + scale := ivecs[0].GetType().Scale + return opUnaryFixedToFixedWithErrorCheck[types.Decimal256, uint64](ivecs, result, proc, length, func(v types.Decimal256) (uint64, error) { + return bitCountFromDecimal256(v, scale) + }, selectList) +} + +func BitCountNonBinaryString(ivecs []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int, selectList *FunctionSelectList) error { + if ivecs[0].GetIsBin() { + return opUnaryBytesToFixed[uint64](ivecs, result, proc, length, bitCountFromBinaryString, selectList) + } + return opUnaryBytesToFixedWithErrorCheck[uint64](ivecs, result, proc, length, bitCountFromNonBinaryString, selectList) +} + +func BitCountBinaryString(ivecs []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int, selectList *FunctionSelectList) error { + return opUnaryBytesToFixed[uint64](ivecs, result, proc, length, bitCountFromBinaryString, selectList) +} + func BitLengthFunc(ivecs []*vector.Vector, result vector.FunctionResultWrapper, proc *process.Process, length int, selectList *FunctionSelectList) error { return opUnaryStrToFixed[int64](ivecs, result, proc, length, func(v string) int64 { return int64(len(v) * 8) diff --git a/pkg/sql/plan/function/function_id.go b/pkg/sql/plan/function/function_id.go index 1b5963c384588..85ba7e9a256de 100644 --- a/pkg/sql/plan/function/function_id.go +++ b/pkg/sql/plan/function/function_id.go @@ -723,9 +723,11 @@ const ( // merged from upstream/main (renumbered to avoid colliding with the GIS block above) CAST_JSON_TO_ARRAY = 513 + BIT_COUNT = 514 + // FUNCTION_END_NUMBER is not a function, just a flag to record the max number of function. // TODO: every one should put the new function id in front of this one if you want to make a new function. - FUNCTION_END_NUMBER = 514 + FUNCTION_END_NUMBER = 515 ) // functionIdRegister is what function we have registered already. @@ -803,6 +805,7 @@ var functionIdRegister = map[string]int32{ "bit_or": BIT_OR, "bit_and": BIT_AND, "bit_xor": BIT_XOR, + "bit_count": BIT_COUNT, "cluster_centers": CLUSTER_CENTERS, "subvector": SUB_VECTOR, "std": STDDEV_POP, diff --git a/pkg/sql/plan/function/function_id_test.go b/pkg/sql/plan/function/function_id_test.go index 818611631a350..049c8f9ec916b 100644 --- a/pkg/sql/plan/function/function_id_test.go +++ b/pkg/sql/plan/function/function_id_test.go @@ -567,9 +567,11 @@ var predefinedFunids = map[int]int{ ST_SYMDIFFERENCE: 511, ST_BUFFER: 512, CAST_JSON_TO_ARRAY: 513, + BIT_COUNT: 514, + // FUNCTION_END_NUMBER is not a function, just a flag to record the max number of function. // TODO: every one should put the new function id in front of this one if you want to make a new function. - FUNCTION_END_NUMBER: 514, + FUNCTION_END_NUMBER: 515, } func Test_funids(t *testing.T) { diff --git a/pkg/sql/plan/function/list_builtIn.go b/pkg/sql/plan/function/list_builtIn.go index dfc10464716fe..5de06e80029b2 100644 --- a/pkg/sql/plan/function/list_builtIn.go +++ b/pkg/sql/plan/function/list_builtIn.go @@ -6586,6 +6586,180 @@ var supportedMathBuiltIns = []FuncNew{ }, }, + // function `bit_count` + { + functionId: BIT_COUNT, + class: plan.Function_STRICT, + layout: STANDARD_FUNCTION, + checkFn: func(overloads []overload, inputs []types.Type) checkResult { + if len(inputs) != 1 { + return newCheckResultWithFailure(failedFunctionParametersWrong) + } + switch inputs[0].Oid { + case types.T_any: + return newCheckResultWithCast(0, []types.Type{types.T_int64.ToType()}) + case types.T_binary, types.T_varbinary, types.T_blob: + return newCheckResultWithSuccess(14) + case types.T_char, types.T_varchar, types.T_text: + return newCheckResultWithSuccess(13) + } + return fixedTypeMatch(overloads, inputs) + }, + + Overloads: []overload{ + { + overloadId: 0, + args: []types.T{types.T_uint8}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountInteger[uint8] + }, + }, + { + overloadId: 1, + args: []types.T{types.T_uint16}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountInteger[uint16] + }, + }, + { + overloadId: 2, + args: []types.T{types.T_uint32}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountInteger[uint32] + }, + }, + { + overloadId: 3, + args: []types.T{types.T_uint64}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountInteger[uint64] + }, + }, + { + overloadId: 4, + args: []types.T{types.T_int8}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountInteger[int8] + }, + }, + { + overloadId: 5, + args: []types.T{types.T_int16}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountInteger[int16] + }, + }, + { + overloadId: 6, + args: []types.T{types.T_int32}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountInteger[int32] + }, + }, + { + overloadId: 7, + args: []types.T{types.T_int64}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountInteger[int64] + }, + }, + { + overloadId: 8, + args: []types.T{types.T_float32}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountFloat[float32] + }, + }, + { + overloadId: 9, + args: []types.T{types.T_float64}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountFloat[float64] + }, + }, + { + overloadId: 10, + args: []types.T{types.T_decimal64}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountDecimal64 + }, + }, + { + overloadId: 11, + args: []types.T{types.T_decimal128}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountDecimal128 + }, + }, + { + overloadId: 12, + args: []types.T{types.T_decimal256}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountDecimal256 + }, + }, + { + overloadId: 13, + args: []types.T{types.T_varchar}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountNonBinaryString + }, + }, + { + overloadId: 14, + args: []types.T{types.T_varbinary}, + retType: func(parameters []types.Type) types.Type { + return types.T_uint64.ToType() + }, + newOp: func() executeLogicOfOverload { + return BitCountBinaryString + }, + }, + }, + }, + // function `ceil`, `ceiling` { functionId: CEIL, @@ -7060,7 +7234,7 @@ var supportedMathBuiltIns = []FuncNew{ overloadId: 0, args: []types.T{types.T_varchar}, retType: func(parameters []types.Type) types.Type { - return types.T_varchar.ToType() + return types.T_blob.ToType() }, newOp: func() executeLogicOfOverload { return Unhex diff --git a/pkg/sql/plan/query_builder_test.go b/pkg/sql/plan/query_builder_test.go index 2fe6cf1dc82cc..68a7822a7aaa3 100644 --- a/pkg/sql/plan/query_builder_test.go +++ b/pkg/sql/plan/query_builder_test.go @@ -17,6 +17,7 @@ package plan import ( "context" "encoding/json" + "math" "strings" "testing" @@ -2331,6 +2332,51 @@ func TestBaseBinder_bindComparisonExpr(t *testing.T) { } } +func TestBaseBinderBindUnaryMinusMinInt64Literal(t *testing.T) { + builder, bindCtx := genBuilderAndCtx() + whereBinder := NewWhereBinder(builder, bindCtx) + + testCases := []struct { + name string + sql string + checkValue func(t *testing.T, expr *plan.Expr) + }{ + { + name: "min int64 boundary", + sql: "-9223372036854775808", + checkValue: func(t *testing.T, expr *plan.Expr) { + require.Equal(t, int32(types.T_int64), expr.Typ.Id) + require.Equal(t, int64(math.MinInt64), expr.GetLit().GetI64Val()) + }, + }, + { + name: "below min int64 keeps decimal", + sql: "-9223372036854775809", + checkValue: func(t *testing.T, expr *plan.Expr) { + require.Equal(t, int32(types.T_decimal128), expr.Typ.Id) + require.NotNil(t, expr.GetLit().GetDecimal128Val()) + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + stmts, err := parsers.Parse(context.TODO(), dialect.MYSQL, "select "+tc.sql+" from bind_select", 1) + require.NoError(t, err) + + selectStmt := stmts[0].(*tree.Select) + selectClause := selectStmt.Select.(*tree.SelectClause) + unaryExpr, ok := selectClause.Exprs[0].Expr.(*tree.UnaryExpr) + require.True(t, ok) + + expr, err := whereBinder.bindUnaryExpr(unaryExpr, 0, false) + require.NoError(t, err) + require.NotNil(t, expr.GetLit()) + tc.checkValue(t, expr) + }) + } +} + // TestBaseBinder_bindUnaryExpr tests bindUnaryExpr with various unary operators func TestBaseBinder_bindUnaryExpr(t *testing.T) { builder, bindCtx := genBuilderAndCtx() diff --git a/test/distributed/cases/charset_collation/charset_collation_advanced.result b/test/distributed/cases/charset_collation/charset_collation_advanced.result index 5f9ba5085a400..130305c713345 100644 --- a/test/distributed/cases/charset_collation/charset_collation_advanced.result +++ b/test/distributed/cases/charset_collation/charset_collation_advanced.result @@ -57,10 +57,10 @@ SELECT * FROM t_hex_test ORDER BY id; 2 ¦ 你好 ¦ E4BDA0E5A5BD 𝄀 3 ¦ 😀 ¦ F09F9880 SELECT id, original, UNHEX(hex_value) as decoded FROM t_hex_test ORDER BY id; -➤ id[4,32,0] ¦ original[12,-1,0] ¦ decoded[12,-1,0] 𝄀 +➤ id[4,32,0] ¦ original[12,-1,0] ¦ decoded[12,0,0] 𝄀 1 ¦ Hello ¦ Hello 𝄀 -2 ¦ 你好 ¦ 你好 𝄀 -3 ¦ 😀 ¦ 😀 +2 ¦ 你好 ¦ 你好 𝄀 +3 ¦ 😀 ¦ 😀 CREATE TABLE t_pad_test ( id INT PRIMARY KEY, data VARCHAR(100) @@ -153,8 +153,8 @@ SELECT id, LOCATE('测试', data) as pos FROM t_locate_test WHERE id = 3; ➤ id[4,32,0] ¦ pos[-5,64,0] 𝄀 3 ¦ 5 SELECT id, POSITION('测试' IN data) as pos FROM t_locate_test WHERE id = 3; -id pos -3 5 +➤ id[4,32,0] ¦ pos[-5,64,0] 𝄀 +3 ¦ 5 SELECT INSTR('Hello World', 'World'); ➤ INSTR(Hello World, World)[-5,64,0] 𝄀 7 diff --git a/test/distributed/cases/function/func_bit_count.result b/test/distributed/cases/function/func_bit_count.result new file mode 100644 index 0000000000000..16c5c14816821 --- /dev/null +++ b/test/distributed/cases/function/func_bit_count.result @@ -0,0 +1,187 @@ +SELECT BIT_COUNT(64), BIT_COUNT(BINARY 64); +➤ BIT_COUNT(64)[-5,64,0] ¦ BIT_COUNT(BINARY(64))[-5,64,0] 𝄀 +1 ¦ 7 +SELECT BIT_COUNT('64'), BIT_COUNT(_binary '64'); +➤ BIT_COUNT(64)[-5,64,0] ¦ BIT_COUNT(64)[-5,64,0] 𝄀 +1 ¦ 7 +SELECT BIT_COUNT(X'40'), BIT_COUNT(_binary X'40'); +➤ BIT_COUNT(0x40)[-5,64,0] ¦ BIT_COUNT(0x40)[-5,64,0] 𝄀 +1 ¦ 1 +SELECT BIT_COUNT(NULL); +➤ BIT_COUNT(null)[-5,64,0] 𝄀 +null +SELECT BIT_COUNT(0), BIT_COUNT(1), BIT_COUNT(2), BIT_COUNT(3), BIT_COUNT(255), BIT_COUNT(256); +➤ BIT_COUNT(0)[-5,64,0] ¦ BIT_COUNT(1)[-5,64,0] ¦ BIT_COUNT(2)[-5,64,0] ¦ BIT_COUNT(3)[-5,64,0] ¦ BIT_COUNT(255)[-5,64,0] ¦ BIT_COUNT(256)[-5,64,0] 𝄀 +0 ¦ 1 ¦ 1 ¦ 2 ¦ 8 ¦ 1 +SELECT BIT_COUNT(-1), BIT_COUNT(-2), BIT_COUNT(-9223372036854775808); +➤ BIT_COUNT(-1)[-5,64,0] ¦ BIT_COUNT(-2)[-5,64,0] ¦ BIT_COUNT(-9223372036854775808)[-5,64,0] 𝄀 +64 ¦ 63 ¦ 1 +SELECT BIT_COUNT(CAST('9223372036854775806' AS BIGINT)), BIT_COUNT(CAST('9223372036854775807' AS BIGINT)); +➤ BIT_COUNT(cast(9223372036854775806 as bigint))[-5,64,0] ¦ BIT_COUNT(cast(9223372036854775807 as bigint))[-5,64,0] 𝄀 +62 ¦ 63 +SELECT BIT_COUNT(CAST('-9223372036854775807' AS BIGINT)), BIT_COUNT(CAST('-9223372036854775808' AS BIGINT)); +➤ BIT_COUNT(cast(-9223372036854775807 as bigint))[-5,64,0] ¦ BIT_COUNT(cast(-9223372036854775808 as bigint))[-5,64,0] 𝄀 +2 ¦ 1 +SELECT BIT_COUNT(CAST(64 AS TINYINT)), BIT_COUNT(CAST(64 AS SMALLINT)), BIT_COUNT(CAST(64 AS INT)), BIT_COUNT(CAST(64 AS BIGINT)); +➤ BIT_COUNT(cast(64 as tinyint))[-5,64,0] ¦ BIT_COUNT(cast(64 as smallint))[-5,64,0] ¦ BIT_COUNT(cast(64 as int))[-5,64,0] ¦ BIT_COUNT(cast(64 as bigint))[-5,64,0] 𝄀 +1 ¦ 1 ¦ 1 ¦ 1 +SELECT BIT_COUNT(CAST(-1 AS TINYINT)), BIT_COUNT(CAST(-1 AS SMALLINT)), BIT_COUNT(CAST(-1 AS INT)), BIT_COUNT(CAST(-1 AS BIGINT)); +➤ BIT_COUNT(cast(-1 as tinyint))[-5,64,0] ¦ BIT_COUNT(cast(-1 as smallint))[-5,64,0] ¦ BIT_COUNT(cast(-1 as int))[-5,64,0] ¦ BIT_COUNT(cast(-1 as bigint))[-5,64,0] 𝄀 +64 ¦ 64 ¦ 64 ¦ 64 +SELECT BIT_COUNT(CAST(255 AS TINYINT UNSIGNED)), BIT_COUNT(CAST(65535 AS SMALLINT UNSIGNED)), BIT_COUNT(CAST(4294967295 AS INT UNSIGNED)); +➤ BIT_COUNT(cast(255 as tinyint unsigned))[-5,64,0] ¦ BIT_COUNT(cast(65535 as smallint unsigned))[-5,64,0] ¦ BIT_COUNT(cast(4294967295 as int unsigned))[-5,64,0] 𝄀 +8 ¦ 16 ¦ 32 +SELECT BIT_COUNT(CAST('4294967296' AS BIGINT UNSIGNED)), BIT_COUNT(CAST('9223372036854775808' AS BIGINT UNSIGNED)); +➤ BIT_COUNT(cast(4294967296 as bigint unsigned))[-5,64,0] ¦ BIT_COUNT(cast(9223372036854775808 as bigint unsigned))[-5,64,0] 𝄀 +1 ¦ 1 +SELECT BIT_COUNT(CAST('18446744073709551614' AS BIGINT UNSIGNED)), BIT_COUNT(CAST('18446744073709551615' AS BIGINT UNSIGNED)); +➤ BIT_COUNT(cast(18446744073709551614 as bigint unsigned))[-5,64,0] ¦ BIT_COUNT(cast(18446744073709551615 as bigint unsigned))[-5,64,0] 𝄀 +63 ¦ 64 +SELECT BIT_COUNT(CAST(64.9 AS FLOAT)), BIT_COUNT(CAST(64.9 AS DOUBLE)); +➤ BIT_COUNT(cast(64.9 as float))[-5,64,0] ¦ BIT_COUNT(cast(64.9 as double))[-5,64,0] 𝄀 +2 ¦ 2 +SELECT BIT_COUNT(CAST(64.9 AS DECIMAL(10, 1))), BIT_COUNT(CAST(255.9 AS DECIMAL(10, 1))); +➤ BIT_COUNT(cast(64.9 as decimal(10, 1)))[-5,64,0] ¦ BIT_COUNT(cast(255.9 as decimal(10, 1)))[-5,64,0] 𝄀 +2 ¦ 1 +SELECT BIT_COUNT(CAST(1.4 AS FLOAT)), BIT_COUNT(CAST(1.5 AS FLOAT)), BIT_COUNT(CAST(2.5 AS FLOAT)), BIT_COUNT(CAST(3.5 AS FLOAT)); +➤ BIT_COUNT(cast(1.4 as float))[-5,64,0] ¦ BIT_COUNT(cast(1.5 as float))[-5,64,0] ¦ BIT_COUNT(cast(2.5 as float))[-5,64,0] ¦ BIT_COUNT(cast(3.5 as float))[-5,64,0] 𝄀 +1 ¦ 1 ¦ 1 ¦ 1 +SELECT BIT_COUNT(CAST(4.5 AS FLOAT)), BIT_COUNT(CAST(5.5 AS FLOAT)), BIT_COUNT(CAST(6.5 AS FLOAT)), BIT_COUNT(CAST(7.5 AS FLOAT)); +➤ BIT_COUNT(cast(4.5 as float))[-5,64,0] ¦ BIT_COUNT(cast(5.5 as float))[-5,64,0] ¦ BIT_COUNT(cast(6.5 as float))[-5,64,0] ¦ BIT_COUNT(cast(7.5 as float))[-5,64,0] 𝄀 +1 ¦ 2 ¦ 2 ¦ 1 +SELECT BIT_COUNT(CAST(-1.4 AS DOUBLE)), BIT_COUNT(CAST(-1.5 AS DOUBLE)), BIT_COUNT(CAST(-2.5 AS DOUBLE)), BIT_COUNT(CAST(-3.5 AS DOUBLE)); +➤ BIT_COUNT(cast(-1.4 as double))[-5,64,0] ¦ BIT_COUNT(cast(-1.5 as double))[-5,64,0] ¦ BIT_COUNT(cast(-2.5 as double))[-5,64,0] ¦ BIT_COUNT(cast(-3.5 as double))[-5,64,0] 𝄀 +64 ¦ 63 ¦ 63 ¦ 62 +SELECT BIT_COUNT(CAST(-4.5 AS DOUBLE)), BIT_COUNT(CAST(-5.5 AS DOUBLE)), BIT_COUNT(CAST(-6.5 AS DOUBLE)), BIT_COUNT(CAST(-7.5 AS DOUBLE)); +➤ BIT_COUNT(cast(-4.5 as double))[-5,64,0] ¦ BIT_COUNT(cast(-5.5 as double))[-5,64,0] ¦ BIT_COUNT(cast(-6.5 as double))[-5,64,0] ¦ BIT_COUNT(cast(-7.5 as double))[-5,64,0] 𝄀 +62 ¦ 62 ¦ 62 ¦ 61 +SELECT BIT_COUNT(CAST('9223372036854774784' AS DOUBLE)), BIT_COUNT(CAST('9223372036854775807' AS DOUBLE)); +➤ BIT_COUNT(cast(9223372036854774784 as double))[-5,64,0] ¦ BIT_COUNT(cast(9223372036854775807 as double))[-5,64,0] 𝄀 +53 ¦ 1 +SELECT BIT_COUNT(CAST('9223372036854775808' AS DOUBLE)), BIT_COUNT(CAST('-9223372036854775809' AS DOUBLE)); +➤ BIT_COUNT(cast(9223372036854775808 as double))[-5,64,0] ¦ BIT_COUNT(cast(-9223372036854775809 as double))[-5,64,0] 𝄀 +1 ¦ 1 +SELECT BIT_COUNT(CAST('18446744073709551615' AS DOUBLE)), BIT_COUNT(CAST('18446744073709551616' AS DOUBLE)); +➤ BIT_COUNT(cast(18446744073709551615 as double))[-5,64,0] ¦ BIT_COUNT(cast(18446744073709551616 as double))[-5,64,0] 𝄀 +64 ¦ 64 +SELECT BIT_COUNT(CAST('-9223372036854774784' AS DOUBLE)), BIT_COUNT(CAST('-9223372036854775808' AS DOUBLE)); +➤ BIT_COUNT(cast(-9223372036854774784 as double))[-5,64,0] ¦ BIT_COUNT(cast(-9223372036854775808 as double))[-5,64,0] 𝄀 +2 ¦ 1 +SELECT BIT_COUNT(CAST(1.4 AS DECIMAL(10, 1))), BIT_COUNT(CAST(1.5 AS DECIMAL(10, 1))), BIT_COUNT(CAST(2.5 AS DECIMAL(10, 1))), BIT_COUNT(CAST(-1.4 AS DECIMAL(10, 1))), BIT_COUNT(CAST(-1.5 AS DECIMAL(10, 1))), BIT_COUNT(CAST(-2.5 AS DECIMAL(10, 1))); +➤ BIT_COUNT(cast(1.4 as decimal(10, 1)))[-5,64,0] ¦ BIT_COUNT(cast(1.5 as decimal(10, 1)))[-5,64,0] ¦ BIT_COUNT(cast(2.5 as decimal(10, 1)))[-5,64,0] ¦ BIT_COUNT(cast(-1.4 as decimal(10, 1)))[-5,64,0] ¦ BIT_COUNT(cast(-1.5 as decimal(10, 1)))[-5,64,0] ¦ BIT_COUNT(cast(-2.5 as decimal(10, 1)))[-5,64,0] 𝄀 +1 ¦ 1 ¦ 2 ¦ 64 ¦ 63 ¦ 63 +SELECT BIT_COUNT(CAST(2.4 AS DECIMAL(10, 1))), BIT_COUNT(CAST(2.5 AS DECIMAL(10, 1))), BIT_COUNT(CAST(2.6 AS DECIMAL(10, 1))), BIT_COUNT(CAST(-2.4 AS DECIMAL(10, 1))), BIT_COUNT(CAST(-2.5 AS DECIMAL(10, 1))), BIT_COUNT(CAST(-2.6 AS DECIMAL(10, 1))); +➤ BIT_COUNT(cast(2.4 as decimal(10, 1)))[-5,64,0] ¦ BIT_COUNT(cast(2.5 as decimal(10, 1)))[-5,64,0] ¦ BIT_COUNT(cast(2.6 as decimal(10, 1)))[-5,64,0] ¦ BIT_COUNT(cast(-2.4 as decimal(10, 1)))[-5,64,0] ¦ BIT_COUNT(cast(-2.5 as decimal(10, 1)))[-5,64,0] ¦ BIT_COUNT(cast(-2.6 as decimal(10, 1)))[-5,64,0] 𝄀 +1 ¦ 2 ¦ 2 ¦ 63 ¦ 63 ¦ 63 +SELECT BIT_COUNT(CAST('9223372036854775807' AS DECIMAL(38, 0))), BIT_COUNT(CAST('9223372036854775808' AS DECIMAL(38, 0))); +➤ BIT_COUNT(cast(9223372036854775807 as decimal(38)))[-5,64,0] ¦ BIT_COUNT(cast(9223372036854775808 as decimal(38)))[-5,64,0] 𝄀 +63 ¦ 1 +SELECT BIT_COUNT(CAST('9223372036854775807.4' AS DECIMAL(38, 1))), BIT_COUNT(CAST('9223372036854775807.5' AS DECIMAL(38, 1))); +➤ BIT_COUNT(cast(9223372036854775807.4 as decimal(38, 1)))[-5,64,0] ¦ BIT_COUNT(cast(9223372036854775807.5 as decimal(38, 1)))[-5,64,0] 𝄀 +63 ¦ 1 +SELECT BIT_COUNT(CAST('-9223372036854775807.4' AS DECIMAL(38, 1))), BIT_COUNT(CAST('-9223372036854775807.5' AS DECIMAL(38, 1))); +➤ BIT_COUNT(cast(-9223372036854775807.4 as decimal(38, 1)))[-5,64,0] ¦ BIT_COUNT(cast(-9223372036854775807.5 as decimal(38, 1)))[-5,64,0] 𝄀 +2 ¦ 1 +SELECT BIT_COUNT(CAST('18446744073709551615' AS DECIMAL(38, 0))); +➤ BIT_COUNT(cast(18446744073709551615 as decimal(38)))[-5,64,0] 𝄀 +64 +SELECT BIT_COUNT(CAST('18446744073709551616' AS DECIMAL(38, 0))); +invalid input: The input value is out of range +SELECT BIT_COUNT(CAST('-9223372036854775808' AS DECIMAL(38, 0))); +➤ BIT_COUNT(cast(-9223372036854775808 as decimal(38)))[-5,64,0] 𝄀 +1 +SELECT BIT_COUNT(CAST('-18446744073709551616' AS DECIMAL(38, 0))); +➤ BIT_COUNT(cast(-18446744073709551616 as decimal(38)))[-5,64,0] 𝄀 +1 +SELECT BIT_COUNT(CAST('99999999999999999999999999999999999999' AS DECIMAL(38, 0))); +invalid input: The input value is out of range +SELECT BIT_COUNT(CAST('-99999999999999999999999999999999999999' AS DECIMAL(38, 0))); +➤ BIT_COUNT(cast(-99999999999999999999999999999999999999 as decimal(38)))[-5,64,0] 𝄀 +1 +SELECT BIT_COUNT(CAST('9999999999999999999999999999999999999.5' AS DECIMAL(38, 1))); +invalid input: The input value is out of range +SELECT BIT_COUNT(CAST('-9999999999999999999999999999999999999.5' AS DECIMAL(38, 1))); +➤ BIT_COUNT(cast(-9999999999999999999999999999999999999.5 as decimal(38, 1)))[-5,64,0] 𝄀 +1 +SELECT BIT_COUNT(CAST('99999999999999999999999999999999999999999999999999999999999999999' AS DECIMAL(65, 0))); +invalid input: The input value is out of range +SELECT BIT_COUNT(CAST('-99999999999999999999999999999999999999999999999999999999999999999' AS DECIMAL(65, 0))); +➤ BIT_COUNT(cast(-99999999999999999999999999999999999999999999999999999999999999999 as decimal(65)))[-5,64,0] 𝄀 +1 +SELECT BIT_COUNT(CAST('9999999999999999999999999999999999999999999999999999999999999999.5' AS DECIMAL(65, 1))); +invalid input: The input value is out of range +SELECT BIT_COUNT(CAST('-9999999999999999999999999999999999999999999999999999999999999999.5' AS DECIMAL(65, 1))); +➤ BIT_COUNT(cast(-9999999999999999999999999999999999999999999999999999999999999999.5 as decimal(65, 1)))[-5,64,0] 𝄀 +1 +SELECT BIT_COUNT('0'), BIT_COUNT('1'), BIT_COUNT('64'), BIT_COUNT('255'), BIT_COUNT('-1'); +➤ BIT_COUNT(0)[-5,64,0] ¦ BIT_COUNT(1)[-5,64,0] ¦ BIT_COUNT(64)[-5,64,0] ¦ BIT_COUNT(255)[-5,64,0] ¦ BIT_COUNT(-1)[-5,64,0] 𝄀 +0 ¦ 1 ¦ 1 ¦ 8 ¦ 64 +SELECT BIT_COUNT(CAST('64' AS CHAR)), BIT_COUNT(CAST('64' AS VARCHAR(10))), BIT_COUNT(CAST('64' AS TEXT)); +➤ BIT_COUNT(cast(64 as varchar))[-5,64,0] ¦ BIT_COUNT(cast(64 as varchar(10)))[-5,64,0] ¦ BIT_COUNT(cast(64 as text))[-5,64,0] 𝄀 +1 ¦ 1 ¦ 1 +SELECT BIT_COUNT(''), BIT_COUNT(' '), BIT_COUNT(CAST('' AS CHAR)), BIT_COUNT(CAST('' AS VARCHAR(10))), BIT_COUNT(CAST('' AS TEXT)); +➤ BIT_COUNT()[-5,64,0] ¦ BIT_COUNT( )[-5,64,0] ¦ BIT_COUNT(cast( as varchar))[-5,64,0] ¦ BIT_COUNT(cast( as varchar(10)))[-5,64,0] ¦ BIT_COUNT(cast( as text))[-5,64,0] 𝄀 +0 ¦ 0 ¦ 0 ¦ 0 ¦ 0 +SELECT BIT_COUNT('+1'), BIT_COUNT('9223372036854775808'), BIT_COUNT('18446744073709551615'), BIT_COUNT('18446744073709551616'); +➤ BIT_COUNT(+1)[-5,64,0] ¦ BIT_COUNT(9223372036854775808)[-5,64,0] ¦ BIT_COUNT(18446744073709551615)[-5,64,0] ¦ BIT_COUNT(18446744073709551616)[-5,64,0] 𝄀 +1 ¦ 1 ¦ 64 ¦ 64 +SELECT BIT_COUNT('-9223372036854775808'), BIT_COUNT('-18446744073709551616'); +➤ BIT_COUNT(-9223372036854775808)[-5,64,0] ¦ BIT_COUNT(-18446744073709551616)[-5,64,0] 𝄀 +1 ¦ 1 +SELECT BIT_COUNT(CAST('18446744073709551615' AS CHAR)), BIT_COUNT(CAST('-18446744073709551616' AS VARCHAR(32))); +➤ BIT_COUNT(cast(18446744073709551615 as varchar))[-5,64,0] ¦ BIT_COUNT(cast(-18446744073709551616 as varchar(32)))[-5,64,0] 𝄀 +64 ¦ 1 +select BIT_COUNT('18446744073709551615'), BIT_COUNT(CAST('18446744073709551615' AS DECIMAL(38,0))), BIT_COUNT(CAST('18446744073709551615' AS DOUBLE)), BIT_COUNT(CAST('9223372036854775808' AS DOUBLE)); +➤ BIT_COUNT(18446744073709551615)[-5,64,0] ¦ BIT_COUNT(cast(18446744073709551615 as decimal(38)))[-5,64,0] ¦ BIT_COUNT(cast(18446744073709551615 as double))[-5,64,0] ¦ BIT_COUNT(cast(9223372036854775808 as double))[-5,64,0] 𝄀 +64 ¦ 64 ¦ 64 ¦ 1 +SELECT BIT_COUNT(BINARY '64'), BIT_COUNT(_binary '64'), BIT_COUNT(CAST('64' AS BINARY)), BIT_COUNT(CAST('64' AS VARBINARY(2))); +➤ BIT_COUNT(BINARY(64))[-5,64,0] ¦ BIT_COUNT(64)[-5,64,0] ¦ BIT_COUNT(cast(64 as binary))[-5,64,0] ¦ BIT_COUNT(cast(64 as varbinary(2)))[-5,64,0] 𝄀 +7 ¦ 7 ¦ 7 ¦ 7 +SELECT BIT_COUNT(BINARY ''), BIT_COUNT(_binary ''), BIT_COUNT(CAST('' AS BINARY)), BIT_COUNT(CAST('' AS VARBINARY(2))); +➤ BIT_COUNT(BINARY())[-5,64,0] ¦ BIT_COUNT()[-5,64,0] ¦ BIT_COUNT(cast( as binary))[-5,64,0] ¦ BIT_COUNT(cast( as varbinary(2)))[-5,64,0] 𝄀 +0 ¦ 0 ¦ 0 ¦ 0 +SELECT BIT_COUNT(X'00'), BIT_COUNT(X'01'), BIT_COUNT(X'40'), BIT_COUNT(X'FF'), BIT_COUNT(X'FFFF'); +➤ BIT_COUNT(0x00)[-5,64,0] ¦ BIT_COUNT(0x01)[-5,64,0] ¦ BIT_COUNT(0x40)[-5,64,0] ¦ BIT_COUNT(0xFF)[-5,64,0] ¦ BIT_COUNT(0xFFFF)[-5,64,0] 𝄀 +0 ¦ 1 ¦ 1 ¦ 8 ¦ 16 +SELECT BIT_COUNT(_binary X'00'), BIT_COUNT(_binary X'01'), BIT_COUNT(_binary X'40'), BIT_COUNT(_binary X'FF'), BIT_COUNT(_binary X'FFFF'); +➤ BIT_COUNT(0x00)[-5,64,0] ¦ BIT_COUNT(0x01)[-5,64,0] ¦ BIT_COUNT(0x40)[-5,64,0] ¦ BIT_COUNT(0xFF)[-5,64,0] ¦ BIT_COUNT(0xFFFF)[-5,64,0] 𝄀 +0 ¦ 1 ¦ 1 ¦ 8 ¦ 16 +SELECT HEX(_binary 0x40), BIT_COUNT(_binary 0x40); +➤ HEX(0x40)[12,-1,0] ¦ BIT_COUNT(0x40)[-5,64,0] 𝄀 +40 ¦ 1 +SELECT HEX(_binary 0x00), BIT_COUNT(_binary 0x00), HEX(_binary 0x01), BIT_COUNT(_binary 0x01), HEX(_binary 0xff), BIT_COUNT(_binary 0xff), HEX(_binary 0xFFFF), BIT_COUNT(_binary 0xFFFF); +➤ HEX(0x00)[12,-1,0] ¦ BIT_COUNT(0x00)[-5,64,0] ¦ HEX(0x01)[12,-1,0] ¦ BIT_COUNT(0x01)[-5,64,0] ¦ HEX(0xff)[12,-1,0] ¦ BIT_COUNT(0xff)[-5,64,0] ¦ HEX(0xffff)[12,-1,0] ¦ BIT_COUNT(0xffff)[-5,64,0] 𝄀 +00 ¦ 0 ¦ 01 ¦ 1 ¦ FF ¦ 8 ¦ FFFF ¦ 16 +SELECT HEX(_binary 0x0102030405060708), BIT_COUNT(_binary 0x0102030405060708), HEX(_binary 0xFFFFFFFFFFFFFFFF), BIT_COUNT(_binary 0xFFFFFFFFFFFFFFFF); +➤ HEX(0x0102030405060708)[12,-1,0] ¦ BIT_COUNT(0x0102030405060708)[-5,64,0] ¦ HEX(0xffffffffffffffff)[12,-1,0] ¦ BIT_COUNT(0xffffffffffffffff)[-5,64,0] 𝄀 +0102030405060708 ¦ 13 ¦ FFFFFFFFFFFFFFFF ¦ 64 +SELECT BIT_COUNT(X'0102030405060708'), BIT_COUNT(X'FFFFFFFFFFFFFFFF'), BIT_COUNT(X'FFFFFFFFFFFFFFFFFF'); +➤ BIT_COUNT(0x0102030405060708)[-5,64,0] ¦ BIT_COUNT(0xFFFFFFFFFFFFFFFF)[-5,64,0] ¦ BIT_COUNT(0xFFFFFFFFFFFFFFFFFF)[-5,64,0] 𝄀 +13 ¦ 64 ¦ 72 +SELECT BIT_COUNT(UNHEX('40')), BIT_COUNT(UNHEX('FF')), BIT_COUNT(UNHEX('FFFF')); +➤ BIT_COUNT(UNHEX(40))[-5,64,0] ¦ BIT_COUNT(UNHEX(FF))[-5,64,0] ¦ BIT_COUNT(UNHEX(FFFF))[-5,64,0] 𝄀 +1 ¦ 8 ¦ 16 +DROP TABLE IF EXISTS t_bit_count; +CREATE TABLE t_bit_count( +id INT, +i BIGINT, +u BIGINT UNSIGNED, +s VARCHAR(10), +b VARBINARY(4) +); +INSERT INTO t_bit_count VALUES +(1, 64, 64, '64', X'40'), +(2, -1, 255, '-1', X'FF'), +(3, NULL, NULL, NULL, NULL), +(4, 64, 64, '64', _binary 0x40); +SELECT id, BIT_COUNT(i), BIT_COUNT(u), BIT_COUNT(s), BIT_COUNT(b) FROM t_bit_count ORDER BY id; +➤ id[4,32,0] ¦ BIT_COUNT(i)[-5,64,0] ¦ BIT_COUNT(u)[-5,64,0] ¦ BIT_COUNT(s)[-5,64,0] ¦ BIT_COUNT(b)[-5,64,0] 𝄀 +1 ¦ 1 ¦ 1 ¦ 1 ¦ 1 𝄀 +2 ¦ 64 ¦ 8 ¦ 64 ¦ 8 𝄀 +3 ¦ null ¦ null ¦ null ¦ null 𝄀 +4 ¦ 1 ¦ 1 ¦ 1 ¦ 1 +SELECT id FROM t_bit_count WHERE BIT_COUNT(b) = 1 ORDER BY id; +➤ id[4,32,0] 𝄀 +1 𝄀 +4 +DROP TABLE t_bit_count; diff --git a/test/distributed/cases/function/func_bit_count.test b/test/distributed/cases/function/func_bit_count.test new file mode 100644 index 0000000000000..a61d352c46afb --- /dev/null +++ b/test/distributed/cases/function/func_bit_count.test @@ -0,0 +1,138 @@ +-- @suit +-- @case +-- @desc:test for function bit_count() +-- @label:bvt + +# Basic examples +# hex: 64 = 0x0040; BINARY 64 = 0x3634 +SELECT BIT_COUNT(64), BIT_COUNT(BINARY 64); +# hex: '64' -> 64 / 0x0040; _binary '64' = 0x3634 +SELECT BIT_COUNT('64'), BIT_COUNT(_binary '64'); +# hex: X'40' = 0x0040; _binary X'40' = 0x0040 +SELECT BIT_COUNT(X'40'), BIT_COUNT(_binary X'40'); +# hex: NULL = NULL +SELECT BIT_COUNT(NULL); + +# Numeric values +# hex: 0 = 0x0000; 1 = 0x0001; 2 = 0x0002; 3 = 0x0003; 255 = 0x00ff; 256 = 0x0100 +SELECT BIT_COUNT(0), BIT_COUNT(1), BIT_COUNT(2), BIT_COUNT(3), BIT_COUNT(255), BIT_COUNT(256); +# hex: -1 = -0x0001; -2 = -0x0002; -9223372036854775808 = -0x8000 0000 0000 0000 +SELECT BIT_COUNT(-1), BIT_COUNT(-2), BIT_COUNT(-9223372036854775808); +# hex: 9223372036854775806 = 0x7fff ffff ffff fffe; 9223372036854775807 = 0x7fff ffff ffff ffff +SELECT BIT_COUNT(CAST('9223372036854775806' AS BIGINT)), BIT_COUNT(CAST('9223372036854775807' AS BIGINT)); +# hex: -9223372036854775807 = -0x7fff ffff ffff ffff; -9223372036854775808 = -0x8000 0000 0000 0000 +SELECT BIT_COUNT(CAST('-9223372036854775807' AS BIGINT)), BIT_COUNT(CAST('-9223372036854775808' AS BIGINT)); +# hex: 64 = 0x0040; 64 = 0x0040; 64 = 0x0040; 64 = 0x0040 +SELECT BIT_COUNT(CAST(64 AS TINYINT)), BIT_COUNT(CAST(64 AS SMALLINT)), BIT_COUNT(CAST(64 AS INT)), BIT_COUNT(CAST(64 AS BIGINT)); +# hex: -1 = -0x0001; -1 = -0x0001; -1 = -0x0001; -1 = -0x0001 +SELECT BIT_COUNT(CAST(-1 AS TINYINT)), BIT_COUNT(CAST(-1 AS SMALLINT)), BIT_COUNT(CAST(-1 AS INT)), BIT_COUNT(CAST(-1 AS BIGINT)); +# hex: 255 = 0x00ff; 65535 = 0xffff; 4294967295 = 0xffff ffff +SELECT BIT_COUNT(CAST(255 AS TINYINT UNSIGNED)), BIT_COUNT(CAST(65535 AS SMALLINT UNSIGNED)), BIT_COUNT(CAST(4294967295 AS INT UNSIGNED)); +# hex: 4294967296 = 0x0001 0000 0000; 9223372036854775808 = 0x8000 0000 0000 0000 +SELECT BIT_COUNT(CAST('4294967296' AS BIGINT UNSIGNED)), BIT_COUNT(CAST('9223372036854775808' AS BIGINT UNSIGNED)); +# hex: 18446744073709551614 = 0xffff ffff ffff fffe; 18446744073709551615 = 0xffff ffff ffff ffff +SELECT BIT_COUNT(CAST('18446744073709551614' AS BIGINT UNSIGNED)), BIT_COUNT(CAST('18446744073709551615' AS BIGINT UNSIGNED)); +# hex: FLOAT 64.9 -> 65 / 0x0041; DOUBLE 64.9 -> 65 / 0x0041 +SELECT BIT_COUNT(CAST(64.9 AS FLOAT)), BIT_COUNT(CAST(64.9 AS DOUBLE)); +# hex: DECIMAL 64.9 -> 65 / 0x0041; DECIMAL 255.9 -> 256 / 0x0100 +SELECT BIT_COUNT(CAST(64.9 AS DECIMAL(10, 1))), BIT_COUNT(CAST(255.9 AS DECIMAL(10, 1))); +# hex: FLOAT 1.4 -> 1 / 0x0001; FLOAT 1.5 -> 2 / 0x0002; FLOAT 2.5 -> 2 / 0x0002; FLOAT 3.5 -> 4 / 0x0004 +SELECT BIT_COUNT(CAST(1.4 AS FLOAT)), BIT_COUNT(CAST(1.5 AS FLOAT)), BIT_COUNT(CAST(2.5 AS FLOAT)), BIT_COUNT(CAST(3.5 AS FLOAT)); +# hex: FLOAT 4.5 -> 4 / 0x0004; FLOAT 5.5 -> 6 / 0x0006; FLOAT 6.5 -> 6 / 0x0006; FLOAT 7.5 -> 8 / 0x0008 +SELECT BIT_COUNT(CAST(4.5 AS FLOAT)), BIT_COUNT(CAST(5.5 AS FLOAT)), BIT_COUNT(CAST(6.5 AS FLOAT)), BIT_COUNT(CAST(7.5 AS FLOAT)); +# hex: DOUBLE -1.4 -> -1 / 0xffff ffff ffff ffff; DOUBLE -1.5 -> -2 / 0xffff ffff ffff fffe; DOUBLE -2.5 -> -2 / 0xffff ffff ffff fffe; DOUBLE -3.5 -> -4 / 0xffff ffff ffff fffc +SELECT BIT_COUNT(CAST(-1.4 AS DOUBLE)), BIT_COUNT(CAST(-1.5 AS DOUBLE)), BIT_COUNT(CAST(-2.5 AS DOUBLE)), BIT_COUNT(CAST(-3.5 AS DOUBLE)); +# hex: DOUBLE -4.5 -> -4 / 0xffff ffff ffff fffc; DOUBLE -5.5 -> -6 / 0xffff ffff ffff fffa; DOUBLE -6.5 -> -6 / 0xffff ffff ffff fffa; DOUBLE -7.5 -> -8 / 0xffff ffff ffff fff8 +SELECT BIT_COUNT(CAST(-4.5 AS DOUBLE)), BIT_COUNT(CAST(-5.5 AS DOUBLE)), BIT_COUNT(CAST(-6.5 AS DOUBLE)), BIT_COUNT(CAST(-7.5 AS DOUBLE)); +# hex: DOUBLE 9223372036854774784 -> 9223372036854774784 / 0x7fff ffff ffff fc00; DOUBLE 9223372036854775807 -> 9223372036854775808 / 0x8000 0000 0000 0000 +SELECT BIT_COUNT(CAST('9223372036854774784' AS DOUBLE)), BIT_COUNT(CAST('9223372036854775807' AS DOUBLE)); +# hex: DOUBLE 9223372036854775808 -> 9223372036854775808 / 0x8000 0000 0000 0000; DOUBLE -9223372036854775809 -> -9223372036854775808 / 0x8000 0000 0000 0000 +SELECT BIT_COUNT(CAST('9223372036854775808' AS DOUBLE)), BIT_COUNT(CAST('-9223372036854775809' AS DOUBLE)); +# hex: DOUBLE 18446744073709551615 -> 18446744073709551615 / 0xffff ffff ffff ffff; DOUBLE 18446744073709551616 -> 18446744073709551615 / 0xffff ffff ffff ffff +SELECT BIT_COUNT(CAST('18446744073709551615' AS DOUBLE)), BIT_COUNT(CAST('18446744073709551616' AS DOUBLE)); +# hex: DOUBLE -9223372036854774784 -> -9223372036854774784 / 0x8000 0000 0000 0400; DOUBLE -9223372036854775808 -> -9223372036854775808 / 0x8000 0000 0000 0000 +SELECT BIT_COUNT(CAST('-9223372036854774784' AS DOUBLE)), BIT_COUNT(CAST('-9223372036854775808' AS DOUBLE)); +# hex: DECIMAL 1.4 -> 1 / 0x0001; DECIMAL 1.5 -> 2 / 0x0002; DECIMAL 2.5 -> 3 / 0x0003; DECIMAL -1.4 -> -1 / 0xffff ffff ffff ffff; DECIMAL -1.5 -> -2 / 0xffff ffff ffff fffe; DECIMAL -2.5 -> -3 / 0xffff ffff ffff fffd +SELECT BIT_COUNT(CAST(1.4 AS DECIMAL(10, 1))), BIT_COUNT(CAST(1.5 AS DECIMAL(10, 1))), BIT_COUNT(CAST(2.5 AS DECIMAL(10, 1))), BIT_COUNT(CAST(-1.4 AS DECIMAL(10, 1))), BIT_COUNT(CAST(-1.5 AS DECIMAL(10, 1))), BIT_COUNT(CAST(-2.5 AS DECIMAL(10, 1))); +# hex: DECIMAL 2.4 -> 2 / 0x0002; DECIMAL 2.5 -> 3 / 0x0003; DECIMAL 2.6 -> 3 / 0x0003; DECIMAL -2.4 -> -2 / 0xffff ffff ffff fffe; DECIMAL -2.5 -> -3 / 0xffff ffff ffff fffd; DECIMAL -2.6 -> -3 / 0xffff ffff ffff fffd +SELECT BIT_COUNT(CAST(2.4 AS DECIMAL(10, 1))), BIT_COUNT(CAST(2.5 AS DECIMAL(10, 1))), BIT_COUNT(CAST(2.6 AS DECIMAL(10, 1))), BIT_COUNT(CAST(-2.4 AS DECIMAL(10, 1))), BIT_COUNT(CAST(-2.5 AS DECIMAL(10, 1))), BIT_COUNT(CAST(-2.6 AS DECIMAL(10, 1))); +# hex: DECIMAL 9223372036854775807 -> 9223372036854775807 / 0x7fff ffff ffff ffff; DECIMAL 9223372036854775808 -> 9223372036854775808 / 0x8000 0000 0000 0000 +SELECT BIT_COUNT(CAST('9223372036854775807' AS DECIMAL(38, 0))), BIT_COUNT(CAST('9223372036854775808' AS DECIMAL(38, 0))); +# hex: DECIMAL 9223372036854775807.4 -> 9223372036854775807 / 0x7fff ffff ffff ffff; DECIMAL 9223372036854775807.5 -> 9223372036854775808 / 0x8000 0000 0000 0000 +SELECT BIT_COUNT(CAST('9223372036854775807.4' AS DECIMAL(38, 1))), BIT_COUNT(CAST('9223372036854775807.5' AS DECIMAL(38, 1))); +# hex: DECIMAL -9223372036854775807.4 -> -9223372036854775807 / 0xffff ffff ffff ffff 8000 0000 0000 0001; DECIMAL -9223372036854775807.5 -> -9223372036854775808 / 0xffff ffff ffff ffff 8000 0000 0000 0000 +SELECT BIT_COUNT(CAST('-9223372036854775807.4' AS DECIMAL(38, 1))), BIT_COUNT(CAST('-9223372036854775807.5' AS DECIMAL(38, 1))); +# hex: DECIMAL 18446744073709551615 -> 18446744073709551615 / 0xffff ffff ffff ffff; DECIMAL 18446744073709551616 -> 18446744073709551616 / 0x0001 0000 0000 0000 0000; DECIMAL -9223372036854775808 -> -9223372036854775808 / 0xffff ffff ffff ffff 8000 0000 0000 0000; DECIMAL -18446744073709551616 -> -18446744073709551616 / 0xffff ffff ffff ffff 0000 0000 0000 0000 +SELECT BIT_COUNT(CAST('18446744073709551615' AS DECIMAL(38, 0))); +SELECT BIT_COUNT(CAST('18446744073709551616' AS DECIMAL(38, 0))); +SELECT BIT_COUNT(CAST('-9223372036854775808' AS DECIMAL(38, 0))); +SELECT BIT_COUNT(CAST('-18446744073709551616' AS DECIMAL(38, 0))); +# hex: DECIMAL 99999999999999999999999999999999999999 -> 99999999999999999999999999999999999999 / 0x4b3b 4ca8 5a86 c47a 098a 223f ffff ffff; DECIMAL -99999999999999999999999999999999999999 -> -99999999999999999999999999999999999999 / 0xb4c4 b357 a579 3b85 f675 ddc0 0000 0001 +SELECT BIT_COUNT(CAST('99999999999999999999999999999999999999' AS DECIMAL(38, 0))); +SELECT BIT_COUNT(CAST('-99999999999999999999999999999999999999' AS DECIMAL(38, 0))); +# hex: DECIMAL 9999999999999999999999999999999999999.5 -> 10000000000000000000000000000000000000 / 0x0785 ee10 d5da 46d9 00f4 36a0 0000 0000; DECIMAL -9999999999999999999999999999999999999.5 -> -10000000000000000000000000000000000000 / 0xf87a 11ef 2a25 b926 ff0b c960 0000 0000 +SELECT BIT_COUNT(CAST('9999999999999999999999999999999999999.5' AS DECIMAL(38, 1))); +SELECT BIT_COUNT(CAST('-9999999999999999999999999999999999999.5' AS DECIMAL(38, 1))); +# hex: DECIMAL 99999999999999999999999999999999999999999999999999999999999999999 -> 99999999999999999999999999999999999999999999999999999999999999999 / 0x00f3 1627 1c7f c390 8a8b ef46 4e39 45ef 7a25 3609 ffff ffff ffff ffff; DECIMAL -99999999999999999999999999999999999999999999999999999999999999999 -> -99999999999999999999999999999999999999999999999999999999999999999 / 0xffff ffff ff0c e9d8 e380 3c6f 7574 10b9 b1c6 ba10 85da c9f6 0000 0000 0000 0001 +SELECT BIT_COUNT(CAST('99999999999999999999999999999999999999999999999999999999999999999' AS DECIMAL(65, 0))); +SELECT BIT_COUNT(CAST('-99999999999999999999999999999999999999999999999999999999999999999' AS DECIMAL(65, 0))); +# hex: DECIMAL 9999999999999999999999999999999999999999999999999999999999999999.5 -> 10000000000000000000000000000000000000000000000000000000000000000 / 0x0018 4f03 e93f f9f4 daa7 97ed 6e38 ed64 bf6a 1f01 0000 0000 0000 0000; DECIMAL -9999999999999999999999999999999999999999999999999999999999999999.5 -> -10000000000000000000000000000000000000000000000000000000000000000 / 0xffff ffff ffe7 b0fc 16c0 060b 2558 6812 91c7 129b 4095 e0ff 0000 0000 0000 0000 +SELECT BIT_COUNT(CAST('9999999999999999999999999999999999999999999999999999999999999999.5' AS DECIMAL(65, 1))); +SELECT BIT_COUNT(CAST('-9999999999999999999999999999999999999999999999999999999999999999.5' AS DECIMAL(65, 1))); + +# Nonbinary string values are converted to BIGINT +# hex: '0' -> 0 / 0x0000; '1' -> 1 / 0x0001; '64' -> 64 / 0x0040; '255' -> 255 / 0x00ff; '-1' -> -1 / 0xffff ffff ffff ffff +SELECT BIT_COUNT('0'), BIT_COUNT('1'), BIT_COUNT('64'), BIT_COUNT('255'), BIT_COUNT('-1'); +# hex: '64' -> 64 / 0x0040; '64' -> 64 / 0x0040; '64' -> 64 / 0x0040 +SELECT BIT_COUNT(CAST('64' AS CHAR)), BIT_COUNT(CAST('64' AS VARCHAR(10))), BIT_COUNT(CAST('64' AS TEXT)); +# hex: '' -> 0 / 0x0000; ' ' -> 0 / 0x0000; '' -> 0 / 0x0000; '' -> 0 / 0x0000; '' -> 0 / 0x0000 +SELECT BIT_COUNT(''), BIT_COUNT(' '), BIT_COUNT(CAST('' AS CHAR)), BIT_COUNT(CAST('' AS VARCHAR(10))), BIT_COUNT(CAST('' AS TEXT)); +# hex: '+1' -> 1 / 0x0001; '9223372036854775808' -> 9223372036854775808 / 0x8000 0000 0000 0000; '18446744073709551615' -> 18446744073709551615 / 0xffff ffff ffff ffff; '18446744073709551616' -> 18446744073709551615 / 0xffff ffff ffff ffff +SELECT BIT_COUNT('+1'), BIT_COUNT('9223372036854775808'), BIT_COUNT('18446744073709551615'), BIT_COUNT('18446744073709551616'); +# hex: '-9223372036854775808' -> -9223372036854775808 / 0x8000 0000 0000 0000; '-18446744073709551616' -> -9223372036854775808 / 0x8000 0000 0000 0000 +SELECT BIT_COUNT('-9223372036854775808'), BIT_COUNT('-18446744073709551616'); +# hex: '18446744073709551615' -> 18446744073709551615 / 0xffff ffff ffff ffff; '-18446744073709551616' -> -9223372036854775808 / 0x8000 0000 0000 0000 +SELECT BIT_COUNT(CAST('18446744073709551615' AS CHAR)), BIT_COUNT(CAST('-18446744073709551616' AS VARCHAR(32))); +# comment +# hex: '18446744073709551615' -> 18446744073709551615 / 0xffff ffff ffff ffff; DECIMAL 18446744073709551615 -> 18446744073709551615 / 0xffff ffff ffff ffff; DOUBLE 18446744073709551615 -> 18446744073709551615 / 0xffff ffff ffff ffff; DOUBLE 9223372036854775808 -> 9223372036854775808 / 0x8000 0000 0000 0000 +select BIT_COUNT('18446744073709551615'), BIT_COUNT(CAST('18446744073709551615' AS DECIMAL(38,0))), BIT_COUNT(CAST('18446744073709551615' AS DOUBLE)), BIT_COUNT(CAST('9223372036854775808' AS DOUBLE)); + +# Binary string values count set bits in bytes +# hex: BINARY '64' = 0x3634; _binary '64' = 0x3634; CAST('64' AS BINARY) = 0x3634; CAST('64' AS VARBINARY) = 0x3634 +SELECT BIT_COUNT(BINARY '64'), BIT_COUNT(_binary '64'), BIT_COUNT(CAST('64' AS BINARY)), BIT_COUNT(CAST('64' AS VARBINARY(2))); +# hex: BINARY '' = 0x; _binary '' = 0x; CAST('' AS BINARY) = 0x; CAST('' AS VARBINARY) = 0x +SELECT BIT_COUNT(BINARY ''), BIT_COUNT(_binary ''), BIT_COUNT(CAST('' AS BINARY)), BIT_COUNT(CAST('' AS VARBINARY(2))); +# hex: X'00' = 0x0000; X'01' = 0x0001; X'40' = 0x0040; X'FF' = 0x00ff; X'FFFF' = 0xffff +SELECT BIT_COUNT(X'00'), BIT_COUNT(X'01'), BIT_COUNT(X'40'), BIT_COUNT(X'FF'), BIT_COUNT(X'FFFF'); +# hex: _binary X'00' = 0x0000; _binary X'01' = 0x0001; _binary X'40' = 0x0040; _binary X'FF' = 0x00ff; _binary X'FFFF' = 0xffff +SELECT BIT_COUNT(_binary X'00'), BIT_COUNT(_binary X'01'), BIT_COUNT(_binary X'40'), BIT_COUNT(_binary X'FF'), BIT_COUNT(_binary X'FFFF'); +# hex: _binary 0x40 = 0x0040 +SELECT HEX(_binary 0x40), BIT_COUNT(_binary 0x40); +# hex: _binary 0x00 = 0x0000; _binary 0x01 = 0x0001; _binary 0xff = 0x00ff; _binary 0xFFFF = 0xffff +SELECT HEX(_binary 0x00), BIT_COUNT(_binary 0x00), HEX(_binary 0x01), BIT_COUNT(_binary 0x01), HEX(_binary 0xff), BIT_COUNT(_binary 0xff), HEX(_binary 0xFFFF), BIT_COUNT(_binary 0xFFFF); +# hex: _binary 0x0102030405060708 = 0x0102 0304 0506 0708; _binary 0xFFFFFFFFFFFFFFFF = 0xffff ffff ffff ffff +SELECT HEX(_binary 0x0102030405060708), BIT_COUNT(_binary 0x0102030405060708), HEX(_binary 0xFFFFFFFFFFFFFFFF), BIT_COUNT(_binary 0xFFFFFFFFFFFFFFFF); +# hex: X'0102030405060708' = 0x0102 0304 0506 0708; X'FFFFFFFFFFFFFFFF' = 0xffff ffff ffff ffff; X'FFFFFFFFFFFFFFFFFF' = 0xffff ffff ffff ffff ff +SELECT BIT_COUNT(X'0102030405060708'), BIT_COUNT(X'FFFFFFFFFFFFFFFF'), BIT_COUNT(X'FFFFFFFFFFFFFFFFFF'); +# hex: UNHEX('40') = 0x0040; UNHEX('FF') = 0x00ff; UNHEX('FFFF') = 0xffff +SELECT BIT_COUNT(UNHEX('40')), BIT_COUNT(UNHEX('FF')), BIT_COUNT(UNHEX('FFFF')); + +# Table usage +DROP TABLE IF EXISTS t_bit_count; +CREATE TABLE t_bit_count( + id INT, + i BIGINT, + u BIGINT UNSIGNED, + s VARCHAR(10), + b VARBINARY(4) +); +INSERT INTO t_bit_count VALUES + (1, 64, 64, '64', X'40'), + (2, -1, 255, '-1', X'FF'), + (3, NULL, NULL, NULL, NULL), + (4, 64, 64, '64', _binary 0x40); +# hex: row1 i/u/s/b = 0x0040/0x0040/64 / 0x0040/0x0040; row2 i/u/s/b = -0x0001/0x00ff/-1 / 0xffff ffff ffff ffff/0x00ff; row3 = NULL; row4 b = _binary 0x40 / 0x0040 +SELECT id, BIT_COUNT(i), BIT_COUNT(u), BIT_COUNT(s), BIT_COUNT(b) FROM t_bit_count ORDER BY id; +# hex: b values = row1 0x0040; row2 0x00ff; row3 NULL; row4 0x0040 +SELECT id FROM t_bit_count WHERE BIT_COUNT(b) = 1 ORDER BY id; +DROP TABLE t_bit_count; diff --git a/test/distributed/cases/function/func_hex_unhex.result b/test/distributed/cases/function/func_hex_unhex.result index 1c9810d7a5538..26444bba02a74 100644 --- a/test/distributed/cases/function/func_hex_unhex.result +++ b/test/distributed/cases/function/func_hex_unhex.result @@ -1,417 +1,418 @@ select hex(123); -hex(123) +➤ hex(123)[12,-1,0] 𝄀 7B select hex(32432); -hex(32432) +➤ hex(32432)[12,-1,0] 𝄀 7EB0 select hex(2178342143); -hex(2178342143) +➤ hex(2178342143)[12,-1,0] 𝄀 81D6DCFF select hex(2147483649); -hex(2147483649) +➤ hex(2147483649)[12,-1,0] 𝄀 80000001 select hex(456.789); -hex(456.789) +➤ hex(456.789)[12,-1,0] 𝄀 1C9 select hex(321354.21321); -hex(321354.21321) +➤ hex(321354.21321)[12,-1,0] 𝄀 4E74A select hex(1092); -hex(1092) +➤ hex(1092)[12,-1,0] 𝄀 444 select hex(3215133.214321432); -hex(3215133.214321432) +➤ hex(3215133.214321432)[12,-1,0] 𝄀 310F1D select hex('abc'); -hex(abc) +➤ hex(abc)[12,-1,0] 𝄀 616263 select hex('qqqqq'); -hex(qqqqq) +➤ hex(qqqqq)[12,-1,0] 𝄀 7171717171 select hex('abcdefghijklmnopqrstuvwxyz'); -hex(abcdefghijklmnopqrstuvwxyz) +➤ hex(abcdefghijklmnopqrstuvwxyz)[12,-1,0] 𝄀 6162636465666768696A6B6C6D6E6F707172737475767778797A select hex('edwrgewgrewrwe'); -hex(edwrgewgrewrwe) +➤ hex(edwrgewgrewrwe)[12,-1,0] 𝄀 6564777267657767726577727765 select hex('123'); -hex(123) +➤ hex(123)[12,-1,0] 𝄀 313233 select hex('4321413432'); -hex(4321413432) +➤ hex(4321413432)[12,-1,0] 𝄀 34333231343133343332 select hex('325324213'); -hex(325324213) +➤ hex(325324213)[12,-1,0] 𝄀 333235333234323133 select hex('0000000000000'); -hex(0000000000000) +➤ hex(0000000000000)[12,-1,0] 𝄀 30303030303030303030303030 select hex('A'); -hex(A) +➤ hex(A)[12,-1,0] 𝄀 41 select hex('a'); -hex(a) +➤ hex(a)[12,-1,0] 𝄀 61 select hex('V'); -hex(V) +➤ hex(V)[12,-1,0] 𝄀 56 select hex('M'); -hex(M) +➤ hex(M)[12,-1,0] 𝄀 4D select hex('m'); -hex(m) +➤ hex(m)[12,-1,0] 𝄀 6D select hex(''); -hex() +➤ hex()[12,-1,0] 𝄀 select hex('!@#'); -hex(!@#) +➤ hex(!@#)[12,-1,0] 𝄀 214023 select hex('@##%%&^^&#$#%^&^*(()#^&**(*('); -hex(@##%%&^^&#$#%^&^*(()#^&**(*() +➤ hex(@##%%&^^&#$#%^&^*(()#^&**(*()[12,-1,0] 𝄀 4023232525265E5E26232423255E265E2A282829235E262A2A282A28 select hex('}}}{:"{:""'); -hex(}}}{:"{:"") +➤ hex(}}}{:"{:"")[12,-1,0] 𝄀 7D7D7D7B3A227B3A2222 select hex('%'); -hex(%) +➤ hex(%)[12,-1,0] 𝄀 25 select hex(' '); -hex( ) +➤ hex( )[12,-1,0] 𝄀 20 select hex('你好'); -hex(你好) +➤ hex(你好)[12,-1,0] 𝄀 E4BDA0E5A5BD select hex('数据库'); -hex(数据库) +➤ hex(数据库)[12,-1,0] 𝄀 E695B0E68DAEE5BA93 select hex('数据库云平台'); -hex(数据库云平台) +➤ hex(数据库云平台)[12,-1,0] 𝄀 E695B0E68DAEE5BA93E4BA91E5B9B3E58FB0 select hex('欢迎来到 MatrixOne!'); -hex(欢迎来到 MatrixOne!) +➤ hex(欢迎来到 MatrixOne!)[12,-1,0] 𝄀 E6ACA2E8BF8EE69DA5E588B0204D61747269784F6E65EFBC81 select hex('😀'); -hex(😀) +➤ hex(😀)[12,-1,0] 𝄀 F09F9880 select hex(CAST(NULL AS UNSIGNED)); -hex(cast(null as unsigned)) +➤ hex(cast(null as unsigned))[12,-1,0] 𝄀 null select hex(-1); -hex(-1) +➤ hex(-1)[12,-1,0] 𝄀 FFFFFFFFFFFFFFFF select hex(-3489234); -hex(-3489234) +➤ hex(-3489234)[12,-1,0] 𝄀 FFFFFFFFFFCAC22E select hex(-2147483648); -hex(-2147483648) +➤ hex(-2147483648)[12,-1,0] 𝄀 FFFFFFFF80000000 select hex(-3243123138294343); -hex(-3243123138294343) +➤ hex(-3243123138294343)[12,-1,0] 𝄀 FFF47A658D610DB9 select hex(0); -hex(0) +➤ hex(0)[12,-1,0] 𝄀 0 select hex(2147483647); -hex(2147483647) +➤ hex(2147483647)[12,-1,0] 𝄀 7FFFFFFF select hex(3278990242); -hex(3278990242) +➤ hex(3278990242)[12,-1,0] 𝄀 C3716BA2 select hex(9223372036854775807); -hex(9223372036854775807) +➤ hex(9223372036854775807)[12,-1,0] 𝄀 7FFFFFFFFFFFFFFF select hex(3280483902382984924); -hex(3280483902382984924) +➤ hex(3280483902382984924)[12,-1,0] 𝄀 2D869EBA7CECCEDC select hex('a1b2c3d4'); -hex(a1b2c3d4) +➤ hex(a1b2c3d4)[12,-1,0] 𝄀 6131623263336434 select hex('12345678'); -hex(12345678) +➤ hex(12345678)[12,-1,0] 𝄀 3132333435363738 select hex('AABBCCDD'); -hex(AABBCCDD) +➤ hex(AABBCCDD)[12,-1,0] 𝄀 4141424243434444 select hex('ZZZ999'); -hex(ZZZ999) +➤ hex(ZZZ999)[12,-1,0] 𝄀 5A5A5A393939 select hex('0123456789abcdef'); -hex(0123456789abcdef) +➤ hex(0123456789abcdef)[12,-1,0] 𝄀 30313233343536373839616263646566 select hex('!"#$%&/()=?`~''_+-*^'); -hex(!"#$%&/()=?`~'_+-*^) +➤ hex(!"#$%&/()=?`~'_+-*^)[12,-1,0] 𝄀 2122232425262F28293D3F607E275F2B2D2A5E select hex(' 2543g4365435 423532543254&&*32grde5y43'); -hex( 2543g4365435 423532543254&&*32grde5y43) +➤ hex( 2543g4365435 423532543254&&*32grde5y43)[12,-1,0] 𝄀 203235343367343336353433352020202034323335333235343332353426262A33326772646535793433 select hex(''); -hex() +➤ hex()[12,-1,0] 𝄀 select unhex('7B'); -unhex(7B) +➤ unhex(7B)[12,0,0] 𝄀 { select unhex('7D'); -unhex(7D) +➤ unhex(7D)[12,0,0] 𝄀 } select unhex('30'); -unhex(30) +➤ unhex(30)[12,0,0] 𝄀 0 select unhex('31'); -unhex(31) +➤ unhex(31)[12,0,0] 𝄀 1 select unhex('32'); -unhex(32) +➤ unhex(32)[12,0,0] 𝄀 2 select unhex('33'); -unhex(33) +➤ unhex(33)[12,0,0] 𝄀 3 select unhex('34'); -unhex(34) +➤ unhex(34)[12,0,0] 𝄀 4 select unhex('35'); -unhex(35) +➤ unhex(35)[12,0,0] 𝄀 5 select unhex('36'); -unhex(36) +➤ unhex(36)[12,0,0] 𝄀 6 select unhex('37'); -unhex(37) +➤ unhex(37)[12,0,0] 𝄀 7 select unhex('38'); -unhex(38) +➤ unhex(38)[12,0,0] 𝄀 8 select unhex('39'); -unhex(39) +➤ unhex(39)[12,0,0] 𝄀 9 select unhex('41'); -unhex(41) +➤ unhex(41)[12,0,0] 𝄀 A select unhex('42'); -unhex(42) +➤ unhex(42)[12,0,0] 𝄀 B select unhex('43'); -unhex(43) +➤ unhex(43)[12,0,0] 𝄀 C select unhex('44'); -unhex(44) +➤ unhex(44)[12,0,0] 𝄀 D select unhex('45'); -unhex(45) +➤ unhex(45)[12,0,0] 𝄀 E select unhex('46'); -unhex(46) +➤ unhex(46)[12,0,0] 𝄀 F select unhex('61'); -unhex(61) +➤ unhex(61)[12,0,0] 𝄀 a select unhex('62'); -unhex(62) +➤ unhex(62)[12,0,0] 𝄀 b select unhex('63'); -unhex(63) +➤ unhex(63)[12,0,0] 𝄀 c select unhex('64'); -unhex(64) +➤ unhex(64)[12,0,0] 𝄀 d select unhex('65'); -unhex(65) +➤ unhex(65)[12,0,0] 𝄀 e select unhex('66'); -unhex(66) +➤ unhex(66)[12,0,0] 𝄀 f select unhex('2E'); -unhex(2E) +➤ unhex(2E)[12,0,0] 𝄀 . select unhex('2C'); -unhex(2C) +➤ unhex(2C)[12,0,0] 𝄀 , select unhex('21'); -unhex(21) +➤ unhex(21)[12,0,0] 𝄀 ! select unhex('22'); -unhex(22) +➤ unhex(22)[12,0,0] 𝄀 " select unhex('25'); -unhex(25) +➤ unhex(25)[12,0,0] 𝄀 % select unhex('26'); -unhex(26) +➤ unhex(26)[12,0,0] 𝄀 & select unhex('2F'); -unhex(2F) +➤ unhex(2F)[12,0,0] 𝄀 / select unhex('3D'); -unhex(3D) +➤ unhex(3D)[12,0,0] 𝄀 = select unhex('40'); -unhex(40) +➤ unhex(40)[12,0,0] 𝄀 @ select unhex('5F'); -unhex(5F) +➤ unhex(5F)[12,0,0] 𝄀 _ select unhex('23'); -unhex(23) +➤ unhex(23)[12,0,0] 𝄀 # select unhex('24'); -unhex(24) +➤ unhex(24)[12,0,0] 𝄀 $ select unhex('2A'); -unhex(2A) +➤ unhex(2A)[12,0,0] 𝄀 * select unhex('28'); -unhex(28) +➤ unhex(28)[12,0,0] 𝄀 ( select unhex('29'); -unhex(29) +➤ unhex(29)[12,0,0] 𝄀 ) select unhex('3A'); -unhex(3A) +➤ unhex(3A)[12,0,0] 𝄀 : select unhex('3B'); -unhex(3B) +➤ unhex(3B)[12,0,0] 𝄀 ; select unhex('3F'); -unhex(3F) +➤ unhex(3F)[12,0,0] 𝄀 ? select unhex('5E'); -unhex(5E) +➤ unhex(5E)[12,0,0] 𝄀 ^ select unhex('60'); -unhex(60) +➤ unhex(60)[12,0,0] 𝄀 ` select unhex('7C'); -unhex(7C) +➤ unhex(7C)[12,0,0] 𝄀 | select unhex('2D'); -unhex(2D) +➤ unhex(2D)[12,0,0] 𝄀 - select unhex('5F'); -unhex(5F) +➤ unhex(5F)[12,0,0] 𝄀 _ select unhex('7E'); -unhex(7E) +➤ unhex(7E)[12,0,0] 𝄀 ~ select unhex('5C'); -unhex(5C) +➤ unhex(5C)[12,0,0] 𝄀 \ select unhex('0A'); -unhex(0A) -\n +➤ unhex(0A)[12,0,0] 𝄀 + + select unhex('7F'); -unhex(7F) +➤ unhex(7F)[12,0,0] 𝄀  select unhex('C3A9'); -unhex(C3A9) -é +➤ unhex(C3A9)[12,0,0] 𝄀 +é select unhex('C383'); -unhex(C383) -à +➤ unhex(C383)[12,0,0] 𝄀 +Ã select unhex('E28C85'); -unhex(E28C85) -⌅ +➤ unhex(E28C85)[12,0,0] 𝄀 +⌅ select unhex('F09F98A2'); -unhex(F09F98A2) -😢 +➤ unhex(F09F98A2)[12,0,0] 𝄀 +😢 select unhex('2032353433673433363534333534323335333235343332353426262a33326772646535793433'); -unhex(2032353433673433363534333534323335333235343332353426262a33326772646535793433) +➤ unhex(2032353433673433363534333534323335333235343332353426262a33326772646535793433)[12,0,0] 𝄀 2543g4365435423532543254&&*32grde5y43 select unhex(''); -unhex() +➤ unhex()[12,0,0] 𝄀 select unhex('2122232425262f28293d3f607e275f2b2d2a5e'); -unhex(2122232425262f28293d3f607e275f2b2d2a5e) +➤ unhex(2122232425262f28293d3f607e275f2b2d2a5e)[12,0,0] 𝄀 !"#$%&/()=?`~'_+-*^ select unhex('30313233343536373839616263646566'); -unhex(30313233343536373839616263646566) +➤ unhex(30313233343536373839616263646566)[12,0,0] 𝄀 0123456789abcdef select unhex('4141424243434444'); -unhex(4141424243434444) +➤ unhex(4141424243434444)[12,0,0] 𝄀 AABBCCDD select unhex('3132333435363738'); -unhex(3132333435363738) +➤ unhex(3132333435363738)[12,0,0] 𝄀 12345678 select unhex('5a5a5a393939'); -unhex(5a5a5a393939) +➤ unhex(5a5a5a393939)[12,0,0] 𝄀 ZZZ999 select unhex('6131623263336434'); -unhex(6131623263336434) +➤ unhex(6131623263336434)[12,0,0] 𝄀 a1b2c3d4 select unhex('33323830343833393032333832393834393031323833343234'); -unhex(33323830343833393032333832393834393031323833343234) +➤ unhex(33323830343833393032333832393834393031323833343234)[12,0,0] 𝄀 3280483902382984901283424 select unhex('41'); -unhex(41) +➤ unhex(41)[12,0,0] 𝄀 A select unhex('61'); -unhex(61) +➤ unhex(61)[12,0,0] 𝄀 a select unhex('56'); -unhex(56) +➤ unhex(56)[12,0,0] 𝄀 V select unhex('4d'); -unhex(4d) +➤ unhex(4d)[12,0,0] 𝄀 M select unhex('6d'); -unhex(6d) +➤ unhex(6d)[12,0,0] 𝄀 m select unhex('313233'); -unhex(313233) +➤ unhex(313233)[12,0,0] 𝄀 123 select unhex('34333231343133343332'); -unhex(34333231343133343332) +➤ unhex(34333231343133343332)[12,0,0] 𝄀 4321413432 select unhex('333235333234323133'); -unhex(333235333234323133) +➤ unhex(333235333234323133)[12,0,0] 𝄀 325324213 select unhex('30303030303030303030303030'); -unhex(30303030303030303030303030) +➤ unhex(30303030303030303030303030)[12,0,0] 𝄀 0000000000000 select unhex('333231353133332e323134333231343332'); -unhex(333231353133332e323134333231343332) +➤ unhex(333231353133332e323134333231343332)[12,0,0] 𝄀 3215133.214321432 select unhex('3332313335342e3231333231'); -unhex(3332313335342e3231333231) +➤ unhex(3332313335342e3231333231)[12,0,0] 𝄀 321354.21321 select unhex('3435362e373839'); -unhex(3435362e373839) +➤ unhex(3435362e373839)[12,0,0] 𝄀 456.789 select unhex('616263'); -unhex(616263) +➤ unhex(616263)[12,0,0] 𝄀 abc select unhex('7171717171'); -unhex(7171717171) +➤ unhex(7171717171)[12,0,0] 𝄀 qqqqq select unhex('6162636465666768696a6b6c6d6e6f707172737475767778797a'); -unhex(6162636465666768696a6b6c6d6e6f707172737475767778797a) +➤ unhex(6162636465666768696a6b6c6d6e6f707172737475767778797a)[12,0,0] 𝄀 abcdefghijklmnopqrstuvwxyz select unhex('6564777267657767726577727765'); -unhex(6564777267657767726577727765) +➤ unhex(6564777267657767726577727765)[12,0,0] 𝄀 edwrgewgrewrwe select unhex('e4bda0e5a5bd'); -unhex(e4bda0e5a5bd) -你好 +➤ unhex(e4bda0e5a5bd)[12,0,0] 𝄀 +你好 select unhex('e695b0e68daee5ba93'); -unhex(e695b0e68daee5ba93) -数据库 +➤ unhex(e695b0e68daee5ba93)[12,0,0] 𝄀 +数据库 select unhex('e695b0e68daee5ba93e4ba91e5b9b3e58fb0'); -unhex(e695b0e68daee5ba93e4ba91e5b9b3e58fb0) -数据库云平台 +➤ unhex(e695b0e68daee5ba93e4ba91e5b9b3e58fb0)[12,0,0] 𝄀 +数据库云平台 select unhex('e6aca2e8bf8ee69da5e588b0204d61747269784f6e65efbc81'); -unhex(e6aca2e8bf8ee69da5e588b0204d61747269784f6e65efbc81) -欢迎来到 MatrixOne! +➤ unhex(e6aca2e8bf8ee69da5e588b0204d61747269784f6e65efbc81)[12,0,0] 𝄀 +欢迎来到 MatrixOne! select unhex('48656c6c6f20576f726c6421'); -unhex(48656c6c6f20576f726c6421) +➤ unhex(48656c6c6f20576f726c6421)[12,0,0] 𝄀 Hello World! select unhex('214023'); -unhex(214023) +➤ unhex(214023)[12,0,0] 𝄀 !@# select unhex('4023232525265e5e26232423255e265e2a282829235e262a2a282a28'); -unhex(4023232525265e5e26232423255e265e2a282829235e262a2a282a28) +➤ unhex(4023232525265e5e26232423255e265e2a282829235e262a2a282a28)[12,0,0] 𝄀 @##%%&^^&#$#%^&^*(()#^&**(*( select unhex('7d7d7d7b3a227b3a2222'); -unhex(7d7d7d7b3a227b3a2222) +➤ unhex(7d7d7d7b3a227b3a2222)[12,0,0] 𝄀 }}}{:"{:"" select unhex('25'); -unhex(25) +➤ unhex(25)[12,0,0] 𝄀 %