diff --git a/config/config.go b/config/config.go index f43aae33e3479..2c62f8a4b80b2 100644 --- a/config/config.go +++ b/config/config.go @@ -116,6 +116,9 @@ type Config struct { // TODO: We actually only support mode 2, which keeps the original case, but the comparison is case-insensitive. LowerCaseTableNames int `toml:"lower-case-table-names" json:"lower-case-table-names"` ServerVersion string `toml:"server-version" json:"server-version"` + VersionComment string `toml:"version-comment" json:"version-comment"` + TiDBEdition string `toml:"tidb-edition" json:"tidb-edition"` + TiDBReleaseVersion string `toml:"tidb-release-version" json:"tidb-release-version"` Log Log `toml:"log" json:"log"` Security Security `toml:"security" json:"security"` Status Status `toml:"status" json:"status"` @@ -645,6 +648,9 @@ var defaultConf = Config{ LowerCaseTableNames: 2, GracefulWaitBeforeShutdown: 0, ServerVersion: "", + TiDBEdition: "", + VersionComment: "", + TiDBReleaseVersion: "", Log: Log{ Level: "info", Format: "text", diff --git a/executor/builder.go b/executor/builder.go index f4b43432ea254..dfbae08d5f4d8 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -3101,7 +3101,10 @@ func buildNoRangeTableReader(b *executorBuilder, v *plannercore.PhysicalTableRea if err != nil { return nil, err } - ts := v.GetTableScan() + ts, err := v.GetTableScan() + if err != nil { + return nil, err + } if err = b.validCanReadTemporaryOrCacheTable(ts.Table); err != nil { return nil, err } @@ -3205,7 +3208,11 @@ func (b *executorBuilder) buildTableReader(v *plannercore.PhysicalTableReader) E return nil } - ts := v.GetTableScan() + ts, err := v.GetTableScan() + if err != nil { + b.err = err + return nil + } if err = b.validCanReadTemporaryOrCacheTable(ts.Table); err != nil { b.err = err return nil diff --git a/executor/show_test.go b/executor/show_test.go index 9a81a6dd6cc9a..31dacb0e9ce86 100644 --- a/executor/show_test.go +++ b/executor/show_test.go @@ -1591,6 +1591,17 @@ func TestShowVar(t *testing.T) { // Test Hidden tx_read_ts res = tk.MustQuery("show variables like '%tx_read_ts'") require.Len(t, res.Rows(), 0) + + // Test versions' related variables + res = tk.MustQuery("show variables like 'version%'") + for _, row := range res.Rows() { + line := fmt.Sprint(row) + if strings.HasPrefix(line, "version ") { + require.Equal(t, mysql.ServerVersion, line[len("version "):]) + } else if strings.HasPrefix(line, "version_comment ") { + require.Equal(t, variable.GetSysVar(variable.VersionComment), line[len("version_comment "):]) + } + } } func TestIssue19507(t *testing.T) { diff --git a/executor/tiflash_test.go b/executor/tiflash_test.go index ccc11ba0dfe80..9e812e2b39c67 100644 --- a/executor/tiflash_test.go +++ b/executor/tiflash_test.go @@ -142,7 +142,6 @@ func TestReadUnsigedPK(t *testing.T) { tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") tk.MustExec("set @@session.tidb_allow_mpp=ON") - tk.MustExec("set @@session.tidb_opt_broadcast_join=ON") // mock executor does not support use outer table as build side for outer join, so need to // force the inner table as build side tk.MustExec("set tidb_opt_mpp_outer_join_fixed_build_side=1") @@ -345,7 +344,6 @@ func TestTiFlashPartitionTableShuffledHashJoin(t *testing.T) { } tk.MustExec("SET tidb_enforce_mpp=1") - tk.MustExec("SET tidb_opt_broadcast_join=0") tk.MustExec("SET tidb_broadcast_join_threshold_count=0") tk.MustExec("SET tidb_broadcast_join_threshold_size=0") tk.MustExec("set @@session.tidb_isolation_read_engines='tiflash'") @@ -489,7 +487,6 @@ func TestPartitionTable(t *testing.T) { tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") tk.MustExec("set @@session.tidb_allow_mpp=ON") - tk.MustExec("set @@session.tidb_opt_broadcast_join=ON") // test if it is really work. failpoint.Enable("github.com/pingcap/tidb/executor/checkTotalMPPTasks", `return(8)`) tk.MustQuery("select count(*) from t1 , t where t1.a = t.a").Check(testkit.Rows("4")) @@ -1025,7 +1022,6 @@ func TestTiFlashPartitionTableBroadcastJoin(t *testing.T) { } tk.MustExec("set @@session.tidb_isolation_read_engines='tiflash'") tk.MustExec("set @@session.tidb_enforce_mpp=1") - tk.MustExec("set @@session.tidb_opt_broadcast_join=ON") // mock executor does not support use outer table as build side for outer join, so need to // force the inner table as build side tk.MustExec("set tidb_opt_mpp_outer_join_fixed_build_side=1") diff --git a/expression/integration_test.go b/expression/integration_test.go index 0c0a192cd32e4..8c8bb0f2ed577 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -50,6 +50,9 @@ import ( "github.com/pingcap/tidb/util/kvcache" "github.com/pingcap/tidb/util/sem" "github.com/pingcap/tidb/util/sqlexec" + "github.com/pingcap/tidb/util/testutil" + "github.com/pingcap/tidb/util/versioninfo" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -518,16 +521,16 @@ func TestStringBuiltin(t *testing.T) { // for space result = tk.MustQuery(`select space(0), space(2), space(-1), space(1.1), space(1.9)`) - result.Check(testkit.RowsWithSep(",", ", ,, , ")) + result.Check(testutil.RowsWithSep(",", ", ,, , ")) result = tk.MustQuery(`select space("abc"), space("2"), space("1.1"), space(''), space(null)`) - result.Check(testkit.RowsWithSep(",", ", , ,,")) + result.Check(testutil.RowsWithSep(",", ", , ,,")) // for replace tk.MustExec("drop table if exists t") tk.MustExec("create table t(a char(20), b int, c double, d datetime, e time)") tk.MustExec(`insert into t values('www.mysql.com', 1234, 12.34, "2017-01-01 12:01:01", "12:01:01")`) result = tk.MustQuery(`select replace(a, 'mysql', 'pingcap'), replace(b, 2, 55), replace(c, 34, 0), replace(d, '-', '/'), replace(e, '01', '22') from t`) - result.Check(testkit.RowsWithSep(",", "www.pingcap.com,15534,12.0,2017/01/01 12:01:01,12:22:22")) + result.Check(testutil.RowsWithSep(",", "www.pingcap.com,15534,12.0,2017/01/01 12:01:01,12:22:22")) result = tk.MustQuery(`select replace('aaa', 'a', ''), replace(null, 'a', 'b'), replace('a', null, 'b'), replace('a', 'b', null)`) result.Check(testkit.Rows(" ")) @@ -551,7 +554,7 @@ func TestStringBuiltin(t *testing.T) { result = tk.MustQuery(`select substr(a, 3), substr(b, 2, 3), substr(c, -3), substr(d, -8), substr(e, -3, 100) from t`) result.Check(testkit.Rows("kila 234 .45 12:01:01 :01")) result = tk.MustQuery(`select substr('Sakila', 100), substr('Sakila', -100), substr('Sakila', -5, 3), substr('Sakila', 2, -1)`) - result.Check(testkit.RowsWithSep(",", ",,aki,")) + result.Check(testutil.RowsWithSep(",", ",,aki,")) result = tk.MustQuery(`select substr('foobarbar' from 4), substr('Sakila' from -4 for 2)`) result.Check(testkit.Rows("barbar ki")) result = tk.MustQuery(`select substr(null, 2, 3), substr('foo', null, 3), substr('foo', 2, null)`) @@ -582,7 +585,7 @@ func TestStringBuiltin(t *testing.T) { result = tk.MustQuery(`select substring_index('www.pingcap.com', '.', 0), substring_index('www.pingcap.com', '.', 100), substring_index('www.pingcap.com', '.', -100)`) result.Check(testkit.Rows(" www.pingcap.com www.pingcap.com")) result = tk.MustQuery(`select substring_index('www.pingcap.com', 'd', 1), substring_index('www.pingcap.com', '', 1), substring_index('', '.', 1)`) - result.Check(testkit.RowsWithSep(",", "www.pingcap.com,,")) + result.Check(testutil.RowsWithSep(",", "www.pingcap.com,,")) result = tk.MustQuery(`select substring_index(null, '.', 1), substring_index('www.pingcap.com', null, 1), substring_index('www.pingcap.com', '.', null)`) result.Check(testkit.Rows(" ")) @@ -623,13 +626,13 @@ func TestStringBuiltin(t *testing.T) { // for ltrim and rtrim result = tk.MustQuery(`select ltrim(' bar '), ltrim('bar'), ltrim(''), ltrim(null)`) - result.Check(testkit.RowsWithSep(",", "bar ,bar,,")) + result.Check(testutil.RowsWithSep(",", "bar ,bar,,")) result = tk.MustQuery(`select rtrim(' bar '), rtrim('bar'), rtrim(''), rtrim(null)`) - result.Check(testkit.RowsWithSep(",", " bar,bar,,")) + result.Check(testutil.RowsWithSep(",", " bar,bar,,")) result = tk.MustQuery(`select ltrim("\t bar "), ltrim(" \tbar"), ltrim("\n bar"), ltrim("\r bar")`) - result.Check(testkit.RowsWithSep(",", "\t bar ,\tbar,\n bar,\r bar")) + result.Check(testutil.RowsWithSep(",", "\t bar ,\tbar,\n bar,\r bar")) result = tk.MustQuery(`select rtrim(" bar \t"), rtrim("bar\t "), rtrim("bar \n"), rtrim("bar \r")`) - result.Check(testkit.RowsWithSep(",", " bar \t,bar\t,bar \n,bar \r")) + result.Check(testutil.RowsWithSep(",", " bar \t,bar\t,bar \n,bar \r")) // for reverse tk.MustExec(`DROP TABLE IF EXISTS t;`) @@ -644,11 +647,11 @@ func TestStringBuiltin(t *testing.T) { result = tk.MustQuery(`select trim(' bar '), trim(leading 'x' from 'xxxbarxxx'), trim(trailing 'xyz' from 'barxxyz'), trim(both 'x' from 'xxxbarxxx')`) result.Check(testkit.Rows("bar barxxx barx bar")) result = tk.MustQuery(`select trim('\t bar\n '), trim(' \rbar \t')`) - result.Check(testkit.RowsWithSep(",", "\t bar\n,\rbar \t")) + result.Check(testutil.RowsWithSep(",", "\t bar\n,\rbar \t")) result = tk.MustQuery(`select trim(leading from ' bar'), trim('x' from 'xxxbarxxx'), trim('x' from 'bar'), trim('' from ' bar ')`) - result.Check(testkit.RowsWithSep(",", "bar,bar,bar, bar ")) + result.Check(testutil.RowsWithSep(",", "bar,bar,bar, bar ")) result = tk.MustQuery(`select trim(''), trim('x' from '')`) - result.Check(testkit.RowsWithSep(",", ",")) + result.Check(testutil.RowsWithSep(",", ",")) result = tk.MustQuery(`select trim(null from 'bar'), trim('x' from null), trim(null), trim(leading null from 'bar')`) result.Check(testkit.Rows(" ")) @@ -901,7 +904,7 @@ func TestEncryptionBuiltin(t *testing.T) { result.Check(testkit.Rows(`45ABDD5C4802EFA6771A94C43F805208 45ABDD5C4802EFA6771A94C43F805208 791F1AEB6A6B796E6352BF381895CA0E D0147E2EB856186F146D9F6DE33F9546 `)) result = tk.MustQuery("select HEX(AES_ENCRYPT(a, 'key', 'iv')), HEX(AES_ENCRYPT(b, 'key', 'iv')) from t") result.Check(testkit.Rows("B3800B3A3CB4ECE2051A3E80FE373EAC B3800B3A3CB4ECE2051A3E80FE373EAC")) - tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning|1618| option ignored", "Warning|1618| option ignored")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1618| option ignored", "Warning|1618| option ignored")) tk.MustExec("SET block_encryption_mode='aes-128-cbc';") result = tk.MustQuery("select HEX(AES_ENCRYPT(a, 'key', '1234567890123456')), HEX(AES_ENCRYPT(b, 'key', '1234567890123456')), HEX(AES_ENCRYPT(c, 'key', '1234567890123456')), HEX(AES_ENCRYPT(d, 'key', '1234567890123456')), HEX(AES_ENCRYPT(e, 'key', '1234567890123456')), HEX(AES_ENCRYPT(f, 'key', '1234567890123456')), HEX(AES_ENCRYPT(g, 'key', '1234567890123456')), HEX(AES_ENCRYPT(h, 'key', '1234567890123456')), HEX(AES_ENCRYPT(i, 'key', '1234567890123456')) from t") result.Check(testkit.Rows("341672829F84CB6B0BE690FEC4C4DAE9 341672829F84CB6B0BE690FEC4C4DAE9 D43734E147A12BB96C6897C4BBABA283 16F2C972411948DCEF3659B726D2CCB04AD1379A1A367FA64242058A50211B67 41E71D0C58967C1F50EEC074523946D1 1117D292E2D39C3EAA3B435371BE56FC 8ACB7ECC0883B672D7BD1CFAA9FA5FAF5B731ADE978244CD581F114D591C2E7E D2B13C30937E3251AEDA73859BA32E4B 2CF4A6051FF248A67598A17AA2C17267")) @@ -1192,6 +1195,16 @@ func TestInfoBuiltin(t *testing.T) { result = tk.MustQuery("select version()") result.Check(testkit.Rows(mysql.ServerVersion)) + // for tidb_version + result = tk.MustQuery("select tidb_version()") + tidbVersionResult := "" + for _, line := range result.Rows() { + tidbVersionResult += fmt.Sprint(line) + } + lines := strings.Split(tidbVersionResult, "\n") + assert.Equal(t, true, strings.Split(lines[0], " ")[2] == mysql.TiDBReleaseVersion, "errors in 'select tidb_version()'") + assert.Equal(t, true, strings.Split(lines[1], " ")[1] == versioninfo.TiDBEdition, "errors in 'select tidb_version()'") + // for row_count tk.MustExec("drop table if exists t") tk.MustExec("create table t (a int, b int, PRIMARY KEY (a))") @@ -1483,7 +1496,7 @@ func TestArithmeticBuiltin(t *testing.T) { result.Check(testkit.Rows("2 2 1")) result = tk.MustQuery("SELECT 1.175494351E-37 div 1.7976931348623157E+308, 1.7976931348623157E+308 div -1.7976931348623157E+307, 1 div 1e-82;") result.Check(testkit.Rows("0 -1 ")) - tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect DECIMAL value: '1.7976931348623157e+308'", "Warning|1292|Truncated incorrect DECIMAL value: '1.7976931348623157e+308'", "Warning|1292|Truncated incorrect DECIMAL value: '-1.7976931348623158e+307'", @@ -1548,7 +1561,7 @@ func TestArithmeticBuiltin(t *testing.T) { tk.MustExec("insert into t value(1.2)") result = tk.MustQuery("select * from t where a/0 > 1") result.Check(testkit.Rows()) - tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning|1365|Division by 0")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1365|Division by 0")) tk.MustExec("USE test;") tk.MustExec("DROP TABLE IF EXISTS t;") @@ -1759,14 +1772,14 @@ func TestCompareBuiltin(t *testing.T) { tk.MustQuery("show warnings").Check(testkit.Rows()) result = tk.MustQuery(`select greatest(cast("2017-01-01" as datetime), "123", "234", cast("2018-01-01" as date)), greatest(cast("2017-01-01" as date), "123", null)`) result.Check(testkit.Rows("234 ")) - tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning|1292|Incorrect time value: '123'", "Warning|1292|Incorrect time value: '234'", "Warning|1292|Incorrect time value: '123'")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect time value: '123'", "Warning|1292|Incorrect time value: '234'", "Warning|1292|Incorrect time value: '123'")) // for least result = tk.MustQuery(`select least(1, 2, 3), least("a", "b", "c"), least(1.1, 1.2, 1.3), least("123a", 1, 2)`) result.Check(testkit.Rows("1 a 1.1 1")) tk.MustQuery("show warnings").Check(testkit.Rows()) result = tk.MustQuery(`select least(cast("2017-01-01" as datetime), "123", "234", cast("2018-01-01" as date)), least(cast("2017-01-01" as date), "123", null)`) result.Check(testkit.Rows("123 ")) - tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning|1292|Incorrect time value: '123'", "Warning|1292|Incorrect time value: '234'", "Warning|1292|Incorrect time value: '123'")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect time value: '123'", "Warning|1292|Incorrect time value: '234'", "Warning|1292|Incorrect time value: '123'")) tk.MustQuery(`select 1 < 17666000000000000000, 1 > 17666000000000000000, 1 = 17666000000000000000`).Check(testkit.Rows("1 0 0")) tk.MustExec("drop table if exists t") @@ -1948,7 +1961,7 @@ func TestAggregationBuiltinGroupConcat(t *testing.T) { tk.MustExec("set @@group_concat_max_len=7") result = tk.MustQuery("select group_concat(a) from t") result.Check(testkit.Rows("hello,h")) - tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning 1260 Some rows were cut by GROUPCONCAT(test.t.a)")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning 1260 Some rows were cut by GROUPCONCAT(test.t.a)")) _, err := tk.Exec("insert into d select group_concat(a) from t") require.Equal(t, errors.ErrCode(mysql.ErrCutValueGroupConcat), errors.Cause(err).(*terror.Error).Code()) @@ -1956,7 +1969,7 @@ func TestAggregationBuiltinGroupConcat(t *testing.T) { _, err = tk.Exec("set sql_mode=''") require.NoError(t, err) tk.MustExec("insert into d select group_concat(a) from t") - tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", "Warning 1260 Some rows were cut by GROUPCONCAT(test.t.a)")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning 1260 Some rows were cut by GROUPCONCAT(test.t.a)")) tk.MustQuery("select * from d").Check(testkit.Rows("hello,h")) } @@ -2316,7 +2329,7 @@ func TestTimeLiteral(t *testing.T) { _, err = tk.Exec("select ADDDATE('2008-01-34', -1);") require.NoError(t, err) - tk.MustQuery("Show warnings;").Check(testkit.RowsWithSep("|", + tk.MustQuery("Show warnings;").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '2008-01-34'")) } @@ -2606,12 +2619,12 @@ func TestIssues(t *testing.T) { tk.MustExec("insert into t values('1e649'),('-1e649');") r = tk.MustQuery(`SELECT * FROM t where c < 1;`) r.Check(testkit.Rows("-1e649")) - tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect DOUBLE value: '1e649'", "Warning|1292|Truncated incorrect DOUBLE value: '-1e649'")) r = tk.MustQuery(`SELECT * FROM t where c > 1;`) r.Check(testkit.Rows("1e649")) - tk.MustQuery("show warnings").Check(testkit.RowsWithSep("|", + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect DOUBLE value: '1e649'", "Warning|1292|Truncated incorrect DOUBLE value: '-1e649'")) diff --git a/parser/ast/misc.go b/parser/ast/misc.go index 60b27f52a4378..ab42cfbc13192 100644 --- a/parser/ast/misc.go +++ b/parser/ast/misc.go @@ -3430,7 +3430,7 @@ func (n *TableOptimizerHint) Restore(ctx *format.RestoreCtx) error { ctx.WritePlainf("%d", n.HintData.(uint64)) case "nth_plan": ctx.WritePlainf("%d", n.HintData.(int64)) - case "tidb_hj", "tidb_smj", "tidb_inlj", "hash_join", "merge_join", "inl_join", "broadcast_join", "broadcast_join_local", "inl_hash_join", "inl_merge_join": + case "tidb_hj", "tidb_smj", "tidb_inlj", "hash_join", "merge_join", "inl_join", "broadcast_join", "inl_hash_join", "inl_merge_join": for i, table := range n.Tables { if i != 0 { ctx.WritePlain(", ") diff --git a/parser/hintparser.go b/parser/hintparser.go index 2a2dcfac5dc2d..4020f5832970d 100644 --- a/parser/hintparser.go +++ b/parser/hintparser.go @@ -41,19 +41,18 @@ type yyhintXError struct { } const ( - yyhintDefault = 57416 + yyhintDefault = 57415 yyhintEOFCode = 57344 yyhintErrCode = 57345 hintAggToCop = 57377 hintBCJoin = 57390 - hintBCJoinPreferLocal = 57391 hintBKA = 57355 hintBNL = 57357 - hintDupsWeedOut = 57412 - hintFalse = 57408 - hintFirstMatch = 57413 - hintForceIndex = 57402 - hintGB = 57411 + hintDupsWeedOut = 57411 + hintFalse = 57407 + hintFirstMatch = 57412 + hintForceIndex = 57401 + hintGB = 57410 hintHashAgg = 57379 hintHashJoin = 57359 hintIdentifier = 57347 @@ -69,11 +68,11 @@ const ( hintJoinOrder = 57352 hintJoinPrefix = 57353 hintJoinSuffix = 57354 - hintLimitToCop = 57401 - hintLooseScan = 57414 - hintMB = 57410 + hintLimitToCop = 57400 + hintLooseScan = 57413 + hintMB = 57409 hintMRR = 57365 - hintMaterialization = 57415 + hintMaterialization = 57414 hintMaxExecutionTime = 57373 hintMemoryQuota = 57384 hintMerge = 57361 @@ -88,10 +87,10 @@ const ( hintNoSemijoin = 57372 hintNoSkipScan = 57370 hintNoSwapJoinInputs = 57385 - hintNthPlan = 57400 - hintOLAP = 57403 - hintOLTP = 57404 - hintPartition = 57405 + hintNthPlan = 57399 + hintOLAP = 57402 + hintOLTP = 57403 + hintPartition = 57404 hintQBName = 57376 hintQueryType = 57386 hintReadConsistentReplica = 57387 @@ -102,145 +101,143 @@ const ( hintSetVar = 57374 hintSingleAtIdentifier = 57349 hintSkipScan = 57369 - hintStreamAgg = 57392 + hintStreamAgg = 57391 hintStringLit = 57350 - hintSwapJoinInputs = 57393 - hintTiFlash = 57407 - hintTiKV = 57406 - hintTimeRange = 57398 - hintTrue = 57409 - hintUseCascades = 57399 - hintUseIndex = 57395 - hintUseIndexMerge = 57394 - hintUsePlanCache = 57396 - hintUseToja = 57397 + hintSwapJoinInputs = 57392 + hintTiFlash = 57406 + hintTiKV = 57405 + hintTimeRange = 57397 + hintTrue = 57408 + hintUseCascades = 57398 + hintUseIndex = 57394 + hintUseIndexMerge = 57393 + hintUsePlanCache = 57395 + hintUseToja = 57396 yyhintMaxDepth = 200 - yyhintTabOfs = -172 + yyhintTabOfs = -170 ) var ( yyhintXLAT = map[int]int{ - 41: 0, // ')' (130x) - 57377: 1, // hintAggToCop (122x) - 57390: 2, // hintBCJoin (122x) - 57391: 3, // hintBCJoinPreferLocal (122x) - 57355: 4, // hintBKA (122x) - 57357: 5, // hintBNL (122x) - 57402: 6, // hintForceIndex (122x) - 57379: 7, // hintHashAgg (122x) - 57359: 8, // hintHashJoin (122x) - 57380: 9, // hintIgnoreIndex (122x) - 57378: 10, // hintIgnorePlanCache (122x) - 57363: 11, // hintIndexMerge (122x) - 57381: 12, // hintInlHashJoin (122x) - 57382: 13, // hintInlJoin (122x) - 57383: 14, // hintInlMergeJoin (122x) - 57351: 15, // hintJoinFixedOrder (122x) - 57352: 16, // hintJoinOrder (122x) - 57353: 17, // hintJoinPrefix (122x) - 57354: 18, // hintJoinSuffix (122x) - 57401: 19, // hintLimitToCop (122x) - 57373: 20, // hintMaxExecutionTime (122x) - 57384: 21, // hintMemoryQuota (122x) - 57361: 22, // hintMerge (122x) - 57365: 23, // hintMRR (122x) - 57356: 24, // hintNoBKA (122x) - 57358: 25, // hintNoBNL (122x) - 57360: 26, // hintNoHashJoin (122x) - 57367: 27, // hintNoICP (122x) - 57364: 28, // hintNoIndexMerge (122x) - 57362: 29, // hintNoMerge (122x) - 57366: 30, // hintNoMRR (122x) - 57368: 31, // hintNoRangeOptimization (122x) - 57372: 32, // hintNoSemijoin (122x) - 57370: 33, // hintNoSkipScan (122x) - 57385: 34, // hintNoSwapJoinInputs (122x) - 57400: 35, // hintNthPlan (122x) - 57376: 36, // hintQBName (122x) - 57386: 37, // hintQueryType (122x) - 57387: 38, // hintReadConsistentReplica (122x) - 57388: 39, // hintReadFromStorage (122x) - 57375: 40, // hintResourceGroup (122x) - 57371: 41, // hintSemijoin (122x) - 57374: 42, // hintSetVar (122x) - 57369: 43, // hintSkipScan (122x) - 57389: 44, // hintSMJoin (122x) - 57392: 45, // hintStreamAgg (122x) - 57393: 46, // hintSwapJoinInputs (122x) - 57398: 47, // hintTimeRange (122x) - 57399: 48, // hintUseCascades (122x) - 57395: 49, // hintUseIndex (122x) - 57394: 50, // hintUseIndexMerge (122x) - 57396: 51, // hintUsePlanCache (122x) - 57397: 52, // hintUseToja (122x) - 44: 53, // ',' (120x) - 57412: 54, // hintDupsWeedOut (100x) - 57413: 55, // hintFirstMatch (100x) - 57414: 56, // hintLooseScan (100x) - 57415: 57, // hintMaterialization (100x) - 57407: 58, // hintTiFlash (100x) - 57406: 59, // hintTiKV (100x) - 57408: 60, // hintFalse (99x) - 57403: 61, // hintOLAP (99x) - 57404: 62, // hintOLTP (99x) - 57409: 63, // hintTrue (99x) - 57411: 64, // hintGB (98x) - 57410: 65, // hintMB (98x) - 57347: 66, // hintIdentifier (97x) - 57349: 67, // hintSingleAtIdentifier (82x) - 93: 68, // ']' (76x) - 57405: 69, // hintPartition (70x) - 46: 70, // '.' (66x) - 61: 71, // '=' (66x) - 40: 72, // '(' (61x) - 57344: 73, // $end (24x) - 57436: 74, // QueryBlockOpt (17x) - 57428: 75, // Identifier (13x) - 57346: 76, // hintIntLit (8x) - 57350: 77, // hintStringLit (5x) - 57418: 78, // CommaOpt (4x) - 57424: 79, // HintTable (4x) - 57425: 80, // HintTableList (4x) - 91: 81, // '[' (3x) - 57417: 82, // BooleanHintName (2x) - 57419: 83, // HintIndexList (2x) - 57421: 84, // HintStorageType (2x) - 57422: 85, // HintStorageTypeAndTable (2x) - 57426: 86, // HintTableListOpt (2x) - 57431: 87, // JoinOrderOptimizerHintName (2x) - 57432: 88, // NullaryHintName (2x) - 57435: 89, // PartitionListOpt (2x) - 57438: 90, // StorageOptimizerHintOpt (2x) - 57439: 91, // SubqueryOptimizerHintName (2x) - 57442: 92, // SubqueryStrategy (2x) - 57443: 93, // SupportedIndexLevelOptimizerHintName (2x) - 57444: 94, // SupportedTableLevelOptimizerHintName (2x) - 57445: 95, // TableOptimizerHintOpt (2x) - 57447: 96, // UnsupportedIndexLevelOptimizerHintName (2x) - 57448: 97, // UnsupportedTableLevelOptimizerHintName (2x) - 57420: 98, // HintQueryType (1x) - 57423: 99, // HintStorageTypeAndTableList (1x) - 57427: 100, // HintTrueOrFalse (1x) - 57429: 101, // IndexNameList (1x) - 57430: 102, // IndexNameListOpt (1x) - 57433: 103, // OptimizerHintList (1x) - 57434: 104, // PartitionList (1x) - 57437: 105, // Start (1x) - 57440: 106, // SubqueryStrategies (1x) - 57441: 107, // SubqueryStrategiesOpt (1x) - 57446: 108, // UnitOfBytes (1x) - 57449: 109, // Value (1x) - 57416: 110, // $default (0x) - 57345: 111, // error (0x) - 57348: 112, // hintInvalid (0x) + 41: 0, // ')' (129x) + 57377: 1, // hintAggToCop (121x) + 57390: 2, // hintBCJoin (121x) + 57355: 3, // hintBKA (121x) + 57357: 4, // hintBNL (121x) + 57401: 5, // hintForceIndex (121x) + 57379: 6, // hintHashAgg (121x) + 57359: 7, // hintHashJoin (121x) + 57380: 8, // hintIgnoreIndex (121x) + 57378: 9, // hintIgnorePlanCache (121x) + 57363: 10, // hintIndexMerge (121x) + 57381: 11, // hintInlHashJoin (121x) + 57382: 12, // hintInlJoin (121x) + 57383: 13, // hintInlMergeJoin (121x) + 57351: 14, // hintJoinFixedOrder (121x) + 57352: 15, // hintJoinOrder (121x) + 57353: 16, // hintJoinPrefix (121x) + 57354: 17, // hintJoinSuffix (121x) + 57400: 18, // hintLimitToCop (121x) + 57373: 19, // hintMaxExecutionTime (121x) + 57384: 20, // hintMemoryQuota (121x) + 57361: 21, // hintMerge (121x) + 57365: 22, // hintMRR (121x) + 57356: 23, // hintNoBKA (121x) + 57358: 24, // hintNoBNL (121x) + 57360: 25, // hintNoHashJoin (121x) + 57367: 26, // hintNoICP (121x) + 57364: 27, // hintNoIndexMerge (121x) + 57362: 28, // hintNoMerge (121x) + 57366: 29, // hintNoMRR (121x) + 57368: 30, // hintNoRangeOptimization (121x) + 57372: 31, // hintNoSemijoin (121x) + 57370: 32, // hintNoSkipScan (121x) + 57385: 33, // hintNoSwapJoinInputs (121x) + 57399: 34, // hintNthPlan (121x) + 57376: 35, // hintQBName (121x) + 57386: 36, // hintQueryType (121x) + 57387: 37, // hintReadConsistentReplica (121x) + 57388: 38, // hintReadFromStorage (121x) + 57375: 39, // hintResourceGroup (121x) + 57371: 40, // hintSemijoin (121x) + 57374: 41, // hintSetVar (121x) + 57369: 42, // hintSkipScan (121x) + 57389: 43, // hintSMJoin (121x) + 57391: 44, // hintStreamAgg (121x) + 57392: 45, // hintSwapJoinInputs (121x) + 57397: 46, // hintTimeRange (121x) + 57398: 47, // hintUseCascades (121x) + 57394: 48, // hintUseIndex (121x) + 57393: 49, // hintUseIndexMerge (121x) + 57395: 50, // hintUsePlanCache (121x) + 57396: 51, // hintUseToja (121x) + 44: 52, // ',' (119x) + 57411: 53, // hintDupsWeedOut (99x) + 57412: 54, // hintFirstMatch (99x) + 57413: 55, // hintLooseScan (99x) + 57414: 56, // hintMaterialization (99x) + 57406: 57, // hintTiFlash (99x) + 57405: 58, // hintTiKV (99x) + 57407: 59, // hintFalse (98x) + 57402: 60, // hintOLAP (98x) + 57403: 61, // hintOLTP (98x) + 57408: 62, // hintTrue (98x) + 57410: 63, // hintGB (97x) + 57409: 64, // hintMB (97x) + 57347: 65, // hintIdentifier (96x) + 57349: 66, // hintSingleAtIdentifier (81x) + 93: 67, // ']' (75x) + 57404: 68, // hintPartition (69x) + 46: 69, // '.' (65x) + 61: 70, // '=' (65x) + 40: 71, // '(' (60x) + 57344: 72, // $end (24x) + 57435: 73, // QueryBlockOpt (17x) + 57427: 74, // Identifier (13x) + 57346: 75, // hintIntLit (8x) + 57350: 76, // hintStringLit (5x) + 57417: 77, // CommaOpt (4x) + 57423: 78, // HintTable (4x) + 57424: 79, // HintTableList (4x) + 91: 80, // '[' (3x) + 57416: 81, // BooleanHintName (2x) + 57418: 82, // HintIndexList (2x) + 57420: 83, // HintStorageType (2x) + 57421: 84, // HintStorageTypeAndTable (2x) + 57425: 85, // HintTableListOpt (2x) + 57430: 86, // JoinOrderOptimizerHintName (2x) + 57431: 87, // NullaryHintName (2x) + 57434: 88, // PartitionListOpt (2x) + 57437: 89, // StorageOptimizerHintOpt (2x) + 57438: 90, // SubqueryOptimizerHintName (2x) + 57441: 91, // SubqueryStrategy (2x) + 57442: 92, // SupportedIndexLevelOptimizerHintName (2x) + 57443: 93, // SupportedTableLevelOptimizerHintName (2x) + 57444: 94, // TableOptimizerHintOpt (2x) + 57446: 95, // UnsupportedIndexLevelOptimizerHintName (2x) + 57447: 96, // UnsupportedTableLevelOptimizerHintName (2x) + 57419: 97, // HintQueryType (1x) + 57422: 98, // HintStorageTypeAndTableList (1x) + 57426: 99, // HintTrueOrFalse (1x) + 57428: 100, // IndexNameList (1x) + 57429: 101, // IndexNameListOpt (1x) + 57432: 102, // OptimizerHintList (1x) + 57433: 103, // PartitionList (1x) + 57436: 104, // Start (1x) + 57439: 105, // SubqueryStrategies (1x) + 57440: 106, // SubqueryStrategiesOpt (1x) + 57445: 107, // UnitOfBytes (1x) + 57448: 108, // Value (1x) + 57415: 109, // $default (0x) + 57345: 110, // error (0x) + 57348: 111, // hintInvalid (0x) } yyhintSymNames = []string{ "')'", "hintAggToCop", "hintBCJoin", - "hintBCJoinPreferLocal", "hintBKA", "hintBNL", "hintForceIndex", @@ -354,81 +351,65 @@ var ( yyhintReductions = []struct{ xsym, components int }{ {0, 1}, - {105, 1}, - {103, 1}, - {103, 3}, + {104, 1}, + {102, 1}, + {102, 3}, + {102, 1}, + {102, 3}, + {94, 4}, + {94, 4}, + {94, 4}, + {94, 4}, + {94, 4}, + {94, 4}, + {94, 5}, + {94, 5}, + {94, 5}, + {94, 6}, + {94, 4}, + {94, 4}, + {94, 6}, + {94, 6}, + {94, 5}, + {94, 4}, + {94, 5}, + {89, 5}, + {98, 1}, + {98, 3}, + {84, 4}, + {73, 0}, + {73, 1}, + {77, 0}, + {77, 1}, + {88, 0}, + {88, 4}, {103, 1}, {103, 3}, - {95, 4}, - {95, 4}, - {95, 4}, - {95, 4}, - {95, 4}, - {95, 4}, - {95, 5}, - {95, 5}, - {95, 5}, - {95, 6}, - {95, 4}, - {95, 4}, - {95, 6}, - {95, 6}, - {95, 5}, - {95, 4}, - {95, 5}, - {90, 5}, - {99, 1}, - {99, 3}, - {85, 4}, - {74, 0}, - {74, 1}, - {78, 0}, - {78, 1}, - {89, 0}, - {89, 4}, - {104, 1}, - {104, 3}, - {86, 1}, - {86, 1}, - {80, 2}, - {80, 3}, + {85, 1}, + {85, 1}, + {79, 2}, {79, 3}, - {79, 5}, - {83, 4}, - {102, 0}, - {102, 1}, + {78, 3}, + {78, 5}, + {82, 4}, + {101, 0}, {101, 1}, - {101, 3}, - {107, 0}, - {107, 1}, + {100, 1}, + {100, 3}, + {106, 0}, {106, 1}, - {106, 3}, - {109, 1}, - {109, 1}, - {109, 1}, + {105, 1}, + {105, 3}, {108, 1}, {108, 1}, - {100, 1}, - {100, 1}, - {87, 1}, - {87, 1}, - {87, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {97, 1}, - {94, 1}, - {94, 1}, - {94, 1}, - {94, 1}, - {94, 1}, - {94, 1}, - {94, 1}, - {94, 1}, - {94, 1}, + {108, 1}, + {107, 1}, + {107, 1}, + {99, 1}, + {99, 1}, + {86, 1}, + {86, 1}, + {86, 1}, {96, 1}, {96, 1}, {96, 1}, @@ -440,402 +421,414 @@ var ( {93, 1}, {93, 1}, {93, 1}, - {91, 1}, - {91, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {93, 1}, + {95, 1}, + {95, 1}, + {95, 1}, + {95, 1}, + {95, 1}, + {95, 1}, + {95, 1}, {92, 1}, {92, 1}, {92, 1}, {92, 1}, - {82, 1}, - {82, 1}, - {88, 1}, - {88, 1}, - {88, 1}, - {88, 1}, - {88, 1}, - {88, 1}, - {88, 1}, - {88, 1}, - {98, 1}, - {98, 1}, - {84, 1}, - {84, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, - {75, 1}, + {90, 1}, + {90, 1}, + {91, 1}, + {91, 1}, + {91, 1}, + {91, 1}, + {81, 1}, + {81, 1}, + {87, 1}, + {87, 1}, + {87, 1}, + {87, 1}, + {87, 1}, + {87, 1}, + {87, 1}, + {87, 1}, + {97, 1}, + {97, 1}, + {83, 1}, + {83, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, + {74, 1}, } yyhintXErrors = map[yyhintXError]string{} - yyhintParseTab = [255][]uint16{ + yyhintParseTab = [253][]uint16{ // 0 - {1: 232, 206, 207, 198, 200, 224, 230, 213, 222, 236, 214, 209, 208, 212, 177, 195, 196, 197, 233, 184, 189, 203, 215, 199, 201, 202, 217, 234, 204, 216, 218, 226, 220, 211, 185, 188, 193, 235, 194, 187, 225, 186, 219, 205, 231, 210, 190, 228, 221, 223, 229, 227, 82: 191, 87: 178, 192, 90: 176, 183, 93: 182, 180, 175, 181, 179, 103: 174, 105: 173}, - {73: 172}, - {1: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 324, 73: 171, 78: 424}, - {1: 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 73: 170}, - {1: 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 73: 168}, + {1: 229, 204, 196, 198, 221, 227, 210, 219, 233, 211, 206, 205, 209, 175, 193, 194, 195, 230, 182, 187, 201, 212, 197, 199, 200, 214, 231, 202, 213, 215, 223, 217, 208, 183, 186, 191, 232, 192, 185, 222, 184, 216, 203, 228, 207, 188, 225, 218, 220, 226, 224, 81: 189, 86: 176, 190, 89: 174, 181, 92: 180, 178, 173, 179, 177, 102: 172, 104: 171}, + {72: 170}, + {1: 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 320, 72: 169, 77: 420}, + {1: 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 72: 168}, + {1: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 72: 166}, // 5 - {72: 421}, - {72: 418}, - {72: 415}, - {72: 410}, - {72: 407}, + {71: 417}, + {71: 414}, + {71: 411}, + {71: 406}, + {71: 403}, // 10 - {72: 396}, - {72: 384}, - {72: 380}, - {72: 376}, - {72: 368}, + {71: 392}, + {71: 380}, + {71: 376}, + {71: 372}, + {71: 364}, // 15 - {72: 365}, - {72: 362}, - {72: 355}, - {72: 350}, - {72: 344}, + {71: 361}, + {71: 358}, + {71: 351}, + {71: 346}, + {71: 340}, // 20 - {72: 341}, - {72: 335}, - {72: 237}, - {72: 115}, - {72: 114}, + {71: 337}, + {71: 331}, + {71: 234}, + {71: 113}, + {71: 112}, // 25 - {72: 113}, - {72: 112}, - {72: 111}, - {72: 110}, - {72: 109}, + {71: 111}, + {71: 110}, + {71: 109}, + {71: 108}, + {71: 107}, // 30 - {72: 108}, - {72: 107}, - {72: 106}, - {72: 105}, - {72: 104}, + {71: 106}, + {71: 105}, + {71: 104}, + {71: 103}, + {71: 102}, // 35 - {72: 103}, - {72: 102}, - {72: 101}, - {72: 100}, - {72: 99}, + {71: 101}, + {71: 100}, + {71: 99}, + {71: 98}, + {71: 97}, // 40 - {72: 98}, - {72: 97}, - {72: 96}, - {72: 95}, - {72: 94}, + {71: 96}, + {71: 95}, + {71: 94}, + {71: 93}, + {71: 92}, // 45 - {72: 93}, - {72: 92}, - {72: 91}, - {72: 90}, - {72: 89}, + {71: 91}, + {71: 90}, + {71: 89}, + {71: 88}, + {71: 87}, // 50 - {72: 88}, - {72: 87}, - {72: 86}, - {72: 85}, - {72: 84}, + {71: 86}, + {71: 85}, + {71: 84}, + {71: 83}, + {71: 78}, // 55 - {72: 79}, - {72: 78}, - {72: 77}, - {72: 76}, - {72: 75}, + {71: 77}, + {71: 76}, + {71: 75}, + {71: 74}, + {71: 73}, // 60 - {72: 74}, - {72: 73}, - {72: 72}, - {72: 71}, - {72: 70}, + {71: 72}, + {71: 71}, + {71: 70}, + {71: 69}, + {57: 143, 143, 66: 236, 73: 235}, // 65 - {58: 145, 145, 67: 239, 74: 238}, - {58: 244, 243, 84: 242, 241, 99: 240}, - {144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 68: 144, 144, 76: 144}, - {332, 53: 333}, - {148, 53: 148}, + {57: 241, 240, 83: 239, 238, 98: 237}, + {142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 67: 142, 142, 75: 142}, + {328, 52: 329}, + {146, 52: 146}, + {80: 242}, // 70 - {81: 245}, - {81: 67}, - {81: 66}, - {1: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 247, 80: 246}, - {53: 330, 68: 329}, + {80: 66}, + {80: 65}, + {1: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 53: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 73: 244, 79: 243}, + {52: 326, 67: 325}, + {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 246, 78: 245}, // 75 - {1: 277, 291, 292, 255, 257, 302, 280, 259, 281, 279, 263, 282, 283, 284, 251, 252, 253, 254, 278, 273, 285, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 286, 301, 276, 287, 288, 289, 275, 271, 274, 269, 290, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 249, 79: 248}, - {135, 53: 135, 68: 135}, - {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 145, 145, 316, 74: 315}, - {65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65}, - {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, + {133, 52: 133, 67: 133}, + {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 143, 143, 312, 73: 311}, + {64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64}, + {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, + {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, // 80 - {63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}, - {62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62}, - {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, - {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, - {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, + {61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61}, + {60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60}, + {59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59}, + {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, + {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, // 85 - {58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58}, - {57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}, - {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, - {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, - {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, + {56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56}, + {55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55}, + {54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54}, + {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, + {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, // 90 - {53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53}, - {52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52}, - {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, - {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, - {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, + {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51}, + {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50}, + {49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49}, + {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, + {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, // 95 - {48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}, - {47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}, - {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, - {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, - {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, + {46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46}, + {45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45}, + {44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44}, + {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, + {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, // 100 - {43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43}, - {42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42}, - {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, - {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, - {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, + {41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41}, + {40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}, + {39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39}, + {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, + {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, // 105 - {38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38}, - {37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37}, - {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, - {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, - {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, + {36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36}, + {35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35}, + {34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34}, + {33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33}, + {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}, // 110 - {33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33}, - {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32}, - {31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, - {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, - {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29}, + {31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31}, + {30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30}, + {29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29}, + {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, + {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}, // 115 - {28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28}, - {27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}, - {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26}, - {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}, - {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24}, + {26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26}, + {25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}, + {24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24}, + {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, + {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, // 120 - {23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23}, - {22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22}, - {21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21}, - {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, - {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}, + {21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21}, + {20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20}, + {19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}, + {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, + {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}, // 125 - {18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, - {17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17}, - {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, - {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, + {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, + {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, + {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, + {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, + {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, // 130 - {13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, - {12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, - {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, + {11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}, + {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, + {9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}, + {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, + {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}, // 135 - {8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, - {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}, - {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}, - {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, - {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, + {6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}, + {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, + {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, + {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, + {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, // 140 - {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - {141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 68: 141, 319, 89: 328}, - {1: 277, 291, 292, 255, 257, 302, 280, 259, 281, 279, 263, 282, 283, 284, 251, 252, 253, 254, 278, 273, 285, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 286, 301, 276, 287, 288, 289, 275, 271, 274, 269, 290, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 317}, + {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, + {139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 67: 139, 315, 88: 324}, + {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 313}, + {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 143, 143, 73: 314}, + {139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 67: 139, 315, 88: 316}, // 145 - {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 145, 145, 74: 318}, - {141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 68: 141, 319, 89: 320}, - {72: 321}, - {132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 68: 132}, - {1: 277, 291, 292, 255, 257, 302, 280, 259, 281, 279, 263, 282, 283, 284, 251, 252, 253, 254, 278, 273, 285, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 286, 301, 276, 287, 288, 289, 275, 271, 274, 269, 290, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 323, 104: 322}, + {71: 317}, + {130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 67: 130}, + {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 319, 103: 318}, + {321, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 320, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 77: 322}, + {137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137}, // 150 - {325, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 324, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 78: 326}, - {139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139}, - {142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 54: 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 77: 142}, - {140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 68: 140}, - {1: 277, 291, 292, 255, 257, 302, 280, 259, 281, 279, 263, 282, 283, 284, 251, 252, 253, 254, 278, 273, 285, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 286, 301, 276, 287, 288, 289, 275, 271, 274, 269, 290, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 327}, + {140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 53: 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 76: 140}, + {138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 67: 138}, + {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 323}, + {136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136}, + {131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 67: 131}, // 155 - {138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138}, - {133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 68: 133}, - {146, 53: 146}, - {1: 277, 291, 292, 255, 257, 302, 280, 259, 281, 279, 263, 282, 283, 284, 251, 252, 253, 254, 278, 273, 285, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 286, 301, 276, 287, 288, 289, 275, 271, 274, 269, 290, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 249, 79: 331}, - {134, 53: 134, 68: 134}, + {144, 52: 144}, + {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 246, 78: 327}, + {132, 52: 132, 67: 132}, + {1: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 72: 147}, + {57: 241, 240, 83: 239, 330}, // 160 - {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 73: 149}, - {58: 244, 243, 84: 242, 334}, - {147, 53: 147}, - {61: 145, 145, 67: 239, 74: 336}, - {61: 338, 339, 98: 337}, - // 165 - {340}, - {69}, + {145, 52: 145}, + {60: 143, 143, 66: 236, 73: 332}, + {60: 334, 335, 97: 333}, + {336}, {68}, - {1: 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 73: 150}, - {145, 67: 239, 74: 342}, + // 165 + {67}, + {1: 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 72: 148}, + {143, 66: 236, 73: 338}, + {339}, + {1: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 72: 149}, // 170 - {343}, - {1: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 73: 151}, - {60: 145, 63: 145, 67: 239, 74: 345}, - {60: 348, 63: 347, 100: 346}, - {349}, + {59: 143, 62: 143, 66: 236, 73: 341}, + {59: 344, 62: 343, 99: 342}, + {345}, + {115}, + {114}, // 175 - {117}, - {116}, - {1: 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 73: 152}, - {77: 351}, - {53: 324, 77: 143, 352}, + {1: 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 72: 150}, + {76: 347}, + {52: 320, 76: 141, 348}, + {76: 349}, + {350}, // 180 - {77: 353}, - {354}, - {1: 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 73: 153}, - {67: 239, 74: 356, 76: 145}, - {76: 357}, + {1: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 72: 151}, + {66: 236, 73: 352, 75: 143}, + {75: 353}, + {63: 356, 355, 107: 354}, + {357}, // 185 - {64: 360, 359, 108: 358}, - {361}, - {119}, - {118}, - {1: 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 73: 154}, + {117}, + {116}, + {1: 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 72: 152}, + {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 359}, + {360}, // 190 - {1: 277, 291, 292, 255, 257, 302, 280, 259, 281, 279, 263, 282, 283, 284, 251, 252, 253, 254, 278, 273, 285, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 286, 301, 276, 287, 288, 289, 275, 271, 274, 269, 290, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 363}, - {364}, - {1: 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 73: 155}, - {1: 277, 291, 292, 255, 257, 302, 280, 259, 281, 279, 263, 282, 283, 284, 251, 252, 253, 254, 278, 273, 285, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 286, 301, 276, 287, 288, 289, 275, 271, 274, 269, 290, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 366}, - {367}, + {1: 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 72: 153}, + {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 362}, + {363}, + {1: 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 72: 154}, + {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 365}, // 195 - {1: 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 73: 156}, - {1: 277, 291, 292, 255, 257, 302, 280, 259, 281, 279, 263, 282, 283, 284, 251, 252, 253, 254, 278, 273, 285, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 286, 301, 276, 287, 288, 289, 275, 271, 274, 269, 290, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 369}, - {71: 370}, - {1: 277, 291, 292, 255, 257, 302, 280, 259, 281, 279, 263, 282, 283, 284, 251, 252, 253, 254, 278, 273, 285, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 286, 301, 276, 287, 288, 289, 275, 271, 274, 269, 290, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 373, 374, 372, 109: 371}, - {375}, - // 200 - {122}, - {121}, + {70: 366}, + {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 369, 370, 368, 108: 367}, + {371}, {120}, - {1: 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 73: 157}, - {67: 239, 74: 377, 76: 145}, + {119}, + // 200 + {118}, + {1: 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 72: 155}, + {66: 236, 73: 373, 75: 143}, + {75: 374}, + {375}, // 205 - {76: 378}, + {1: 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 72: 156}, + {66: 236, 73: 377, 75: 143}, + {75: 378}, {379}, - {1: 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 73: 158}, - {67: 239, 74: 381, 76: 145}, - {76: 382}, + {1: 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 72: 157}, // 210 - {383}, - {1: 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 73: 159}, - {145, 54: 145, 145, 145, 145, 67: 239, 74: 385}, - {126, 54: 389, 390, 391, 392, 92: 388, 106: 387, 386}, - {395}, + {143, 53: 143, 143, 143, 143, 66: 236, 73: 381}, + {124, 53: 385, 386, 387, 388, 91: 384, 105: 383, 382}, + {391}, + {123, 52: 389}, + {122, 52: 122}, // 215 - {125, 53: 393}, - {124, 53: 124}, - {83, 53: 83}, - {82, 53: 82}, - {81, 53: 81}, + {82, 52: 82}, + {81, 52: 81}, + {80, 52: 80}, + {79, 52: 79}, + {53: 385, 386, 387, 388, 91: 390}, // 220 - {80, 53: 80}, - {54: 389, 390, 391, 392, 92: 394}, - {123, 53: 123}, - {1: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 73: 160}, - {1: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 398, 83: 397}, + {121, 52: 121}, + {1: 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 72: 158}, + {1: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 53: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 73: 394, 82: 393}, + {402}, + {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 246, 78: 395}, // 225 - {406}, - {1: 277, 291, 292, 255, 257, 302, 280, 259, 281, 279, 263, 282, 283, 284, 251, 252, 253, 254, 278, 273, 285, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 286, 301, 276, 287, 288, 289, 275, 271, 274, 269, 290, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 249, 79: 399}, - {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 324, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 78: 400}, - {130, 277, 291, 292, 255, 257, 302, 280, 259, 281, 279, 263, 282, 283, 284, 251, 252, 253, 254, 278, 273, 285, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 286, 301, 276, 287, 288, 289, 275, 271, 274, 269, 290, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 403, 101: 402, 401}, - {131}, + {141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 320, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 77: 396}, + {128, 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 399, 100: 398, 397}, + {129}, + {127, 52: 400}, + {126, 52: 126}, // 230 - {129, 53: 404}, - {128, 53: 128}, - {1: 277, 291, 292, 255, 257, 302, 280, 259, 281, 279, 263, 282, 283, 284, 251, 252, 253, 254, 278, 273, 285, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 286, 301, 276, 287, 288, 289, 275, 271, 274, 269, 290, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 405}, - {127, 53: 127}, - {1: 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 73: 161}, + {1: 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 401}, + {125, 52: 125}, + {1: 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 72: 159}, + {1: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 53: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 73: 394, 82: 404}, + {405}, // 235 - {1: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 398, 83: 408}, - {409}, - {1: 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 73: 162}, - {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 413, 80: 412, 86: 411}, - {414}, + {1: 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 72: 160}, + {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 53: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 73: 409, 79: 408, 85: 407}, + {410}, + {135, 52: 326}, + {134, 274, 288, 252, 254, 298, 277, 256, 278, 276, 260, 279, 280, 281, 248, 249, 250, 251, 275, 270, 282, 258, 262, 253, 255, 257, 264, 261, 259, 263, 265, 269, 267, 283, 297, 273, 284, 285, 286, 272, 268, 271, 266, 287, 289, 290, 295, 296, 292, 291, 293, 294, 53: 307, 308, 309, 310, 302, 301, 303, 299, 300, 304, 306, 305, 247, 74: 246, 78: 245}, // 240 - {137, 53: 330}, - {136, 277, 291, 292, 255, 257, 302, 280, 259, 281, 279, 263, 282, 283, 284, 251, 252, 253, 254, 278, 273, 285, 261, 265, 256, 258, 260, 267, 264, 262, 266, 268, 272, 270, 286, 301, 276, 287, 288, 289, 275, 271, 274, 269, 290, 293, 294, 299, 300, 296, 295, 297, 298, 54: 311, 312, 313, 314, 306, 305, 307, 303, 304, 308, 310, 309, 250, 75: 249, 79: 248}, - {1: 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 73: 163}, - {145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 413, 80: 412, 86: 416}, - {417}, + {1: 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 72: 161}, + {143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 53: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 73: 409, 79: 408, 85: 412}, + {413}, + {1: 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 72: 162}, + {1: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 53: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 236, 73: 244, 79: 415}, // 245 - {1: 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 73: 164}, - {1: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 54: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 239, 74: 247, 80: 419}, - {420, 53: 330}, - {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 73: 165}, - {145, 67: 239, 74: 422}, + {416, 52: 326}, + {1: 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 72: 163}, + {143, 66: 236, 73: 418}, + {419}, + {1: 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 72: 164}, // 250 - {423}, - {1: 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 73: 166}, - {1: 232, 206, 207, 198, 200, 224, 230, 213, 222, 236, 214, 209, 208, 212, 177, 195, 196, 197, 233, 184, 189, 203, 215, 199, 201, 202, 217, 234, 204, 216, 218, 226, 220, 211, 185, 188, 193, 235, 194, 187, 225, 186, 219, 205, 231, 210, 190, 228, 221, 223, 229, 227, 82: 191, 87: 178, 192, 90: 426, 183, 93: 182, 180, 425, 181, 179}, - {1: 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 73: 169}, - {1: 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 73: 167}, + {1: 229, 204, 196, 198, 221, 227, 210, 219, 233, 211, 206, 205, 209, 175, 193, 194, 195, 230, 182, 187, 201, 212, 197, 199, 200, 214, 231, 202, 213, 215, 223, 217, 208, 183, 186, 191, 232, 192, 185, 222, 184, 216, 203, 228, 207, 188, 225, 218, 220, 226, 224, 81: 189, 86: 176, 190, 89: 422, 181, 92: 180, 178, 421, 179, 177}, + {1: 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 72: 167}, + {1: 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 72: 165}, } ) @@ -875,7 +868,7 @@ func yyhintlex1(yylex yyhintLexer, lval *yyhintSymType) (n int) { } func yyhintParse(yylex yyhintLexer, parser *hintParser) int { - const yyError = 111 + const yyError = 110 yyEx, _ := yylex.(yyhintLexerEx) var yyn int diff --git a/parser/hintparser.y b/parser/hintparser.y index 45037741984c3..332d53eb7379e 100644 --- a/parser/hintparser.y +++ b/parser/hintparser.y @@ -94,7 +94,6 @@ import ( hintReadFromStorage "READ_FROM_STORAGE" hintSMJoin "MERGE_JOIN" hintBCJoin "BROADCAST_JOIN" - hintBCJoinPreferLocal "BROADCAST_JOIN_LOCAL" hintStreamAgg "STREAM_AGG" hintSwapJoinInputs "SWAP_JOIN_INPUTS" hintUseIndexMerge "USE_INDEX_MERGE" @@ -534,7 +533,6 @@ UnsupportedTableLevelOptimizerHintName: SupportedTableLevelOptimizerHintName: "MERGE_JOIN" | "BROADCAST_JOIN" -| "BROADCAST_JOIN_LOCAL" | "INL_JOIN" | "INL_HASH_JOIN" | "SWAP_JOIN_INPUTS" @@ -635,7 +633,6 @@ Identifier: | "READ_FROM_STORAGE" | "MERGE_JOIN" | "BROADCAST_JOIN" -| "BROADCAST_JOIN_LOCAL" | "STREAM_AGG" | "SWAP_JOIN_INPUTS" | "USE_INDEX_MERGE" diff --git a/parser/misc.go b/parser/misc.go index 93293d22d42e0..6212e81cd5714 100644 --- a/parser/misc.go +++ b/parser/misc.go @@ -919,7 +919,6 @@ var hintTokenMap = map[string]int{ "READ_CONSISTENT_REPLICA": hintReadConsistentReplica, "READ_FROM_STORAGE": hintReadFromStorage, "BROADCAST_JOIN": hintBCJoin, - "BROADCAST_JOIN_LOCAL": hintBCJoinPreferLocal, "MERGE_JOIN": hintSMJoin, "STREAM_AGG": hintStreamAgg, "SWAP_JOIN_INPUTS": hintSwapJoinInputs, diff --git a/parser/parser_test.go b/parser/parser_test.go index b0aa13915fc8c..011dec6810fac 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -3810,12 +3810,12 @@ func TestOptimizerHints(t *testing.T) { require.Equal(t, "t4", hints[1].Tables[1].TableName.L) // TEST BROADCAST_JOIN - stmt, _, err = p.Parse("select /*+ BROADCAST_JOIN(t1, T2), broadcast_join(t3, t4), BROADCAST_JOIN_LOCAL(t2) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") + stmt, _, err = p.Parse("select /*+ BROADCAST_JOIN(t1, T2), broadcast_join(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") require.NoError(t, err) selectStmt = stmt[0].(*ast.SelectStmt) hints = selectStmt.TableHints - require.Len(t, hints, 3) + require.Len(t, hints, 2) require.Equal(t, "broadcast_join", hints[0].HintName.L) require.Len(t, hints[0].Tables, 2) require.Equal(t, "t1", hints[0].Tables[0].TableName.L) @@ -3826,10 +3826,6 @@ func TestOptimizerHints(t *testing.T) { require.Equal(t, "t3", hints[1].Tables[0].TableName.L) require.Equal(t, "t4", hints[1].Tables[1].TableName.L) - require.Equal(t, "broadcast_join_local", hints[2].HintName.L) - require.Len(t, hints[2].Tables, 1) - require.Equal(t, "t2", hints[2].Tables[0].TableName.L) - // Test TIDB_INLJ stmt, _, err = p.Parse("select /*+ TIDB_INLJ(t1, T2), tidb_inlj(t3, t4) */ c1, c2 from t1, t2 where t1.c1 = t2.c1", "", "") require.NoError(t, err) diff --git a/planner/core/exhaust_physical_plans.go b/planner/core/exhaust_physical_plans.go index cd482827132d4..15e45c2b5dbb2 100644 --- a/planner/core/exhaust_physical_plans.go +++ b/planner/core/exhaust_physical_plans.go @@ -1802,12 +1802,6 @@ func (p *LogicalJoin) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]P mppJoins := p.tryToGetMppHashJoin(prop, false) joins = append(joins, mppJoins...) } - } else if p.ctx.GetSessionVars().AllowBCJ && canPushToTiFlash { - broadCastJoins := p.tryToGetBroadCastJoin(prop) - if (p.preferJoinType & preferBCJoin) > 0 { - return broadCastJoins, true, nil - } - joins = append(joins, broadCastJoins...) } if prop.IsFlashProp() { return joins, true, nil @@ -2014,99 +2008,6 @@ func choosePartitionKeys(keys []*property.MPPPartitionColumn, matches []int) []* return newKeys } -func (p *LogicalJoin) tryToGetBroadCastJoin(prop *property.PhysicalProperty) []PhysicalPlan { - if !prop.IsEmpty() { - return nil - } - if prop.TaskTp != property.RootTaskType && !prop.IsFlashProp() { - return nil - } - if !canExprsInJoinPushdown(p, kv.TiFlash) { - return nil - } - - // Disable broadcast join on partition table for TiFlash. - for _, child := range p.children { - if ds, isDataSource := child.(*DataSource); isDataSource { - if ds.tableInfo.GetPartitionInfo() != nil { - return nil - } - } - } - - if (p.JoinType != InnerJoin && p.JoinType != LeftOuterJoin && p.JoinType != RightOuterJoin && p.JoinType != SemiJoin && p.JoinType != AntiSemiJoin) || len(p.EqualConditions) == 0 { - return nil - } - - // for left/semi/anti-semi join the global idx must be 1, and for right join the global idx must be 0 - if hasPrefer, idx := p.getPreferredBCJLocalIndex(); hasPrefer { - if (idx == 0 && p.JoinType == RightOuterJoin) || (idx == 1 && (p.JoinType == LeftOuterJoin || p.JoinType == SemiJoin || p.JoinType == AntiSemiJoin)) { - return nil - } - return p.tryToGetBroadCastJoinByPreferGlobalIdx(prop, 1-idx) - } - if p.JoinType == InnerJoin { - results := p.tryToGetBroadCastJoinByPreferGlobalIdx(prop, 0) - results = append(results, p.tryToGetBroadCastJoinByPreferGlobalIdx(prop, 1)...) - return results - } else if p.JoinType == LeftOuterJoin || p.JoinType == SemiJoin || p.JoinType == AntiSemiJoin { - return p.tryToGetBroadCastJoinByPreferGlobalIdx(prop, 1) - } - return p.tryToGetBroadCastJoinByPreferGlobalIdx(prop, 0) -} - -func (p *LogicalJoin) tryToGetBroadCastJoinByPreferGlobalIdx(prop *property.PhysicalProperty, preferredGlobalIndex int) []PhysicalPlan { - lkeys, rkeys, _, _ := p.GetJoinKeys() - baseJoin := basePhysicalJoin{ - JoinType: p.JoinType, - LeftConditions: p.LeftConditions, - RightConditions: p.RightConditions, - OtherConditions: p.OtherConditions, - DefaultValues: p.DefaultValues, - LeftJoinKeys: lkeys, - RightJoinKeys: rkeys, - } - - preferredBuildIndex := 0 - if p.children[0].statsInfo().Count() > p.children[1].statsInfo().Count() { - preferredBuildIndex = 1 - } - if p.JoinType == SemiJoin || p.JoinType == AntiSemiJoin { - preferredBuildIndex = 1 - } - // TiFlash does not support Right out join with other conditions, if the join - // has other conditions, need to set the build side to make sure it will be - // executed as left join in TiFlash(In TiFlash the build side is always the right side) - if len(p.OtherConditions) != 0 { - if p.JoinType == RightOuterJoin { - preferredBuildIndex = 0 - } else if p.JoinType == LeftOuterJoin { - preferredBuildIndex = 1 - } - } - baseJoin.InnerChildIdx = preferredBuildIndex - childrenReqProps := make([]*property.PhysicalProperty, 2) - childrenReqProps[preferredGlobalIndex] = &property.PhysicalProperty{TaskTp: property.CopTiFlashGlobalReadTaskType, ExpectedCnt: math.MaxFloat64} - if prop.TaskTp == property.CopTiFlashGlobalReadTaskType { - childrenReqProps[1-preferredGlobalIndex] = &property.PhysicalProperty{TaskTp: property.CopTiFlashGlobalReadTaskType, ExpectedCnt: math.MaxFloat64} - } else { - childrenReqProps[1-preferredGlobalIndex] = &property.PhysicalProperty{TaskTp: property.CopTiFlashLocalReadTaskType, ExpectedCnt: math.MaxFloat64} - } - if prop.ExpectedCnt < p.stats.RowCount { - expCntScale := prop.ExpectedCnt / p.stats.RowCount - childrenReqProps[1-baseJoin.InnerChildIdx].ExpectedCnt = p.children[1-baseJoin.InnerChildIdx].statsInfo().RowCount * expCntScale - } - - join := PhysicalHashJoin{ - basePhysicalJoin: baseJoin, - Concurrency: uint(p.ctx.GetSessionVars().CopTiFlashConcurrencyFactor), - EqualConditions: p.EqualConditions, - storeTp: kv.TiFlash, - globalChildIndex: preferredGlobalIndex, - }.Init(p.ctx, p.stats.ScaleByExpectCnt(prop.ExpectedCnt), p.blockOffset, childrenReqProps...) - return []PhysicalPlan{join} -} - // TryToGetChildProp will check if this sort property can be pushed or not. // When a sort column will be replaced by scalar function, we refuse it. // When a sort column will be replaced by a constant, we just remove it. @@ -2504,11 +2405,8 @@ func (la *LogicalAggregation) getStreamAggs(prop *property.PhysicalProperty) []P } else if !la.aggHints.preferAggToCop { taskTypes = append(taskTypes, property.RootTaskType) } - if !la.canPushToCop(kv.TiKV) { + if !la.canPushToCop(kv.TiKV) && !la.canPushToCop(kv.TiFlash) { taskTypes = []property.TaskType{property.RootTaskType} - if la.canPushToCop(kv.TiFlash) { - taskTypes = append(taskTypes, property.CopTiFlashLocalReadTaskType) - } } for _, taskTp := range taskTypes { copiedChildProperty := new(property.PhysicalProperty) @@ -2628,9 +2526,6 @@ func (la *LogicalAggregation) getHashAggs(prop *property.PhysicalProperty) []Phy } hashAggs := make([]PhysicalPlan, 0, len(prop.GetAllPossibleChildTaskTypes())) taskTypes := []property.TaskType{property.CopSingleReadTaskType, property.CopDoubleReadTaskType} - if la.ctx.GetSessionVars().AllowBCJ { - taskTypes = append(taskTypes, property.CopTiFlashLocalReadTaskType) - } canPushDownToTiFlash := la.canPushToCop(kv.TiFlash) canPushDownToMPP := canPushDownToTiFlash && la.ctx.GetSessionVars().IsMPPAllowed() && la.checkCanPushDownToMPP() if la.HasDistinct() { @@ -2641,11 +2536,8 @@ func (la *LogicalAggregation) getHashAggs(prop *property.PhysicalProperty) []Phy } else if !la.aggHints.preferAggToCop { taskTypes = append(taskTypes, property.RootTaskType) } - if !la.canPushToCop(kv.TiKV) { + if !la.canPushToCop(kv.TiKV) && !canPushDownToTiFlash { taskTypes = []property.TaskType{property.RootTaskType} - if canPushDownToTiFlash { - taskTypes = append(taskTypes, property.CopTiFlashLocalReadTaskType) - } } if canPushDownToMPP { taskTypes = append(taskTypes, property.MppTaskType) diff --git a/planner/core/explain.go b/planner/core/explain.go index 0c68326b00a01..b18dc174ae622 100644 --- a/planner/core/explain.go +++ b/planner/core/explain.go @@ -289,9 +289,6 @@ func (p *PhysicalTableScan) OperatorInfo(normalized bool) string { if p.stats.StatsVersion == statistics.PseudoVersion && !normalized { buffer.WriteString(", stats:pseudo") } - if p.IsGlobalRead { - buffer.WriteString(", global read") - } return buffer.String() } diff --git a/planner/core/find_best_task.go b/planner/core/find_best_task.go index 13ed79a09460e..77bfaffa54155 100644 --- a/planner/core/find_best_task.go +++ b/planner/core/find_best_task.go @@ -605,21 +605,7 @@ func (ds *DataSource) skylinePruning(prop *property.PhysicalProperty) []*candida } var currentCandidate *candidatePath if path.IsTablePath() { - if path.StoreType == kv.TiFlash { - if path.IsTiFlashGlobalRead && prop.TaskTp == property.CopTiFlashGlobalReadTaskType { - currentCandidate = ds.getTableCandidate(path, prop) - } - if !path.IsTiFlashGlobalRead && prop.TaskTp != property.CopTiFlashGlobalReadTaskType { - currentCandidate = ds.getTableCandidate(path, prop) - } - } else { - if !path.IsTiFlashGlobalRead && !prop.IsFlashProp() { - currentCandidate = ds.getTableCandidate(path, prop) - } - } - if currentCandidate == nil { - continue - } + currentCandidate = ds.getTableCandidate(path, prop) } else { if len(path.AccessConds) > 0 || !prop.IsEmpty() || path.Forced || path.IsSingleScan { // We will use index to generate physical plan if any of the following conditions is satisfied: @@ -2110,7 +2096,6 @@ func (ds *DataSource) getOriginalPhysicalTableScan(prop *property.PhysicalProper Ranges: path.Ranges, AccessCondition: path.AccessConds, StoreType: path.StoreType, - IsGlobalRead: path.IsTiFlashGlobalRead, }.Init(ds.ctx, ds.blockOffset) ts.filterCondition = make([]expression.Expression, len(path.TableFilters)) copy(ts.filterCondition, path.TableFilters) @@ -2160,9 +2145,6 @@ func (ds *DataSource) getOriginalPhysicalTableScan(prop *property.PhysicalProper } sessVars := ds.ctx.GetSessionVars() cost := rowCount * rowSize * sessVars.GetScanFactor(ds.tableInfo) - if ts.IsGlobalRead { - cost += rowCount * sessVars.GetNetworkFactor(ds.tableInfo) * rowSize - } if isMatchProp { ts.Desc = prop.SortItems[0].Desc if prop.SortItems[0].Desc && prop.ExpectedCnt >= smallScanThreshold { diff --git a/planner/core/initialize.go b/planner/core/initialize.go index 5a32d0294e952..3070b9859a561 100644 --- a/planner/core/initialize.go +++ b/planner/core/initialize.go @@ -420,19 +420,30 @@ func (p PhysicalTableReader) Init(ctx sessionctx.Context, offset int) *PhysicalT if p.tablePlan != nil { p.TablePlans = flattenPushDownPlan(p.tablePlan) p.schema = p.tablePlan.Schema() - if p.StoreType == kv.TiFlash && p.GetTableScan() != nil && !p.GetTableScan().KeepOrder { - // When allow batch cop is 1, only agg / topN uses batch cop. - // When allow batch cop is 2, every query uses batch cop. - switch ctx.GetSessionVars().AllowBatchCop { - case 1: - for _, plan := range p.TablePlans { - switch plan.(type) { - case *PhysicalHashAgg, *PhysicalStreamAgg, *PhysicalTopN: - p.BatchCop = true + if p.StoreType == kv.TiFlash { + tableScans := p.GetTableScans() + // When PhysicalTableReader's store type is tiflash, has table scan + // and all table scans contained are not keepOrder, try to use batch cop. + if len(tableScans) > 0 { + for _, tableScan := range tableScans { + if tableScan.KeepOrder { + return &p } } - case 2: - p.BatchCop = true + + // When allow batch cop is 1, only agg / topN uses batch cop. + // When allow batch cop is 2, every query uses batch cop. + switch ctx.GetSessionVars().AllowBatchCop { + case 1: + for _, plan := range p.TablePlans { + switch plan.(type) { + case *PhysicalHashAgg, *PhysicalStreamAgg, *PhysicalTopN: + p.BatchCop = true + } + } + case 2: + p.BatchCop = true + } } } } diff --git a/planner/core/integration_test.go b/planner/core/integration_test.go index b6f09e4507b9f..36c234bcc7d7b 100644 --- a/planner/core/integration_test.go +++ b/planner/core/integration_test.go @@ -907,22 +907,6 @@ func TestJoinNotSupportedByTiFlash(t *testing.T) { res := tk.MustQuery(tt) res.Check(testkit.Rows(output[i].Plan...)) } - - tk.MustExec("set @@session.tidb_allow_mpp = 0") - tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") - tk.MustExec("set @@session.tidb_allow_batch_cop = 1") - tk.MustExec("set @@session.tidb_opt_broadcast_join = 1") - // make cbo force choose broadcast join since sql hint does not work for semi/anti-semi join - tk.MustExec("set @@session.tidb_opt_cpu_factor=10000000;") - integrationSuiteData.GetTestCases(t, &input, &output) - for i, tt := range input { - testdata.OnRecord(func() { - output[i].SQL = tt - output[i].Plan = testdata.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - }) - res := tk.MustQuery(tt) - res.Check(testkit.Rows(output[i].Plan...)) - } } func TestMPPWithHashExchangeUnderNewCollation(t *testing.T) { @@ -955,7 +939,6 @@ func TestMPPWithHashExchangeUnderNewCollation(t *testing.T) { tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") tk.MustExec("set @@session.tidb_allow_mpp = 1") - tk.MustExec("set @@session.tidb_opt_broadcast_join = 0") tk.MustExec("set @@session.tidb_broadcast_join_threshold_count = 0") tk.MustExec("set @@session.tidb_broadcast_join_threshold_size = 0") tk.MustExec("set @@session.tidb_hash_exchange_with_new_collation = 1") @@ -4012,8 +3995,6 @@ func TestPushDownProjectionForTiFlash(t *testing.T) { } } - tk.MustExec("set @@tidb_opt_broadcast_join=1;") - var input []string var output []struct { SQL string @@ -4054,7 +4035,7 @@ func TestPushDownProjectionForMPP(t *testing.T) { } } - tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_opt_broadcast_join=0; set @@tidb_enforce_mpp=1;") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1;") var input []string var output []struct { @@ -4189,7 +4170,7 @@ func TestPushDownAggForMPP(t *testing.T) { } } - tk.MustExec(" set @@tidb_allow_mpp=1; set @@tidb_opt_broadcast_join=0; set @@tidb_broadcast_join_threshold_count = 1; set @@tidb_broadcast_join_threshold_size=1;") + tk.MustExec(" set @@tidb_allow_mpp=1; set @@tidb_broadcast_join_threshold_count = 1; set @@tidb_broadcast_join_threshold_size=1;") var input []string var output []struct { @@ -5627,7 +5608,7 @@ func TestRejectSortForMPP(t *testing.T) { } } - tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_opt_broadcast_join=0; set @@tidb_enforce_mpp=1;") + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_enforce_mpp=1;") var input []string var output []struct { diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 0dd5a650e5a1d..3cf7b25a95d10 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -67,11 +67,8 @@ const ( // TiDBBroadCastJoin indicates applying broadcast join by force. TiDBBroadCastJoin = "tidb_bcj" - // HintBCJ indicates applying broadcast join by force. HintBCJ = "broadcast_join" - // HintBCJPreferLocal specifies the preferred local read table - HintBCJPreferLocal = "broadcast_join_local" // TiDBIndexNestedLoopJoin is hint enforce index nested loop join. TiDBIndexNestedLoopJoin = "tidb_inlj" @@ -540,19 +537,6 @@ func extractTableAlias(p Plan, parentOffset int) *hintTableInfo { return nil } -func (p *LogicalJoin) getPreferredBCJLocalIndex() (hasPrefer bool, prefer int) { - if p.hintInfo == nil { - return - } - if p.hintInfo.ifPreferAsLocalInBCJoin(p.children[0], p.blockOffset) { - return true, 0 - } - if p.hintInfo.ifPreferAsLocalInBCJoin(p.children[1], p.blockOffset) { - return true, 1 - } - return false, 0 -} - func (p *LogicalJoin) setPreferredJoinType(hintInfo *tableHintInfo) { if hintInfo == nil { return @@ -3299,12 +3283,12 @@ func (b *PlanBuilder) pushHintWithoutTableWarning(hint *ast.TableOptimizerHint) func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLevel int) { hints = b.hintProcessor.GetCurrentStmtHints(hints, currentLevel) var ( - sortMergeTables, INLJTables, INLHJTables, INLMJTables, hashJoinTables, BCTables, BCJPreferLocalTables []hintTableInfo - indexHintList, indexMergeHintList []indexHintInfo - tiflashTables, tikvTables []hintTableInfo - aggHints aggHintInfo - timeRangeHint ast.HintTimeRange - limitHints limitHintInfo + sortMergeTables, INLJTables, INLHJTables, INLMJTables, hashJoinTables, BCTables []hintTableInfo + indexHintList, indexMergeHintList []indexHintInfo + tiflashTables, tikvTables []hintTableInfo + aggHints aggHintInfo + timeRangeHint ast.HintTimeRange + limitHints limitHintInfo ) for _, hint := range hints { // Set warning for the hint that requires the table name. @@ -3322,8 +3306,6 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev sortMergeTables = append(sortMergeTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) case TiDBBroadCastJoin, HintBCJ: BCTables = append(BCTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) - case HintBCJPreferLocal: - BCJPreferLocalTables = append(BCJPreferLocalTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) case TiDBIndexNestedLoopJoin, HintINLJ: INLJTables = append(INLJTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) case HintINLHJ: @@ -3414,18 +3396,17 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLev } } b.tableHintInfo = append(b.tableHintInfo, tableHintInfo{ - sortMergeJoinTables: sortMergeTables, - broadcastJoinTables: BCTables, - broadcastJoinPreferredLocal: BCJPreferLocalTables, - indexNestedLoopJoinTables: indexNestedLoopJoinTables{INLJTables, INLHJTables, INLMJTables}, - hashJoinTables: hashJoinTables, - indexHintList: indexHintList, - tiflashTables: tiflashTables, - tikvTables: tikvTables, - aggHints: aggHints, - indexMergeHintList: indexMergeHintList, - timeRangeHint: timeRangeHint, - limitHints: limitHints, + sortMergeJoinTables: sortMergeTables, + broadcastJoinTables: BCTables, + indexNestedLoopJoinTables: indexNestedLoopJoinTables{INLJTables, INLHJTables, INLMJTables}, + hashJoinTables: hashJoinTables, + indexHintList: indexHintList, + tiflashTables: tiflashTables, + tikvTables: tikvTables, + aggHints: aggHints, + indexMergeHintList: indexMergeHintList, + timeRangeHint: timeRangeHint, + limitHints: limitHints, }) } @@ -3445,7 +3426,6 @@ func (b *PlanBuilder) popTableHints() { b.appendUnmatchedJoinHintWarning(HintINLMJ, "", hintInfo.indexNestedLoopJoinTables.inlmjTables) b.appendUnmatchedJoinHintWarning(HintSMJ, TiDBMergeJoin, hintInfo.sortMergeJoinTables) b.appendUnmatchedJoinHintWarning(HintBCJ, TiDBBroadCastJoin, hintInfo.broadcastJoinTables) - b.appendUnmatchedJoinHintWarning(HintBCJPreferLocal, "", hintInfo.broadcastJoinPreferredLocal) b.appendUnmatchedJoinHintWarning(HintHJ, TiDBHashJoin, hintInfo.hashJoinTables) b.appendUnmatchedStorageHintWarning(hintInfo.tiflashTables, hintInfo.tikvTables) b.tableHintInfo = b.tableHintInfo[:len(b.tableHintInfo)-1] diff --git a/planner/core/physical_plans.go b/planner/core/physical_plans.go index d04aa321be60b..d60eb2ae24168 100644 --- a/planner/core/physical_plans.go +++ b/planner/core/physical_plans.go @@ -108,23 +108,25 @@ func (p *PhysicalTableReader) GetTablePlan() PhysicalPlan { return p.tablePlan } -// GetTableScan exports the tableScan that contained in tablePlan. -func (p *PhysicalTableReader) GetTableScan() *PhysicalTableScan { - curPlan := p.tablePlan - for { - chCnt := len(curPlan.Children()) - if chCnt == 0 { - return curPlan.(*PhysicalTableScan) - } else if chCnt == 1 { - curPlan = curPlan.Children()[0] - } else { - join, ok := curPlan.(*PhysicalHashJoin) - if !ok { - return nil - } - curPlan = join.children[1-join.globalChildIndex] +// GetTableScans exports the tableScan that contained in tablePlans. +func (p *PhysicalTableReader) GetTableScans() []*PhysicalTableScan { + tableScans := make([]*PhysicalTableScan, 0, 1) + for _, tablePlan := range p.TablePlans { + tableScan, ok := tablePlan.(*PhysicalTableScan) + if ok { + tableScans = append(tableScans, tableScan) } } + return tableScans +} + +// GetTableScan exports the tableScan that contained in tablePlans and return error when the count of table scan != 1. +func (p *PhysicalTableReader) GetTableScan() (*PhysicalTableScan, error) { + tableScans := p.GetTableScans() + if len(tableScans) != 1 { + return nil, errors.New("the count of table scan != 1") + } + return tableScans[0], nil } // GetPhysicalTableReader returns PhysicalTableReader for logical TiKVSingleGather. @@ -476,8 +478,6 @@ type PhysicalTableScan struct { StoreType kv.StoreType - IsGlobalRead bool - // The table scan may be a partition, rather than a real table. // TODO: clean up this field. After we support dynamic partitioning, table scan // works on the whole partition table, and `isPartition` is not used. @@ -770,9 +770,8 @@ type PhysicalHashJoin struct { UseOuterToBuild bool // on which store the join executes. - storeTp kv.StoreType - globalChildIndex int - mppShuffleJoin bool + storeTp kv.StoreType + mppShuffleJoin bool } // Clone implements PhysicalPlan interface. diff --git a/planner/core/plan_to_pb.go b/planner/core/plan_to_pb.go index cbd40d0c52b22..ad5e24efbc24f 100644 --- a/planner/core/plan_to_pb.go +++ b/planner/core/plan_to_pb.go @@ -16,7 +16,6 @@ package core import ( "github.com/pingcap/errors" - "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/kv" @@ -183,17 +182,6 @@ func (p *PhysicalTableScan) ToPB(ctx sessionctx.Context, storeType kv.StoreType) tsExec.TableId = p.physicalTableID } executorID := "" - if storeType == kv.TiFlash && p.IsGlobalRead { - tsExec.NextReadEngine = tipb.EngineType_TiFlash - splitedRanges, _ := distsql.SplitRangesAcrossInt64Boundary(p.Ranges, false, false, p.Table.IsCommonHandle) - ranges, err := distsql.TableHandleRangesToKVRanges(ctx.GetSessionVars().StmtCtx, []int64{tsExec.TableId}, p.Table.IsCommonHandle, splitedRanges, nil) - if err != nil { - return nil, err - } - for _, keyRange := range ranges { - tsExec.Ranges = append(tsExec.Ranges, tipb.KeyRange{Low: keyRange.StartKey, High: keyRange.EndKey}) - } - } if storeType == kv.TiFlash { executorID = p.ExplainID().String() } diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 1bd2d8d40133b..765f5228f478f 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -86,17 +86,16 @@ type indexNestedLoopJoinTables struct { type tableHintInfo struct { indexNestedLoopJoinTables - sortMergeJoinTables []hintTableInfo - broadcastJoinTables []hintTableInfo - broadcastJoinPreferredLocal []hintTableInfo - hashJoinTables []hintTableInfo - indexHintList []indexHintInfo - tiflashTables []hintTableInfo - tikvTables []hintTableInfo - aggHints aggHintInfo - indexMergeHintList []indexHintInfo - timeRangeHint ast.HintTimeRange - limitHints limitHintInfo + sortMergeJoinTables []hintTableInfo + broadcastJoinTables []hintTableInfo + hashJoinTables []hintTableInfo + indexHintList []indexHintInfo + tiflashTables []hintTableInfo + tikvTables []hintTableInfo + aggHints aggHintInfo + indexMergeHintList []indexHintInfo + timeRangeHint ast.HintTimeRange + limitHints limitHintInfo } type limitHintInfo struct { @@ -198,22 +197,6 @@ func tableNames2HintTableInfo(ctx sessionctx.Context, hintName string, hintTable return hintTableInfos } -// ifPreferAsLocalInBCJoin checks if there is a data source specified as local read by hint -func (info *tableHintInfo) ifPreferAsLocalInBCJoin(p LogicalPlan, blockOffset int) bool { - alias := extractTableAlias(p, blockOffset) - if alias != nil { - tableNames := make([]*hintTableInfo, 1) - tableNames[0] = alias - return info.matchTableName(tableNames, info.broadcastJoinPreferredLocal) - } - for _, c := range p.Children() { - if info.ifPreferAsLocalInBCJoin(c, blockOffset) { - return true - } - } - return false -} - func (info *tableHintInfo) ifPreferMergeJoin(tableNames ...*hintTableInfo) bool { return info.matchTableName(tableNames, info.sortMergeJoinTables) } @@ -1015,8 +998,8 @@ func isPrimaryIndex(indexName model.CIStr) bool { return indexName.L == "primary" } -func genTiFlashPath(tblInfo *model.TableInfo, isGlobalRead bool) *util.AccessPath { - tiFlashPath := &util.AccessPath{StoreType: kv.TiFlash, IsTiFlashGlobalRead: isGlobalRead} +func genTiFlashPath(tblInfo *model.TableInfo) *util.AccessPath { + tiFlashPath := &util.AccessPath{StoreType: kv.TiFlash} fillContentForTablePath(tiFlashPath, tblInfo) return tiFlashPath } @@ -1084,8 +1067,7 @@ func getPossibleAccessPaths(ctx sessionctx.Context, tableHints *tableHintInfo, i } else if !tblInfo.TiFlashReplica.Available { ctx.GetSessionVars().RaiseWarningWhenMPPEnforced("MPP mode may be blocked because tiflash replicas of table `" + tblInfo.Name.O + "` not ready.") } else { - publicPaths = append(publicPaths, genTiFlashPath(tblInfo, false)) - publicPaths = append(publicPaths, genTiFlashPath(tblInfo, true)) + publicPaths = append(publicPaths, genTiFlashPath(tblInfo)) } optimizerUseInvisibleIndexes := ctx.GetSessionVars().OptimizerUseInvisibleIndexes diff --git a/planner/core/planbuilder_test.go b/planner/core/planbuilder_test.go index f7b501a334258..5ff2084947170 100644 --- a/planner/core/planbuilder_test.go +++ b/planner/core/planbuilder_test.go @@ -85,8 +85,7 @@ func TestGetPathByIndexName(t *testing.T) { accessPath := []*util.AccessPath{ {IsIntHandlePath: true}, {Index: &model.IndexInfo{Name: model.NewCIStr("idx")}}, - genTiFlashPath(tblInfo, false), - genTiFlashPath(tblInfo, true), + genTiFlashPath(tblInfo), } path := getPathByIndexName(accessPath, model.NewCIStr("idx"), tblInfo) diff --git a/planner/core/testdata/enforce_mpp_suite_out.json b/planner/core/testdata/enforce_mpp_suite_out.json index 931c98c72d415..7be8cedd7b8f4 100644 --- a/planner/core/testdata/enforce_mpp_suite_out.json +++ b/planner/core/testdata/enforce_mpp_suite_out.json @@ -457,10 +457,10 @@ "SQL": "EXPLAIN SELECT /*+ MERGE_JOIN(t,s) */ * from t join s using(a); -- 1. hint use MERGE_JOIN", "Plan": [ "MergeJoin_8 12500.00 root inner join, left key:test.t.a, right key:test.s.a", - "├─TableReader_19(Build) 10000.00 root data:TableFullScan_18", - "│ └─TableFullScan_18 10000.00 cop[tiflash] table:s keep order:true, stats:pseudo", - "└─TableReader_15(Probe) 10000.00 root data:TableFullScan_14", - " └─TableFullScan_14 10000.00 cop[tiflash] table:t keep order:true, stats:pseudo" + "├─TableReader_18(Build) 10000.00 root data:TableFullScan_17", + "│ └─TableFullScan_17 10000.00 cop[tiflash] table:s keep order:true, stats:pseudo", + "└─TableReader_14(Probe) 10000.00 root data:TableFullScan_13", + " └─TableFullScan_13 10000.00 cop[tiflash] table:t keep order:true, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because you have used hint to specify a join algorithm which is not supported by mpp now.", @@ -470,11 +470,11 @@ { "SQL": "EXPLAIN SELECT /*+ INL_JOIN(t,s) */ * from t, s where t.a=s.a; -- 2. hint use INL_JOIN", "Plan": [ - "IndexJoin_16 12500.00 root inner join, inner:TableReader_13, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a)", - "├─TableReader_33(Build) 10000.00 root data:TableFullScan_32", - "│ └─TableFullScan_32 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", - "└─TableReader_13(Probe) 1.00 root data:TableRangeScan_12", - " └─TableRangeScan_12 1.00 cop[tikv] table:s range: decided by [test.t.a], keep order:false, stats:pseudo" + "IndexJoin_15 12500.00 root inner join, inner:TableReader_12, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a)", + "├─TableReader_32(Build) 10000.00 root data:TableFullScan_31", + "│ └─TableFullScan_31 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + "└─TableReader_12(Probe) 1.00 root data:TableRangeScan_11", + " └─TableRangeScan_11 1.00 cop[tikv] table:s range: decided by [test.t.a], keep order:false, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because you have used hint to specify a join algorithm which is not supported by mpp now.", @@ -484,11 +484,11 @@ { "SQL": "EXPLAIN SELECT /*+ INL_HASH_JOIN(t,s) */ * from t join s using(a); -- 3. hint use INL_HASH_JOIN", "Plan": [ - "IndexHashJoin_17 12500.00 root inner join, inner:TableReader_12, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a)", - "├─TableReader_32(Build) 10000.00 root data:TableFullScan_31", - "│ └─TableFullScan_31 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", - "└─TableReader_12(Probe) 1.00 root data:TableRangeScan_11", - " └─TableRangeScan_11 1.00 cop[tikv] table:s range: decided by [test.t.a], keep order:false, stats:pseudo" + "IndexHashJoin_16 12500.00 root inner join, inner:TableReader_11, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a)", + "├─TableReader_31(Build) 10000.00 root data:TableFullScan_30", + "│ └─TableFullScan_30 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + "└─TableReader_11(Probe) 1.00 root data:TableRangeScan_10", + " └─TableRangeScan_10 1.00 cop[tikv] table:s range: decided by [test.t.a], keep order:false, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because you have used hint to specify a join algorithm which is not supported by mpp now.", @@ -498,11 +498,11 @@ { "SQL": "EXPLAIN SELECT /*+ HASH_JOIN(t,s) */ * from t join s using(a); -- 4. hint use INL_JOIN", "Plan": [ - "HashJoin_29 12500.00 root inner join, equal:[eq(test.t.a, test.s.a)]", - "├─TableReader_38(Build) 10000.00 root data:TableFullScan_37", - "│ └─TableFullScan_37 10000.00 cop[tiflash] table:s keep order:false, stats:pseudo", - "└─TableReader_34(Probe) 10000.00 root data:TableFullScan_33", - " └─TableFullScan_33 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "HashJoin_28 12500.00 root inner join, equal:[eq(test.t.a, test.s.a)]", + "├─TableReader_37(Build) 10000.00 root data:TableFullScan_36", + "│ └─TableFullScan_36 10000.00 cop[tiflash] table:s keep order:false, stats:pseudo", + "└─TableReader_33(Probe) 10000.00 root data:TableFullScan_32", + " └─TableFullScan_32 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because you have used hint to specify a join algorithm which is not supported by mpp now.", @@ -591,30 +591,30 @@ { "SQL": "explain select a from t where t.a>1 or t.a in (select a from t); -- 7. left outer semi join", "Plan": [ - "TableReader_49 8000.00 root data:ExchangeSender_48", - "└─ExchangeSender_48 8000.00 cop[tiflash] ExchangeType: PassThrough", + "TableReader_48 8000.00 root data:ExchangeSender_47", + "└─ExchangeSender_47 8000.00 cop[tiflash] ExchangeType: PassThrough", " └─Projection_8 8000.00 cop[tiflash] test.t.a", - " └─Selection_46 8000.00 cop[tiflash] or(gt(test.t.a, 1), Column#3)", - " └─HashJoin_47 10000.00 cop[tiflash] left outer semi join, equal:[eq(test.t.a, test.t.a)]", - " ├─ExchangeReceiver_27(Build) 10000.00 cop[tiflash] ", - " │ └─ExchangeSender_26 10000.00 cop[tiflash] ExchangeType: Broadcast", - " │ └─TableFullScan_25 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", - " └─TableFullScan_24(Probe) 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + " └─Selection_45 8000.00 cop[tiflash] or(gt(test.t.a, 1), Column#3)", + " └─HashJoin_46 10000.00 cop[tiflash] left outer semi join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver_26(Build) 10000.00 cop[tiflash] ", + " │ └─ExchangeSender_25 10000.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─TableFullScan_24 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─TableFullScan_23(Probe) 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, { "SQL": "explain select a from t where t.a>1 or t.a not in (select a from t); -- now it's supported -- 8. anti left outer semi join", "Plan": [ - "TableReader_49 8000.00 root data:ExchangeSender_48", - "└─ExchangeSender_48 8000.00 cop[tiflash] ExchangeType: PassThrough", + "TableReader_48 8000.00 root data:ExchangeSender_47", + "└─ExchangeSender_47 8000.00 cop[tiflash] ExchangeType: PassThrough", " └─Projection_8 8000.00 cop[tiflash] test.t.a", - " └─Selection_46 8000.00 cop[tiflash] or(gt(test.t.a, 1), Column#3)", - " └─HashJoin_47 10000.00 cop[tiflash] anti left outer semi join, equal:[eq(test.t.a, test.t.a)]", - " ├─ExchangeReceiver_27(Build) 10000.00 cop[tiflash] ", - " │ └─ExchangeSender_26 10000.00 cop[tiflash] ExchangeType: Broadcast", - " │ └─TableFullScan_25 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", - " └─TableFullScan_24(Probe) 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + " └─Selection_45 8000.00 cop[tiflash] or(gt(test.t.a, 1), Column#3)", + " └─HashJoin_46 10000.00 cop[tiflash] anti left outer semi join, equal:[eq(test.t.a, test.t.a)]", + " ├─ExchangeReceiver_26(Build) 10000.00 cop[tiflash] ", + " │ └─ExchangeSender_25 10000.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─TableFullScan_24 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─TableFullScan_23(Probe) 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, @@ -622,10 +622,10 @@ "SQL": "explain select a from t where t.a not in (select a from s where t.a<1); -- 9. non left join has left conditions", "Plan": [ "MergeJoin_10 8000.00 root anti semi join, left key:test.t.a, right key:test.s.a, left cond:[lt(test.t.a, 1)]", - "├─TableReader_30(Build) 10000.00 root data:TableFullScan_29", - "│ └─TableFullScan_29 10000.00 cop[tiflash] table:s keep order:true, stats:pseudo", - "└─TableReader_26(Probe) 10000.00 root data:TableFullScan_25", - " └─TableFullScan_25 10000.00 cop[tiflash] table:t keep order:true, stats:pseudo" + "├─TableReader_29(Build) 10000.00 root data:TableFullScan_28", + "│ └─TableFullScan_28 10000.00 cop[tiflash] table:s keep order:true, stats:pseudo", + "└─TableReader_25(Probe) 10000.00 root data:TableFullScan_24", + " └─TableFullScan_24 10000.00 cop[tiflash] table:t keep order:true, stats:pseudo" ], "Warn": [ "MPP mode may be blocked because there is a join that is not `left join` but has left conditions, which is not supported by mpp now, see github.com/pingcap/tidb/issues/26090 for more information.", diff --git a/planner/core/testdata/integration_suite_out.json b/planner/core/testdata/integration_suite_out.json index 099c4a31efabf..e7f322c89a10c 100644 --- a/planner/core/testdata/integration_suite_out.json +++ b/planner/core/testdata/integration_suite_out.json @@ -2443,16 +2443,16 @@ { "SQL": "explain format = 'verbose' select count(*) from t1 join t2 on t1.a = t2.a", "Plan": [ - "StreamAgg_12 1.00 18.93 root funcs:count(1)->Column#7", - "└─TableReader_45 3.00 9.93 root data:ExchangeSender_44", - " └─ExchangeSender_44 3.00 235.38 cop[tiflash] ExchangeType: PassThrough", - " └─HashJoin_41 3.00 235.38 cop[tiflash] inner join, equal:[eq(test.t1.a, test.t2.a)]", - " ├─ExchangeReceiver_20(Build) 3.00 77.00 cop[tiflash] ", - " │ └─ExchangeSender_19 3.00 77.00 cop[tiflash] ExchangeType: Broadcast", - " │ └─Selection_18 3.00 74.00 cop[tiflash] not(isnull(test.t1.a))", - " │ └─TableFullScan_17 3.00 65.00 cop[tiflash] table:t1 keep order:false", - " └─Selection_22(Probe) 3.00 74.00 cop[tiflash] not(isnull(test.t2.a))", - " └─TableFullScan_21 3.00 65.00 cop[tiflash] table:t2 keep order:false" + "StreamAgg_14 1.00 18.93 root funcs:count(1)->Column#7", + "└─TableReader_46 3.00 9.93 root data:ExchangeSender_45", + " └─ExchangeSender_45 3.00 235.38 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin_42 3.00 235.38 cop[tiflash] inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─ExchangeReceiver_21(Build) 3.00 77.00 cop[tiflash] ", + " │ └─ExchangeSender_20 3.00 77.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection_19 3.00 74.00 cop[tiflash] not(isnull(test.t1.a))", + " │ └─TableFullScan_18 3.00 65.00 cop[tiflash] table:t1 keep order:false", + " └─Selection_23(Probe) 3.00 74.00 cop[tiflash] not(isnull(test.t2.a))", + " └─TableFullScan_22 3.00 65.00 cop[tiflash] table:t2 keep order:false" ] }, { @@ -2497,16 +2497,16 @@ { "SQL": "explain format = 'verbose' select /*+ merge_join(t1) */ count(*) from t1 join t2 on t1.a = t2.a", "Plan": [ - "StreamAgg_11 1.00 59.65 root funcs:count(1)->Column#7", - "└─MergeJoin_30 3.00 50.65 root inner join, left key:test.t1.a, right key:test.t2.a", - " ├─Sort_28(Build) 3.00 20.83 root test.t2.a", - " │ └─TableReader_27 3.00 6.56 root data:Selection_26", - " │ └─Selection_26 3.00 74.00 cop[tiflash] not(isnull(test.t2.a))", - " │ └─TableFullScan_25 3.00 65.00 cop[tiflash] table:t2 keep order:false", - " └─Sort_21(Probe) 3.00 20.83 root test.t1.a", - " └─TableReader_20 3.00 6.56 root data:Selection_19", - " └─Selection_19 3.00 74.00 cop[tiflash] not(isnull(test.t1.a))", - " └─TableFullScan_18 3.00 65.00 cop[tiflash] table:t1 keep order:false" + "StreamAgg_13 1.00 59.65 root funcs:count(1)->Column#7", + "└─MergeJoin_31 3.00 50.65 root inner join, left key:test.t1.a, right key:test.t2.a", + " ├─Sort_29(Build) 3.00 20.83 root test.t2.a", + " │ └─TableReader_28 3.00 6.56 root data:Selection_27", + " │ └─Selection_27 3.00 74.00 cop[tiflash] not(isnull(test.t2.a))", + " │ └─TableFullScan_26 3.00 65.00 cop[tiflash] table:t2 keep order:false", + " └─Sort_22(Probe) 3.00 20.83 root test.t1.a", + " └─TableReader_21 3.00 6.56 root data:Selection_20", + " └─Selection_20 3.00 74.00 cop[tiflash] not(isnull(test.t1.a))", + " └─TableFullScan_19 3.00 65.00 cop[tiflash] table:t1 keep order:false" ] } ] @@ -4346,8 +4346,8 @@ "Plan": [ "HashAgg 1.00 root funcs:count(Column#8)->Column#6", "└─TableReader 1.00 root data:HashAgg", - " └─HashAgg 1.00 batchCop[tiflash] funcs:count(Column#10)->Column#8", - " └─Projection 10000.00 batchCop[tiflash] plus(test.t.id, 1)->Column#10", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(Column#9)->Column#8", + " └─Projection 10000.00 batchCop[tiflash] plus(test.t.id, 1)->Column#9", " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, @@ -4365,8 +4365,8 @@ "Plan": [ "HashAgg 1.00 root funcs:sum(Column#8)->Column#6", "└─TableReader 1.00 root data:HashAgg", - " └─HashAgg 1.00 batchCop[tiflash] funcs:sum(Column#10)->Column#8", - " └─Projection 10000.00 batchCop[tiflash] cast(plus(test.t.id, 1), decimal(20,0) BINARY)->Column#10", + " └─HashAgg 1.00 batchCop[tiflash] funcs:sum(Column#9)->Column#8", + " └─Projection 10000.00 batchCop[tiflash] cast(plus(test.t.id, 1), decimal(20,0) BINARY)->Column#9", " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, @@ -4402,12 +4402,13 @@ { "SQL": "desc format = 'brief' select * from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", "Plan": [ - "TableReader 10000.00 root data:HashJoin", - "└─HashJoin 10000.00 cop[tiflash] inner join, equal:[eq(Column#5, Column#10)]", - " ├─Projection(Build) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#5", - " │ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", - " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", - " └─Projection(Probe) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#10", + "HashJoin 10000.00 root inner join, equal:[eq(Column#5, Column#10)]", + "├─Projection(Build) 8000.00 root minus(test.t.id, 2)->Column#10", + "│ └─TableReader 8000.00 root data:Selection", + "│ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + "│ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + "└─Projection(Probe) 8000.00 root minus(test.t.id, 2)->Column#5", + " └─TableReader 8000.00 root data:Selection", " └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ] @@ -4415,34 +4416,37 @@ { "SQL": "desc format = 'brief' select * from t join (select id-2 as b from t) A on A.b=t.id", "Plan": [ - "TableReader 10000.00 root data:HashJoin", - "└─HashJoin 10000.00 cop[tiflash] inner join, equal:[eq(test.t.id, Column#9)]", - " ├─Projection(Build) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#9", - " │ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", - " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", - " └─Selection(Probe) 9990.00 cop[tiflash] not(isnull(test.t.id))", + "HashJoin 10000.00 root inner join, equal:[eq(test.t.id, Column#9)]", + "├─Projection(Build) 8000.00 root minus(test.t.id, 2)->Column#9", + "│ └─TableReader 8000.00 root data:Selection", + "│ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + "│ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tiflash] not(isnull(test.t.id))", " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ] }, { "SQL": "desc format = 'brief' select * from t left join (select id-2 as b from t) A on A.b=t.id", "Plan": [ - "TableReader 10000.00 root data:HashJoin", - "└─HashJoin 10000.00 cop[tiflash] left outer join, equal:[eq(test.t.id, Column#9)]", - " ├─Projection(Build) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#9", - " │ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", - " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", - " └─TableFullScan(Probe) 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "HashJoin 10000.00 root left outer join, equal:[eq(test.t.id, Column#9)]", + "├─Projection(Build) 8000.00 root minus(test.t.id, 2)->Column#9", + "│ └─TableReader 8000.00 root data:Selection", + "│ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + "│ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ] }, { "SQL": "desc format = 'brief' select * from t right join (select id-2 as b from t) A on A.b=t.id", "Plan": [ - "TableReader 12487.50 root data:HashJoin", - "└─HashJoin 12487.50 cop[tiflash] right outer join, equal:[eq(test.t.id, Column#9)]", - " ├─Selection(Build) 9990.00 cop[tiflash] not(isnull(test.t.id))", - " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", - " └─Projection(Probe) 10000.00 cop[tiflash] minus(test.t.id, 2)->Column#9", + "HashJoin 12487.50 root right outer join, equal:[eq(test.t.id, Column#9)]", + "├─TableReader(Build) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tiflash] not(isnull(test.t.id))", + "│ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + "└─Projection(Probe) 10000.00 root minus(test.t.id, 2)->Column#9", + " └─TableReader 10000.00 root data:TableFullScan", " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ] }, @@ -4450,12 +4454,13 @@ "SQL": "desc format = 'brief' select A.b, B.b from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", "Plan": [ "Projection 10000.00 root Column#10, Column#5", - "└─TableReader 10000.00 root data:HashJoin", - " └─HashJoin 10000.00 cop[tiflash] inner join, equal:[eq(Column#5, Column#10)]", - " ├─Projection(Build) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#5", - " │ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", - " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", - " └─Projection(Probe) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#10", + "└─HashJoin 10000.00 root inner join, equal:[eq(Column#5, Column#10)]", + " ├─Projection(Build) 8000.00 root minus(test.t.id, 2)->Column#10", + " │ └─TableReader 8000.00 root data:Selection", + " │ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection(Probe) 8000.00 root minus(test.t.id, 2)->Column#5", + " └─TableReader 8000.00 root data:Selection", " └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ] @@ -4463,21 +4468,23 @@ { "SQL": "desc format = 'brief' select A.id from t as A where exists (select 1 from t where t.id=A.id)", "Plan": [ - "TableReader 7992.00 root data:HashJoin", - "└─HashJoin 7992.00 cop[tiflash] semi join, equal:[eq(test.t.id, test.t.id)]", - " ├─Selection(Build) 9990.00 cop[tiflash] not(isnull(test.t.id))", - " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", - " └─Selection(Probe) 9990.00 cop[tiflash] not(isnull(test.t.id))", + "HashJoin 7992.00 root semi join, equal:[eq(test.t.id, test.t.id)]", + "├─TableReader(Build) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tiflash] not(isnull(test.t.id))", + "│ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tiflash] not(isnull(test.t.id))", " └─TableFullScan 10000.00 cop[tiflash] table:A keep order:false, stats:pseudo" ] }, { "SQL": "desc format = 'brief' select A.id from t as A where not exists (select 1 from t where t.id=A.id)", "Plan": [ - "TableReader 8000.00 root data:HashJoin", - "└─HashJoin 8000.00 cop[tiflash] anti semi join, equal:[eq(test.t.id, test.t.id)]", - " ├─TableFullScan(Build) 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", - " └─TableFullScan(Probe) 10000.00 cop[tiflash] table:A keep order:false, stats:pseudo" + "HashJoin 8000.00 root anti semi join, equal:[eq(test.t.id, test.t.id)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:A keep order:false, stats:pseudo" ] }, { @@ -4695,13 +4702,13 @@ "Plan": [ "HashAgg 1.00 root funcs:count(Column#12)->Column#11", "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 cop[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 cop[tiflash] funcs:count(1)->Column#12", - " └─Union 20000.00 cop[tiflash] ", - " ├─Projection 10000.00 cop[tiflash] cast(test.t.a, int(11) BINARY)->Column#9, test.t.b", - " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", - " └─Projection 10000.00 cop[tiflash] test.t1.a, cast(test.t1.b, int(11) BINARY)->Column#10", - " └─TableFullScan 10000.00 cop[tiflash] table:t1 keep order:false, stats:pseudo" + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─Union 20000.00 batchCop[tiflash] ", + " ├─Projection 10000.00 batchCop[tiflash] cast(test.t.a, int(11) BINARY)->Column#9, test.t.b", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection 10000.00 batchCop[tiflash] test.t1.a, cast(test.t1.b, int(11) BINARY)->Column#10", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t1 keep order:false, stats:pseudo" ] }, { @@ -4709,13 +4716,13 @@ "Plan": [ "HashAgg 1.00 root funcs:count(Column#16)->Column#15", "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 cop[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 cop[tiflash] funcs:count(1)->Column#16", - " └─Union 20000.00 cop[tiflash] ", - " ├─Projection 10000.00 cop[tiflash] cast(test.t.a, int(11) BINARY)->Column#13, test.t.b", - " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", - " └─Projection 10000.00 cop[tiflash] test.t1.a, cast(test.t1.b, int(11) BINARY)->Column#14", - " └─TableFullScan 10000.00 cop[tiflash] table:t1 keep order:false, stats:pseudo" + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#16", + " └─Union 20000.00 batchCop[tiflash] ", + " ├─Projection 10000.00 batchCop[tiflash] cast(test.t.a, int(11) BINARY)->Column#13, test.t.b", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection 10000.00 batchCop[tiflash] test.t1.a, cast(test.t1.b, int(11) BINARY)->Column#14", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t1 keep order:false, stats:pseudo" ] }, { @@ -4723,14 +4730,14 @@ "Plan": [ "HashAgg 1.00 root funcs:count(Column#14)->Column#11", "└─TableReader 1.00 root data:ExchangeSender", - " └─ExchangeSender 1.00 cop[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 cop[tiflash] funcs:count(1)->Column#14", - " └─Union 20000.00 cop[tiflash] ", - " ├─Projection 10000.00 cop[tiflash] cast(Column#9, int(11) BINARY)->Column#9, Column#10", - " │ └─Projection 10000.00 cop[tiflash] test.t.a, cast(test.t.b, double BINARY)->Column#10", - " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", - " └─Projection 10000.00 cop[tiflash] test.t1.a, cast(test.t1.c, double BINARY)->Column#10", - " └─TableFullScan 10000.00 cop[tiflash] table:t1 keep order:false, stats:pseudo" + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#14", + " └─Union 20000.00 batchCop[tiflash] ", + " ├─Projection 10000.00 batchCop[tiflash] cast(Column#9, int(11) BINARY)->Column#9, Column#10", + " │ └─Projection 10000.00 batchCop[tiflash] test.t.a, cast(test.t.b, double BINARY)->Column#10", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection 10000.00 batchCop[tiflash] test.t1.a, cast(test.t1.c, double BINARY)->Column#10", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t1 keep order:false, stats:pseudo" ] }, { @@ -5061,15 +5068,15 @@ { "SQL": "desc format = 'brief' select /*+hash_agg()*/ sum(b) from (select avg(value) as b, id from t group by id)A", "Plan": [ - "HashAgg 1.00 root funcs:sum(Column#20)->Column#5", + "HashAgg 1.00 root funcs:sum(Column#18)->Column#5", "└─TableReader 1.00 root data:ExchangeSender", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 batchCop[tiflash] funcs:sum(Column#4)->Column#20", - " └─Projection 8000.00 batchCop[tiflash] div(Column#4, cast(case(eq(Column#17, 0), 1, Column#17), decimal(20,0) BINARY))->Column#4", - " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#18)->Column#17, funcs:sum(Column#19)->Column#4", + " └─HashAgg 1.00 batchCop[tiflash] funcs:sum(Column#4)->Column#18", + " └─Projection 8000.00 batchCop[tiflash] div(Column#4, cast(case(eq(Column#15, 0), 1, Column#15), decimal(20,0) BINARY))->Column#4", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#16)->Column#15, funcs:sum(Column#17)->Column#4", " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.id, collate: binary]", - " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#18, funcs:sum(test.t.value)->Column#19", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#16, funcs:sum(test.t.value)->Column#17", " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, @@ -5231,8 +5238,8 @@ "TableReader 6400.00 root data:ExchangeSender", "└─ExchangeSender 6400.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 6400.00 batchCop[tiflash] Column#4", - " └─HashAgg 6400.00 batchCop[tiflash] group by:Column#22, funcs:sum(Column#21)->Column#4", - " └─Projection 6400.00 batchCop[tiflash] cast(test.t.id, decimal(10,0) BINARY)->Column#21, test.t.value", + " └─HashAgg 6400.00 batchCop[tiflash] group by:Column#20, funcs:sum(Column#19)->Column#4", + " └─Projection 6400.00 batchCop[tiflash] cast(test.t.id, decimal(10,0) BINARY)->Column#19, test.t.value", " └─Projection 6400.00 batchCop[tiflash] test.t.id, test.t.value", " └─HashAgg 6400.00 batchCop[tiflash] group by:test.t.id, test.t.value, funcs:firstrow(test.t.id)->test.t.id, funcs:firstrow(test.t.value)->test.t.value", " └─ExchangeReceiver 6400.00 batchCop[tiflash] ", @@ -5786,11 +5793,11 @@ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5, Column#6, Column#7", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#14, Column#15, Column#16 order by Column#17 separator \",\")->Column#5, funcs:sum(Column#18)->Column#6, funcs:max(Column#19)->Column#7", - " └─Projection 1.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#16, test.ts.col_0, Column#12, Column#13", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#12, Column#13, Column#14 order by Column#15 separator \",\")->Column#5, funcs:sum(Column#16)->Column#6, funcs:max(Column#17)->Column#7", + " └─Projection 1.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#14, test.ts.col_0, Column#10, Column#11", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 batchCop[tiflash] group by:test.ts.col_0, test.ts.col_1, test.ts.id, funcs:count(1)->Column#12, funcs:max(test.ts.col_0)->Column#13", + " └─HashAgg 1.00 batchCop[tiflash] group by:test.ts.col_0, test.ts.col_1, test.ts.id, funcs:count(1)->Column#10, funcs:max(test.ts.col_0)->Column#11", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -5918,13 +5925,13 @@ "Plan": [ "TableReader 8000.00 root data:ExchangeSender", "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─Projection 8000.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#24, 0), 1, Column#24), decimal(20,0) BINARY))->Column#8", - " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#44, funcs:group_concat(distinct Column#36, Column#37, Column#38 order by Column#39 separator \",\")->Column#5, funcs:sum(Column#40)->Column#6, funcs:max(Column#41)->Column#7, funcs:sum(Column#42)->Column#24, funcs:sum(Column#43)->Column#8", - " └─Projection 8000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#38, test.ts.col_0, Column#25, Column#26, Column#27, Column#28, test.ts.col_2", + " └─Projection 8000.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#20, 0), 1, Column#20), decimal(20,0) BINARY))->Column#8", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#40, funcs:group_concat(distinct Column#32, Column#33, Column#34 order by Column#35 separator \",\")->Column#5, funcs:sum(Column#36)->Column#6, funcs:max(Column#37)->Column#7, funcs:sum(Column#38)->Column#20, funcs:sum(Column#39)->Column#8", + " └─Projection 8000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#34, test.ts.col_0, Column#21, Column#22, Column#23, Column#24, test.ts.col_2", " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", - " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#32, Column#33, Column#34, Column#35, funcs:count(1)->Column#25, funcs:max(Column#29)->Column#26, funcs:count(Column#30)->Column#27, funcs:sum(Column#31)->Column#28", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#31, test.ts.col_2, test.ts.col_0, test.ts.col_1, test.ts.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#28, Column#29, Column#30, Column#31, funcs:count(1)->Column#21, funcs:max(Column#25)->Column#22, funcs:count(Column#26)->Column#23, funcs:sum(Column#27)->Column#24", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#27, test.ts.col_2, test.ts.col_0, test.ts.col_1, test.ts.id", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -5952,13 +5959,13 @@ "Plan": [ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─Projection 1.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#18, 0), 1, Column#18), decimal(20,0) BINARY))->Column#8", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#30, Column#31, Column#32 order by Column#33 separator \",\")->Column#5, funcs:sum(Column#34)->Column#6, funcs:max(Column#35)->Column#7, funcs:sum(Column#36)->Column#18, funcs:sum(Column#37)->Column#8", - " └─Projection 1.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#32, test.ts.col_0, Column#19, Column#20, Column#21, Column#22", + " └─Projection 1.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#14, 0), 1, Column#14), decimal(20,0) BINARY))->Column#8", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#26, Column#27, Column#28 order by Column#29 separator \",\")->Column#5, funcs:sum(Column#30)->Column#6, funcs:max(Column#31)->Column#7, funcs:sum(Column#32)->Column#14, funcs:sum(Column#33)->Column#8", + " └─Projection 1.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#28, test.ts.col_0, Column#15, Column#16, Column#17, Column#18", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 batchCop[tiflash] group by:Column#27, Column#28, Column#29, funcs:count(Column#23)->Column#19, funcs:max(Column#24)->Column#20, funcs:count(Column#25)->Column#21, funcs:sum(Column#26)->Column#22", - " └─Projection 10000.00 batchCop[tiflash] test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#26, test.ts.col_0, test.ts.col_1, test.ts.id", + " └─HashAgg 1.00 batchCop[tiflash] group by:Column#23, Column#24, Column#25, funcs:count(Column#19)->Column#15, funcs:max(Column#20)->Column#16, funcs:count(Column#21)->Column#17, funcs:sum(Column#22)->Column#18", + " └─Projection 10000.00 batchCop[tiflash] test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#22, test.ts.col_0, test.ts.col_1, test.ts.id", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -5987,13 +5994,13 @@ "Plan": [ "TableReader 8000.00 root data:ExchangeSender", "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─Projection 8000.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#24, 0), 1, Column#24), decimal(20,0) BINARY))->Column#8", - " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#44, funcs:group_concat(distinct Column#37, Column#38, Column#39 separator \",\")->Column#5, funcs:sum(Column#40)->Column#6, funcs:max(Column#41)->Column#7, funcs:sum(Column#42)->Column#24, funcs:sum(Column#43)->Column#8", - " └─Projection 8000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#39, Column#25, Column#26, Column#27, Column#28, test.ts.col_2", + " └─Projection 8000.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#20, 0), 1, Column#20), decimal(20,0) BINARY))->Column#8", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#40, funcs:group_concat(distinct Column#33, Column#34, Column#35 separator \",\")->Column#5, funcs:sum(Column#36)->Column#6, funcs:max(Column#37)->Column#7, funcs:sum(Column#38)->Column#20, funcs:sum(Column#39)->Column#8", + " └─Projection 8000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#35, Column#21, Column#22, Column#23, Column#24, test.ts.col_2", " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", - " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#33, Column#34, Column#35, Column#36, funcs:count(Column#29)->Column#25, funcs:max(Column#30)->Column#26, funcs:count(Column#31)->Column#27, funcs:sum(Column#32)->Column#28", - " └─Projection 10000.00 batchCop[tiflash] test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#32, test.ts.col_2, test.ts.col_0, test.ts.col_1, test.ts.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#29, Column#30, Column#31, Column#32, funcs:count(Column#25)->Column#21, funcs:max(Column#26)->Column#22, funcs:count(Column#27)->Column#23, funcs:sum(Column#28)->Column#24", + " └─Projection 10000.00 batchCop[tiflash] test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#28, test.ts.col_2, test.ts.col_0, test.ts.col_1, test.ts.id", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -6019,13 +6026,13 @@ "Plan": [ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─Projection 1.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#18, 0), 1, Column#18), decimal(20,0) BINARY))->Column#8", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#30, Column#31, Column#32 separator \",\")->Column#5, funcs:sum(Column#33)->Column#6, funcs:max(Column#34)->Column#7, funcs:sum(Column#35)->Column#18, funcs:sum(Column#36)->Column#8", - " └─Projection 1.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#32, Column#19, Column#20, Column#21, Column#22", + " └─Projection 1.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#14, 0), 1, Column#14), decimal(20,0) BINARY))->Column#8", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#26, Column#27, Column#28 separator \",\")->Column#5, funcs:sum(Column#29)->Column#6, funcs:max(Column#30)->Column#7, funcs:sum(Column#31)->Column#14, funcs:sum(Column#32)->Column#8", + " └─Projection 1.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#28, Column#15, Column#16, Column#17, Column#18", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 batchCop[tiflash] group by:Column#27, Column#28, Column#29, funcs:count(Column#23)->Column#19, funcs:max(Column#24)->Column#20, funcs:count(Column#25)->Column#21, funcs:sum(Column#26)->Column#22", - " └─Projection 10000.00 batchCop[tiflash] test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#26, test.ts.col_0, test.ts.col_1, test.ts.id", + " └─HashAgg 1.00 batchCop[tiflash] group by:Column#23, Column#24, Column#25, funcs:count(Column#19)->Column#15, funcs:max(Column#20)->Column#16, funcs:count(Column#21)->Column#17, funcs:sum(Column#22)->Column#18", + " └─Projection 10000.00 batchCop[tiflash] test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#22, test.ts.col_0, test.ts.col_1, test.ts.id", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -6053,9 +6060,9 @@ "Plan": [ "TableReader 8000.00 root data:ExchangeSender", "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─Projection 8000.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#14, 0), 1, Column#14), decimal(20,0) BINARY))->Column#8", - " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#25, funcs:group_concat(distinct Column#17 separator \",\")->Column#5, funcs:count(Column#18)->Column#6, funcs:group_concat(Column#19, Column#20 order by Column#21, Column#22 separator \",\")->Column#7, funcs:count(Column#23)->Column#14, funcs:sum(Column#24)->Column#8", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.id, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#20, test.ts.col_1, test.ts.id, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#24, test.ts.col_2", + " └─Projection 8000.00 batchCop[tiflash] Column#5, Column#6, Column#7, div(Column#8, cast(case(eq(Column#13, 0), 1, Column#13), decimal(20,0) BINARY))->Column#8", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#24, funcs:group_concat(distinct Column#16 separator \",\")->Column#5, funcs:count(Column#17)->Column#6, funcs:group_concat(Column#18, Column#19 order by Column#20, Column#21 separator \",\")->Column#7, funcs:count(Column#22)->Column#13, funcs:sum(Column#23)->Column#8", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.id, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#19, test.ts.col_1, test.ts.id, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#23, test.ts.col_2", " └─ExchangeReceiver 10000.00 batchCop[tiflash] ", " └─ExchangeSender 10000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_2, collate: utf8mb4_bin]", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" @@ -6085,9 +6092,9 @@ "Plan": [ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─Projection 1.00 batchCop[tiflash] Column#5, Column#6, Column#7, Column#8, div(Column#9, cast(case(eq(Column#13, 0), 1, Column#13), decimal(20,0) BINARY))->Column#9", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#15, Column#16, Column#17 separator \",\")->Column#5, funcs:count(Column#18)->Column#6, funcs:group_concat(Column#19, Column#20 order by Column#21, Column#22 separator \",\")->Column#7, funcs:max(Column#23)->Column#8, funcs:count(Column#24)->Column#13, funcs:sum(Column#25)->Column#9", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#17, test.ts.id, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#20, test.ts.col_1, test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#25", + " └─Projection 1.00 batchCop[tiflash] Column#5, Column#6, Column#7, Column#8, div(Column#9, cast(case(eq(Column#12, 0), 1, Column#12), decimal(20,0) BINARY))->Column#9", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#14, Column#15, Column#16 separator \",\")->Column#5, funcs:count(Column#17)->Column#6, funcs:group_concat(Column#18, Column#19 order by Column#20, Column#21 separator \",\")->Column#7, funcs:max(Column#22)->Column#8, funcs:count(Column#23)->Column#12, funcs:sum(Column#24)->Column#9", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#16, test.ts.id, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#19, test.ts.col_1, test.ts.id, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#24", " └─ExchangeReceiver 10000.00 batchCop[tiflash] ", " └─ExchangeSender 10000.00 batchCop[tiflash] ExchangeType: PassThrough", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" @@ -6101,13 +6108,13 @@ "Plan": [ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─Projection 1.00 batchCop[tiflash] Column#5, Column#6, Column#7, Column#8, div(Column#9, cast(case(eq(Column#19, 0), 1, Column#19), decimal(20,0) BINARY))->Column#9", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#33, Column#34, Column#35 separator \",\")->Column#5, funcs:count(distinct Column#36)->Column#6, funcs:group_concat(Column#37 separator \",\")->Column#7, funcs:max(Column#38)->Column#8, funcs:sum(Column#39)->Column#19, funcs:sum(Column#40)->Column#9", - " └─Projection 1.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#35, test.ts.col_2, Column#20, Column#21, Column#22, Column#23", + " └─Projection 1.00 batchCop[tiflash] Column#5, Column#6, Column#7, Column#8, div(Column#9, cast(case(eq(Column#15, 0), 1, Column#15), decimal(20,0) BINARY))->Column#9", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#29, Column#30, Column#31 separator \",\")->Column#5, funcs:count(distinct Column#32)->Column#6, funcs:group_concat(Column#33 separator \",\")->Column#7, funcs:max(Column#34)->Column#8, funcs:sum(Column#35)->Column#15, funcs:sum(Column#36)->Column#9", + " └─Projection 1.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#31, test.ts.col_2, Column#16, Column#17, Column#18, Column#19", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 batchCop[tiflash] group by:Column#29, Column#30, Column#31, Column#32, funcs:group_concat(Column#24, Column#25 separator \",\")->Column#20, funcs:max(Column#26)->Column#21, funcs:count(Column#27)->Column#22, funcs:sum(Column#28)->Column#23", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_1, cast(test.ts.id, var_string(20))->Column#25, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#28, test.ts.col_0, test.ts.col_1, test.ts.id, test.ts.col_2", + " └─HashAgg 1.00 batchCop[tiflash] group by:Column#25, Column#26, Column#27, Column#28, funcs:group_concat(Column#20, Column#21 separator \",\")->Column#16, funcs:max(Column#22)->Column#17, funcs:count(Column#23)->Column#18, funcs:sum(Column#24)->Column#19", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_1, cast(test.ts.id, var_string(20))->Column#21, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#24, test.ts.col_0, test.ts.col_1, test.ts.id, test.ts.col_2", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -6119,13 +6126,13 @@ "Plan": [ "TableReader 8000.00 root data:ExchangeSender", "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─Projection 8000.00 batchCop[tiflash] Column#5, Column#6, Column#7, Column#8, div(Column#9, cast(case(eq(Column#25, 0), 1, Column#25), decimal(20,0) BINARY))->Column#9", - " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#47, funcs:group_concat(distinct Column#39, Column#40, Column#41 separator \",\")->Column#5, funcs:count(distinct Column#42)->Column#6, funcs:group_concat(Column#43 separator \",\")->Column#7, funcs:max(Column#44)->Column#8, funcs:sum(Column#45)->Column#25, funcs:sum(Column#46)->Column#9", - " └─Projection 8000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#41, test.ts.col_2, Column#26, Column#27, Column#28, Column#29, test.ts.col_0", + " └─Projection 8000.00 batchCop[tiflash] Column#5, Column#6, Column#7, Column#8, div(Column#9, cast(case(eq(Column#21, 0), 1, Column#21), decimal(20,0) BINARY))->Column#9", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#43, funcs:group_concat(distinct Column#35, Column#36, Column#37 separator \",\")->Column#5, funcs:count(distinct Column#38)->Column#6, funcs:group_concat(Column#39 separator \",\")->Column#7, funcs:max(Column#40)->Column#8, funcs:sum(Column#41)->Column#21, funcs:sum(Column#42)->Column#9", + " └─Projection 8000.00 batchCop[tiflash] test.ts.col_0, test.ts.col_1, cast(test.ts.id, var_string(20))->Column#37, test.ts.col_2, Column#22, Column#23, Column#24, Column#25, test.ts.col_0", " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_0, collate: utf8mb4_bin]", - " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#35, Column#36, Column#37, Column#38, funcs:group_concat(Column#30, Column#31 separator \",\")->Column#26, funcs:max(Column#32)->Column#27, funcs:count(Column#33)->Column#28, funcs:sum(Column#34)->Column#29", - " └─Projection 10000.00 batchCop[tiflash] test.ts.col_1, cast(test.ts.id, var_string(20))->Column#31, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#34, test.ts.col_0, test.ts.col_1, test.ts.id, test.ts.col_2", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#31, Column#32, Column#33, Column#34, funcs:group_concat(Column#26, Column#27 separator \",\")->Column#22, funcs:max(Column#28)->Column#23, funcs:count(Column#29)->Column#24, funcs:sum(Column#30)->Column#25", + " └─Projection 10000.00 batchCop[tiflash] test.ts.col_1, cast(test.ts.id, var_string(20))->Column#27, test.ts.col_1, test.ts.id, cast(test.ts.id, decimal(14,4) BINARY)->Column#30, test.ts.col_0, test.ts.col_1, test.ts.id, test.ts.col_2", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -6138,8 +6145,8 @@ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#12, Column#13 separator \",\")->Column#5", - " └─Projection 1.00 batchCop[tiflash] cast(Column#10, var_string(20))->Column#12, Column#11", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#10, Column#11 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#8, var_string(20))->Column#10, Column#9", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:\"GG\", 0, ", @@ -6148,7 +6155,6 @@ "Warning": [ "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable", "[types:1292]Truncated incorrect DOUBLE value: 'GG'", - "[types:1292]Truncated incorrect DOUBLE value: 'GG'", "[types:1292]Truncated incorrect DOUBLE value: 'GG'" ] }, @@ -6158,8 +6164,8 @@ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#12, Column#13 separator \",\")->Column#5", - " └─Projection 1.00 batchCop[tiflash] cast(Column#10, var_string(20))->Column#12, Column#11", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#10, Column#11 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#8, var_string(20))->Column#10, Column#9", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:\"01\", 0, ", @@ -6175,8 +6181,8 @@ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#12, Column#13 separator \",\")->Column#5", - " └─Projection 1.00 batchCop[tiflash] cast(Column#10, var_string(20))->Column#12, cast(Column#11, var_string(20))->Column#13", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#10, Column#11 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#8, var_string(20))->Column#10, cast(Column#9, var_string(20))->Column#11", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:0, 1, ", @@ -6192,8 +6198,8 @@ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#9, Column#10 separator \",\")->Column#5", - " └─Projection 1.00 batchCop[tiflash] cast(Column#8, var_string(20))->Column#9, cast(Column#8, var_string(20))->Column#10", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#8, Column#9 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#7, var_string(20))->Column#8, cast(Column#7, var_string(20))->Column#9", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:0, ", @@ -6209,10 +6215,10 @@ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5", - " └─HashAgg 1.00 batchCop[tiflash] group by:Column#20, funcs:group_concat(distinct Column#18, Column#19 separator \",\")->Column#5", - " └─Projection 1.00 batchCop[tiflash] cast(Column#16, var_string(20))->Column#18, cast(Column#17, var_string(20))->Column#19, Column#15", + " └─HashAgg 1.00 batchCop[tiflash] group by:Column#17, funcs:group_concat(distinct Column#15, Column#16 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#13, var_string(20))->Column#15, cast(Column#14, var_string(20))->Column#16, Column#12", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", - " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#15, collate: binary]", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#12, collate: binary]", " └─HashAgg 1.00 batchCop[tiflash] group by:0, 1, 10, ", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" ], @@ -6226,10 +6232,10 @@ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5", - " └─HashAgg 1.00 batchCop[tiflash] group by:Column#16, funcs:group_concat(distinct Column#14, Column#15 separator \",\")->Column#5", - " └─Projection 1.00 batchCop[tiflash] cast(Column#13, var_string(20))->Column#14, cast(Column#13, var_string(20))->Column#15, Column#12", + " └─HashAgg 1.00 batchCop[tiflash] group by:Column#14, funcs:group_concat(distinct Column#12, Column#13 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#11, var_string(20))->Column#12, cast(Column#11, var_string(20))->Column#13, Column#10", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", - " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#12, collate: binary]", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#10, collate: binary]", " └─HashAgg 1.00 batchCop[tiflash] group by:0, 1, ", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" ], @@ -6243,10 +6249,10 @@ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5", - " └─HashAgg 1.00 batchCop[tiflash] group by:Column#20, funcs:group_concat(distinct Column#18, Column#19 separator \",\")->Column#5", - " └─Projection 1.00 batchCop[tiflash] cast(Column#16, var_string(20))->Column#18, Column#17, Column#15", + " └─HashAgg 1.00 batchCop[tiflash] group by:Column#17, funcs:group_concat(distinct Column#15, Column#16 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] cast(Column#13, var_string(20))->Column#15, Column#14, Column#12", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", - " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#15, collate: binary]", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: Column#12, collate: binary]", " └─HashAgg 1.00 batchCop[tiflash] group by:\"GG\", 0, 1, ", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" ], @@ -6257,8 +6263,6 @@ "[types:1292]Truncated incorrect DOUBLE value: 'GG'", "[types:1292]Truncated incorrect DOUBLE value: 'GG'", "[types:1292]Truncated incorrect DOUBLE value: 'GG'", - "[types:1292]Truncated incorrect DOUBLE value: 'GG'", - "[types:1292]Truncated incorrect DOUBLE value: 'GG'", "[types:1292]Truncated incorrect DOUBLE value: 'GG'" ] }, @@ -6268,7 +6272,7 @@ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#8, Column#8 separator \",\")->Column#5", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#7, Column#7 separator \",\")->Column#5", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:\"GG\", ", @@ -6284,7 +6288,7 @@ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#10, Column#11 separator \",\")->Column#5", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#8, Column#9 separator \",\")->Column#5", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:\"GG\", \"Gg\", ", @@ -6300,7 +6304,7 @@ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#10, Column#11 separator \",\")->Column#5", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#8, Column#9 separator \",\")->Column#5", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:\"GG\", \"GG-10\", ", @@ -6316,8 +6320,8 @@ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#12, Column#13 separator \",\")->Column#5", - " └─Projection 1.00 batchCop[tiflash] Column#10, cast(Column#11, var_string(20))->Column#13", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct Column#10, Column#11 separator \",\")->Column#5", + " └─Projection 1.00 batchCop[tiflash] Column#8, cast(Column#9, var_string(20))->Column#11", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─HashAgg 1.00 batchCop[tiflash] group by:\"1200-01-01 00:00:00.023\", 1200, ", @@ -6326,7 +6330,6 @@ "Warning": [ "[planner:1815]Optimizer Hint AGG_TO_COP is inapplicable", "[types:1292]Truncated incorrect DOUBLE value: '1200-01-01 00:00:00.023'", - "[types:1292]Truncated incorrect DOUBLE value: '1200-01-01 00:00:00.023'", "[types:1292]Truncated incorrect DOUBLE value: '1200-01-01 00:00:00.023'" ] }, @@ -6369,11 +6372,11 @@ "TableReader 1.00 root data:ExchangeSender", "└─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 1.00 batchCop[tiflash] Column#5", - " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct test.ts.col_0 order by Column#8 separator \",\")->Column#5", + " └─HashAgg 1.00 batchCop[tiflash] funcs:group_concat(distinct test.ts.col_0 order by Column#7 separator \",\")->Column#5", " └─ExchangeReceiver 1.00 batchCop[tiflash] ", " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", - " └─HashAgg 1.00 batchCop[tiflash] group by:Column#10, funcs:firstrow(Column#9)->Column#8", - " └─Projection 10000.00 batchCop[tiflash] lt(test.ts.id, 10)->Column#9, test.ts.col_0", + " └─HashAgg 1.00 batchCop[tiflash] group by:Column#9, funcs:firstrow(Column#8)->Column#7", + " └─Projection 10000.00 batchCop[tiflash] lt(test.ts.id, 10)->Column#8, test.ts.col_0", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -6386,11 +6389,11 @@ "TableReader 8000.00 root data:ExchangeSender", "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 batchCop[tiflash] Column#5", - " └─HashAgg 8000.00 batchCop[tiflash] group by:test.ts.col_1, funcs:group_concat(distinct test.ts.col_0 order by Column#9 separator \",\")->Column#5", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.ts.col_1, funcs:group_concat(distinct test.ts.col_0 order by Column#8 separator \",\")->Column#5", " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_1, collate: utf8mb4_bin]", - " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#11, Column#12, funcs:firstrow(Column#10)->Column#9", - " └─Projection 10000.00 batchCop[tiflash] lt(test.ts.id, 10)->Column#10, test.ts.col_1, test.ts.col_0", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#10, Column#11, funcs:firstrow(Column#9)->Column#8", + " └─Projection 10000.00 batchCop[tiflash] lt(test.ts.id, 10)->Column#9, test.ts.col_1, test.ts.col_0", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -6403,12 +6406,12 @@ "TableReader 8000.00 root data:ExchangeSender", "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", " └─Projection 8000.00 batchCop[tiflash] Column#5", - " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#19, funcs:group_concat(distinct Column#17 order by Column#18 separator \",\")->Column#5", - " └─Projection 8000.00 batchCop[tiflash] cast(Column#12, var_string(20))->Column#17, Column#13, test.ts.col_1", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#17, funcs:group_concat(distinct Column#15 order by Column#16 separator \",\")->Column#5", + " └─Projection 8000.00 batchCop[tiflash] cast(Column#10, var_string(20))->Column#15, Column#11, test.ts.col_1", " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.ts.col_1, collate: utf8mb4_bin]", - " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#15, Column#16, funcs:firstrow(Column#14)->Column#13", - " └─Projection 10000.00 batchCop[tiflash] lt(test.ts.id, 10)->Column#14, test.ts.col_1, gt(cast(test.ts.col_0, double BINARY), 10)->Column#16", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#13, Column#14, funcs:firstrow(Column#12)->Column#11", + " └─Projection 10000.00 batchCop[tiflash] lt(test.ts.id, 10)->Column#12, test.ts.col_1, gt(cast(test.ts.col_0, double BINARY), 10)->Column#14", " └─TableFullScan 10000.00 batchCop[tiflash] table:ts keep order:false, stats:pseudo" ], "Warning": [ @@ -6428,8 +6431,6 @@ "Scalar function 'nulleq'(signature: NullEQString, return type: bigint(1)) is not supported to push down to tiflash now.", "Aggregation can not be pushed to tiflash because arguments of AggFunc `group_concat` contains unsupported exprs in order-by clause", "Scalar function 'nulleq'(signature: NullEQString, return type: bigint(1)) is not supported to push down to tiflash now.", - "Aggregation can not be pushed to tiflash because arguments of AggFunc `group_concat` contains unsupported exprs in order-by clause", - "Scalar function 'nulleq'(signature: NullEQString, return type: bigint(1)) is not supported to push down to tiflash now.", "Aggregation can not be pushed to tiflash because arguments of AggFunc `group_concat` contains unsupported exprs in order-by clause" ] } @@ -6536,19 +6537,19 @@ "SQL": "desc format = 'brief' select * from ((select count(*) from (select id,name from t order by id)a group by name,id order by id) union all (select id+1 from t order by 1))c", "Plan": [ "TableReader 18000.00 root data:ExchangeSender", - "└─ExchangeSender 18000.00 cop[tiflash] ExchangeType: PassThrough", - " └─Union 18000.00 cop[tiflash] ", - " ├─Projection 8000.00 cop[tiflash] cast(Column#12, bigint(21) BINARY)->Column#12", - " │ └─Projection 8000.00 cop[tiflash] Column#5", - " │ └─Projection 8000.00 cop[tiflash] Column#5, test.t.id", - " │ └─HashAgg 8000.00 cop[tiflash] group by:test.t.id, test.t.name, funcs:sum(Column#19)->Column#5, funcs:firstrow(test.t.id)->test.t.id", - " │ └─ExchangeReceiver 8000.00 cop[tiflash] ", - " │ └─ExchangeSender 8000.00 cop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.name, collate: utf8mb4_bin], [name: test.t.id, collate: binary]", - " │ └─HashAgg 8000.00 cop[tiflash] group by:test.t.id, test.t.name, funcs:count(1)->Column#19", - " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", - " └─Projection 10000.00 cop[tiflash] cast(Column#11, bigint(21) BINARY)->Column#12", - " └─Projection 10000.00 cop[tiflash] plus(test.t.id, 1)->Column#11", - " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "└─ExchangeSender 18000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Union 18000.00 batchCop[tiflash] ", + " ├─Projection 8000.00 batchCop[tiflash] cast(Column#12, bigint(21) BINARY)->Column#12", + " │ └─Projection 8000.00 batchCop[tiflash] Column#5", + " │ └─Projection 8000.00 batchCop[tiflash] Column#5, test.t.id", + " │ └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, test.t.name, funcs:sum(Column#19)->Column#5, funcs:firstrow(test.t.id)->test.t.id", + " │ └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " │ └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: [name: test.t.name, collate: utf8mb4_bin], [name: test.t.id, collate: binary]", + " │ └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, test.t.name, funcs:count(1)->Column#19", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection 10000.00 batchCop[tiflash] cast(Column#11, bigint(21) BINARY)->Column#12", + " └─Projection 10000.00 batchCop[tiflash] plus(test.t.id, 1)->Column#11", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, { diff --git a/planner/property/physical_property.go b/planner/property/physical_property.go index 1b15a965eb245..04c91fe664bbd 100644 --- a/planner/property/physical_property.go +++ b/planner/property/physical_property.go @@ -224,7 +224,7 @@ func (p *PhysicalProperty) AllColsFromSchema(schema *expression.Schema) bool { // IsFlashProp return true if this physical property is only allowed to generate flash related task func (p *PhysicalProperty) IsFlashProp() bool { - return p.TaskTp == CopTiFlashLocalReadTaskType || p.TaskTp == CopTiFlashGlobalReadTaskType || p.TaskTp == MppTaskType + return p.TaskTp == MppTaskType } // GetAllPossibleChildTaskTypes enumrates the possible types of tasks for children. diff --git a/planner/property/task_type.go b/planner/property/task_type.go index 1bc825795ed5f..a4c16d4a51d2e 100644 --- a/planner/property/task_type.go +++ b/planner/property/task_type.go @@ -29,17 +29,6 @@ const ( // coprocessor layer. CopDoubleReadTaskType - // CopTiFlashLocalReadTaskType stands for flash coprocessor that read data locally, - // and only a part of the data is read in one cop task, if the current task type is - // CopTiFlashLocalReadTaskType, all its children prop's task type is CopTiFlashLocalReadTaskType - CopTiFlashLocalReadTaskType - - // CopTiFlashGlobalReadTaskType stands for flash coprocessor that read data globally - // and all the data of given table will be read in one cop task, if the current task - // type is CopTiFlashGlobalReadTaskType, all its children prop's task type is - // CopTiFlashGlobalReadTaskType - CopTiFlashGlobalReadTaskType - // MppTaskType stands for task that would run on Mpp nodes, currently meaning the tiflash node. MppTaskType ) @@ -53,10 +42,6 @@ func (t TaskType) String() string { return "copSingleReadTask" case CopDoubleReadTaskType: return "copDoubleReadTask" - case CopTiFlashLocalReadTaskType: - return "copTiFlashLocalReadTask" - case CopTiFlashGlobalReadTaskType: - return "copTiFlashGlobalReadTask" case MppTaskType: return "mppTask" } diff --git a/planner/util/path.go b/planner/util/path.go index a25d8a0696034..0c0783926ff28 100644 --- a/planner/util/path.go +++ b/planner/util/path.go @@ -54,9 +54,6 @@ type AccessPath struct { IsDNFCond bool - // IsTiFlashGlobalRead indicates whether this path is a remote read path for tiflash - IsTiFlashGlobalRead bool - // IsIntHandlePath indicates whether this path is table path. IsIntHandlePath bool IsCommonHandlePath bool diff --git a/sessionctx/variable/removed.go b/sessionctx/variable/removed.go index 33bf0f81acdd4..fbaae51b04a40 100644 --- a/sessionctx/variable/removed.go +++ b/sessionctx/variable/removed.go @@ -33,6 +33,7 @@ const ( tiDBSlowLogMasking = "tidb_slow_log_masking" placementChecks = "placement_checks" tiDBEnableStreaming = "tidb_enable_streaming" + tiDBOptBCJ = "tidb_opt_broadcast_join" ) var removedSysVars = map[string]string{ @@ -47,6 +48,7 @@ var removedSysVars = map[string]string{ tiDBMemQuotaIndexLookupReader: "use tidb_mem_quota_query instead", tiDBMemQuotaIndexLookupJoin: "use tidb_mem_quota_query instead", tiDBEnableStreaming: "streaming is no longer supported", + tiDBOptBCJ: "tidb_opt_broadcast_join is removed and use tidb_allow_mpp instead", } // IsRemovedSysVar returns true if the sysvar has been removed diff --git a/sessionctx/variable/session.go b/sessionctx/variable/session.go index 3852c1e22c7d7..9342235d4acfd 100644 --- a/sessionctx/variable/session.go +++ b/sessionctx/variable/session.go @@ -582,9 +582,6 @@ type SessionVars struct { // AllowAggPushDown can be set to false to forbid aggregation push down. AllowAggPushDown bool - // AllowBCJ means allow broadcast join. - AllowBCJ bool - // AllowCartesianBCJ means allow broadcast CARTESIAN join, 0 means not allow, 1 means allow broadcast CARTESIAN join // but the table size should under the broadcast threshold, 2 means allow broadcast CARTESIAN join even if the table // size exceeds the broadcast threshold @@ -1171,7 +1168,6 @@ func NewSessionVars() *SessionVars { Status: mysql.ServerStatusAutocommit, StmtCtx: new(stmtctx.StatementContext), AllowAggPushDown: false, - AllowBCJ: false, AllowCartesianBCJ: DefOptCartesianBCJ, MPPOuterJoinFixedBuildSide: DefOptMPPOuterJoinFixedBuildSide, BroadcastJoinThresholdSize: DefBroadcastJoinThresholdSize, diff --git a/sessionctx/variable/sysvar.go b/sessionctx/variable/sysvar.go index 29dc39df3efaf..cded5acef2dc8 100644 --- a/sessionctx/variable/sysvar.go +++ b/sessionctx/variable/sysvar.go @@ -347,15 +347,6 @@ var defaultSysVars = []*SysVar{ s.AllowAggPushDown = TiDBOptOn(val) return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptBCJ, Value: BoolToOnOff(DefOptBCJ), Type: TypeBool, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { - if TiDBOptOn(normalizedValue) && vars.AllowBatchCop == 0 { - return normalizedValue, ErrWrongValueForVar.GenWithStackByArgs(TiDBOptBCJ, "'true' while tidb_allow_batch_cop is 0, please active batch cop at first.") - } - return normalizedValue, nil - }, SetSession: func(s *SessionVars, val string) error { - s.AllowBCJ = TiDBOptOn(val) - return nil - }}, {Scope: ScopeSession, Name: TiDBOptDistinctAggPushDown, Value: BoolToOnOff(config.GetGlobalConfig().Performance.DistinctAggPushDown), skipInit: true, Type: TypeBool, SetSession: func(s *SessionVars, val string) error { s.AllowDistinctAggPushDown = TiDBOptOn(val) return nil @@ -517,12 +508,7 @@ var defaultSysVars = []*SysVar{ s.MaxChunkSize = tidbOptPositiveInt32(val, DefMaxChunkSize) return nil }}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBAllowBatchCop, Value: strconv.Itoa(DefTiDBAllowBatchCop), Type: TypeInt, MinValue: 0, MaxValue: 2, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { - if normalizedValue == "0" && vars.AllowBCJ { - return normalizedValue, ErrWrongValueForVar.GenWithStackByArgs(TiDBAllowBatchCop, "'0' while tidb_opt_broadcast_join is true, please set tidb_opt_broadcast_join false at first") - } - return normalizedValue, nil - }, SetSession: func(s *SessionVars, val string) error { + {Scope: ScopeGlobal | ScopeSession, Name: TiDBAllowBatchCop, Value: strconv.Itoa(DefTiDBAllowBatchCop), Type: TypeInt, MinValue: 0, MaxValue: 2, SetSession: func(s *SessionVars, val string) error { s.AllowBatchCop = int(TidbOptInt64(val, DefTiDBAllowBatchCop)) return nil }}, diff --git a/sessionctx/variable/tidb_vars.go b/sessionctx/variable/tidb_vars.go index 808175b4156af..fd7489d36d7b0 100644 --- a/sessionctx/variable/tidb_vars.go +++ b/sessionctx/variable/tidb_vars.go @@ -41,9 +41,6 @@ const ( // TiDBOptAggPushDown is used to enable/disable the optimizer rule of aggregation push down. TiDBOptAggPushDown = "tidb_opt_agg_push_down" - // TiDBOptBCJ is used to enable/disable broadcast join in MPP mode - TiDBOptBCJ = "tidb_opt_broadcast_join" - // TiDBOptCartesianBCJ is used to disable/enable broadcast cartesian join in MPP mode TiDBOptCartesianBCJ = "tidb_opt_broadcast_cartesian_join" @@ -665,7 +662,6 @@ const ( DefSkipUTF8Check = false DefSkipASCIICheck = false DefOptAggPushDown = false - DefOptBCJ = false DefOptCartesianBCJ = 1 DefOptMPPOuterJoinFixedBuildSide = false DefOptWriteRowID = false diff --git a/sessionctx/variable/varsutil_test.go b/sessionctx/variable/varsutil_test.go index 9131c2889fcb7..b6d6554f89ee2 100644 --- a/sessionctx/variable/varsutil_test.go +++ b/sessionctx/variable/varsutil_test.go @@ -63,7 +63,6 @@ func TestNewSessionVars(t *testing.T) { require.Equal(t, DefExecutorConcurrency, vars.IndexLookupJoinConcurrency()) require.Equal(t, DefExecutorConcurrency, vars.HashJoinConcurrency()) require.Equal(t, DefTiDBAllowBatchCop, vars.AllowBatchCop) - require.Equal(t, DefOptBCJ, vars.AllowBCJ) require.Equal(t, ConcurrencyUnset, vars.projectionConcurrency) require.Equal(t, ConcurrencyUnset, vars.hashAggPartialConcurrency) require.Equal(t, ConcurrencyUnset, vars.hashAggFinalConcurrency) @@ -202,17 +201,6 @@ func TestVarsutil(t *testing.T) { require.Equal(t, mode, v.SQLMode) } - err = SetSessionSystemVar(v, "tidb_opt_broadcast_join", "1") - require.NoError(t, err) - err = SetSessionSystemVar(v, "tidb_allow_batch_cop", "0") - require.True(t, terror.ErrorEqual(err, ErrWrongValueForVar)) - err = SetSessionSystemVar(v, "tidb_opt_broadcast_join", "0") - require.NoError(t, err) - err = SetSessionSystemVar(v, "tidb_allow_batch_cop", "0") - require.NoError(t, err) - err = SetSessionSystemVar(v, "tidb_opt_broadcast_join", "1") - require.True(t, terror.ErrorEqual(err, ErrWrongValueForVar)) - // Combined sql_mode err = SetSessionSystemVar(v, "sql_mode", "REAL_AS_FLOAT,ANSI_QUOTES") require.NoError(t, err) diff --git a/tidb-server/main.go b/tidb-server/main.go index e28f494b6abd2..bfde6a2c7156d 100644 --- a/tidb-server/main.go +++ b/tidb-server/main.go @@ -67,6 +67,7 @@ import ( storageSys "github.com/pingcap/tidb/util/sys/storage" "github.com/pingcap/tidb/util/systimemon" "github.com/pingcap/tidb/util/topsql" + "github.com/pingcap/tidb/util/versioninfo" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/push" "github.com/tikv/client-go/v2/tikv" @@ -168,13 +169,14 @@ func main() { flag.Usage() os.Exit(0) } + config.InitializeConfig(*configPath, *configCheck, *configStrict, overrideConfig) if *version { + setVersions() fmt.Println(printer.GetTiDBInfo()) os.Exit(0) } registerStores() registerMetrics() - config.InitializeConfig(*configPath, *configCheck, *configStrict, overrideConfig) if config.GetGlobalConfig().OOMUseTmpStorage { config.GetGlobalConfig().UpdateTempStoragePath() err := disk.InitializeTempDir() @@ -530,6 +532,19 @@ func overrideConfig(cfg *config.Config) { } } +func setVersions() { + cfg := config.GetGlobalConfig() + if len(cfg.ServerVersion) > 0 { + mysql.ServerVersion = cfg.ServerVersion + } + if len(cfg.TiDBEdition) > 0 { + versioninfo.TiDBEdition = cfg.TiDBEdition + } + if len(cfg.TiDBReleaseVersion) > 0 { + mysql.TiDBReleaseVersion = cfg.TiDBReleaseVersion + } +} + func setGlobalVars() { cfg := config.GetGlobalConfig() @@ -577,6 +592,17 @@ func setGlobalVars() { variable.SetSysVar(variable.Version, cfg.ServerVersion) } + if len(cfg.TiDBEdition) > 0 { + versioninfo.TiDBEdition = cfg.TiDBEdition + variable.SetSysVar(variable.VersionComment, "TiDB Server (Apache License 2.0) "+versioninfo.TiDBEdition+" Edition, MySQL 5.7 compatible") + } + if len(cfg.VersionComment) > 0 { + variable.SetSysVar(variable.VersionComment, cfg.VersionComment) + } + if len(cfg.TiDBReleaseVersion) > 0 { + mysql.TiDBReleaseVersion = cfg.TiDBReleaseVersion + } + variable.SetSysVar(variable.TiDBForcePriority, mysql.Priority2Str[priority]) variable.SetSysVar(variable.TiDBOptDistinctAggPushDown, variable.BoolToOnOff(cfg.Performance.DistinctAggPushDown)) variable.SetSysVar(variable.TiDBMemQuotaQuery, strconv.FormatInt(cfg.MemQuotaQuery, 10))