diff --git a/pkg/planner/core/find_best_task.go b/pkg/planner/core/find_best_task.go index e5f6798e46bc0..dd19f6e2d0ed4 100644 --- a/pkg/planner/core/find_best_task.go +++ b/pkg/planner/core/find_best_task.go @@ -1084,12 +1084,7 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter } ds.storeTask(prop, t) - if ds.SampleInfo != nil && !t.invalid() { - if _, ok := t.plan().(*PhysicalTableSample); !ok { - warning := expression.ErrInvalidTableSample.GenWithStackByArgs("plan not supported") - ds.SCtx().GetSessionVars().StmtCtx.AppendWarning(warning) - } - } + err = validateTableSamplePlan(ds, t, err) }() t, err = ds.tryToGetDualTask() @@ -2243,10 +2238,8 @@ func (ds *DataSource) convertToSampleTable(prop *property.PhysicalProperty, return invalidTask, nil } if candidate.isMatchProp { - // TableSample on partition table can't keep order. - if ds.tableInfo.GetPartitionInfo() != nil { - return invalidTask, nil - } + // Disable keep order property for sample table path. + return invalidTask, nil } p := PhysicalTableSample{ TableSampleInfo: ds.SampleInfo, @@ -2618,3 +2611,15 @@ func pushDownNot(ctx sessionctx.Context, conds []expression.Expression) []expres } return conds } + +func validateTableSamplePlan(ds *DataSource, t task, err error) error { + if err != nil { + return err + } + if ds.SampleInfo != nil && !t.invalid() { + if _, ok := t.plan().(*PhysicalTableSample); !ok { + return expression.ErrInvalidTableSample.GenWithStackByArgs("plan not supported") + } + } + return nil +} diff --git a/tests/integrationtest/r/executor/sample.result b/tests/integrationtest/r/executor/sample.result index 9c9ec8e3f1985..e972ee61e2a0b 100644 --- a/tests/integrationtest/r/executor/sample.result +++ b/tests/integrationtest/r/executor/sample.result @@ -178,12 +178,14 @@ a 2100 4500 select a from t use index (idx_0) tablesample regions() order by a; -a -1000 -1001 -2100 -4500 -show warnings; -Level Code Message -Warning 8128 Invalid TABLESAMPLE: plan not supported +Error 8128 (HY000): Invalid TABLESAMPLE: plan not supported +DROP TABLE IF EXISTS a; +CREATE TABLE a (pk bigint unsigned primary key clustered, v text); +INSERT INTO a WITH RECURSIVE b(pk) AS (SELECT 1 UNION ALL SELECT pk+1 FROM b WHERE pk < 1000) SELECT pk, 'a' FROM b; +INSERT INTO a WITH RECURSIVE b(pk) AS (SELECT 1 UNION ALL SELECT pk+1 FROM b WHERE pk < 1000) SELECT pk + (1<<63), 'b' FROM b; +SPLIT TABLE a BY (500); +SELECT * FROM a TABLESAMPLE REGIONS() ORDER BY pk; +pk v +500 a +9223372036854775809 b set @@global.tidb_scatter_region=default; diff --git a/tests/integrationtest/t/executor/sample.test b/tests/integrationtest/t/executor/sample.test index 723163b0d1d94..ffaad378bd920 100644 --- a/tests/integrationtest/t/executor/sample.test +++ b/tests/integrationtest/t/executor/sample.test @@ -119,7 +119,15 @@ split table t between (0) and (10000) regions 5; insert into t values (1000, 1, '1'), (1001, 1, '1'), (2100, 2, '2'), (4500, 3, '3'); create index idx_0 on t (b); select a from t tablesample regions() order by a; +-- error 8128 select a from t use index (idx_0) tablesample regions() order by a; -show warnings; + +# TestTableSampleUnsignedIntHandle +DROP TABLE IF EXISTS a; +CREATE TABLE a (pk bigint unsigned primary key clustered, v text); +INSERT INTO a WITH RECURSIVE b(pk) AS (SELECT 1 UNION ALL SELECT pk+1 FROM b WHERE pk < 1000) SELECT pk, 'a' FROM b; +INSERT INTO a WITH RECURSIVE b(pk) AS (SELECT 1 UNION ALL SELECT pk+1 FROM b WHERE pk < 1000) SELECT pk + (1<<63), 'b' FROM b; +SPLIT TABLE a BY (500); +SELECT * FROM a TABLESAMPLE REGIONS() ORDER BY pk; set @@global.tidb_scatter_region=default;