diff --git a/pkg/executor/sample_test.go b/pkg/executor/sample_test.go index 4a2a110f35367..781eb7b36c030 100644 --- a/pkg/executor/sample_test.go +++ b/pkg/executor/sample_test.go @@ -264,9 +264,17 @@ func TestTableSampleNotSupportedPlanWarning(t *testing.T) { tk.MustExec("create index idx_0 on t (b);") tk.MustQuery("select a from t tablesample regions() order by a;").Check( testkit.Rows("1000", "2100", "4500")) - tk.MustQuery("select a from t use index (idx_0) tablesample regions() order by a;").Check( - testkit.Rows("1000", "1001", "2100", "4500")) - tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 8128 Invalid TABLESAMPLE: plan not supported")) + tk.MustGetErrCode("select a from t use index (idx_0) tablesample regions() order by a;", errno.ErrInvalidTableSample) +} + +func TestTableSampleUnsignedIntHandle(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := createSampleTestkit(t, store) + tk.MustExec("CREATE TABLE a (pk bigint unsigned primary key clustered, v text);") + tk.MustExec("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;") + tk.MustExec("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;") + tk.MustQuery("SPLIT TABLE a BY (500);").Check(testkit.Rows("1 1")) + tk.MustQuery("SELECT * FROM a TABLESAMPLE REGIONS() ORDER BY pk;").Check(testkit.Rows("500 a", "9223372036854775809 b")) } func TestMaxChunkSize(t *testing.T) { 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 +}