Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
Signed-off-by: Weizhen Wang <wangweizhen@pingcap.com>
  • Loading branch information
hawkingrei committed Jan 26, 2024
1 parent de177d8 commit 858a0de
Show file tree
Hide file tree
Showing 108 changed files with 797 additions and 739 deletions.
5 changes: 5 additions & 0 deletions errors.toml
Original file line number Diff line number Diff line change
Expand Up @@ -1971,6 +1971,11 @@ error = '''
Division by 0
'''

["expression:1426"]
error = '''
Too big precision %d specified for column '%-.192s'. Maximum is %d.
'''

["expression:1582"]
error = '''
Incorrect parameter count in the call to native function '%-.192s'
Expand Down
2 changes: 1 addition & 1 deletion pkg/ddl/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,6 @@ go_test(
"//pkg/parser/mysql",
"//pkg/parser/terror",
"//pkg/parser/types",
"//pkg/planner/core",
"//pkg/server",
"//pkg/session",
"//pkg/session/types",
Expand All @@ -307,6 +306,7 @@ go_test(
"//pkg/util/codec",
"//pkg/util/collate",
"//pkg/util/dbterror",
"//pkg/util/dbterror/plannererrors",
"//pkg/util/domainutil",
"//pkg/util/gcutil",
"//pkg/util/logutil",
Expand Down
20 changes: 10 additions & 10 deletions pkg/ddl/db_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ import (
"github.com/pingcap/tidb/pkg/parser/model"
"github.com/pingcap/tidb/pkg/parser/mysql"
"github.com/pingcap/tidb/pkg/parser/terror"
"github.com/pingcap/tidb/pkg/planner/core"
"github.com/pingcap/tidb/pkg/session"
"github.com/pingcap/tidb/pkg/sessionctx/stmtctx"
"github.com/pingcap/tidb/pkg/sessionctx/variable"
Expand All @@ -51,6 +50,7 @@ import (
"github.com/pingcap/tidb/pkg/testkit/external"
"github.com/pingcap/tidb/pkg/util/collate"
"github.com/pingcap/tidb/pkg/util/dbterror"
"github.com/pingcap/tidb/pkg/util/dbterror/plannererrors"
"github.com/pingcap/tidb/pkg/util/mock"
"github.com/stretchr/testify/require"
)
Expand Down Expand Up @@ -2547,43 +2547,43 @@ func TestAvoidCreateViewOnLocalTemporaryTable(t *testing.T) {

checkCreateView := func() {
err := tk.ExecToErr("create view v1 as select * from tt1")
require.True(t, core.ErrViewSelectTemporaryTable.Equal(err))
require.True(t, plannererrors.ErrViewSelectTemporaryTable.Equal(err))
tk.MustGetErrMsg("select * from v1", "[schema:1146]Table 'test.v1' doesn't exist")

err = tk.ExecToErr("create view v1 as select * from (select * from tt1) as tt")
require.True(t, core.ErrViewSelectTemporaryTable.Equal(err))
require.True(t, plannererrors.ErrViewSelectTemporaryTable.Equal(err))
tk.MustGetErrMsg("select * from v1", "[schema:1146]Table 'test.v1' doesn't exist")

err = tk.ExecToErr("create view v2 as select * from tt0 union select * from tt1")
require.True(t, core.ErrViewSelectTemporaryTable.Equal(err))
require.True(t, plannererrors.ErrViewSelectTemporaryTable.Equal(err))
err = tk.ExecToErr("select * from v2")
require.Error(t, err)
require.Equal(t, "[schema:1146]Table 'test.v2' doesn't exist", err.Error())

err = tk.ExecToErr("create view v3 as select * from tt0, tt1 where tt0.a = tt1.a")
require.True(t, core.ErrViewSelectTemporaryTable.Equal(err))
require.True(t, plannererrors.ErrViewSelectTemporaryTable.Equal(err))
err = tk.ExecToErr("select * from v3")
require.Error(t, err)
require.Equal(t, "[schema:1146]Table 'test.v3' doesn't exist", err.Error())

err = tk.ExecToErr("create view v4 as select a, (select count(1) from tt1 where tt1.a = tt0.a) as tt1a from tt0")
require.True(t, core.ErrViewSelectTemporaryTable.Equal(err))
require.True(t, plannererrors.ErrViewSelectTemporaryTable.Equal(err))
tk.MustGetErrMsg("select * from v4", "[schema:1146]Table 'test.v4' doesn't exist")

err = tk.ExecToErr("create view v5 as select a, (select count(1) from tt1 where tt1.a = 1) as tt1a from tt0")
require.True(t, core.ErrViewSelectTemporaryTable.Equal(err))
require.True(t, plannererrors.ErrViewSelectTemporaryTable.Equal(err))
tk.MustGetErrMsg("select * from v5", "[schema:1146]Table 'test.v5' doesn't exist")

err = tk.ExecToErr("create view v6 as select * from tt0 where tt0.a=(select max(tt1.b) from tt1)")
require.True(t, core.ErrViewSelectTemporaryTable.Equal(err))
require.True(t, plannererrors.ErrViewSelectTemporaryTable.Equal(err))
tk.MustGetErrMsg("select * from v6", "[schema:1146]Table 'test.v6' doesn't exist")

err = tk.ExecToErr("create view v7 as select * from tt0 where tt0.b=(select max(tt1.b) from tt1 where tt0.a=tt1.a)")
require.True(t, core.ErrViewSelectTemporaryTable.Equal(err))
require.True(t, plannererrors.ErrViewSelectTemporaryTable.Equal(err))
tk.MustGetErrMsg("select * from v7", "[schema:1146]Table 'test.v7' doesn't exist")

err = tk.ExecToErr("create or replace view v0 as select * from tt1")
require.True(t, core.ErrViewSelectTemporaryTable.Equal(err))
require.True(t, plannererrors.ErrViewSelectTemporaryTable.Equal(err))
}

checkCreateView()
Expand Down
2 changes: 1 addition & 1 deletion pkg/ddl/tests/fk/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ go_test(
"//pkg/meta/autoid",
"//pkg/parser/auth",
"//pkg/parser/model",
"//pkg/planner/core",
"//pkg/sessiontxn",
"//pkg/testkit",
"//pkg/testkit/testsetup",
"//pkg/util/dbterror",
"//pkg/util/dbterror/plannererrors",
"@com_github_stretchr_testify//require",
"@com_github_tikv_client_go_v2//tikv",
"@org_uber_go_goleak//:goleak",
Expand Down
10 changes: 5 additions & 5 deletions pkg/ddl/tests/fk/foreign_key_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ import (
"github.com/pingcap/tidb/pkg/meta"
"github.com/pingcap/tidb/pkg/parser/auth"
"github.com/pingcap/tidb/pkg/parser/model"
plannercore "github.com/pingcap/tidb/pkg/planner/core"
"github.com/pingcap/tidb/pkg/sessiontxn"
"github.com/pingcap/tidb/pkg/testkit"
"github.com/pingcap/tidb/pkg/util/dbterror"
"github.com/pingcap/tidb/pkg/util/dbterror/plannererrors"
"github.com/stretchr/testify/require"
)

Expand Down Expand Up @@ -1113,10 +1113,10 @@ func TestAddForeignKey(t *testing.T) {
require.Equal(t, names[i], fkInfo.Name.L)
require.Equal(t, model.StatePublic, fkInfo.State)
}
tk.MustGetDBError("insert into t2 (id, b) values (1,1)", plannercore.ErrNoReferencedRow2)
tk.MustGetDBError("insert into t2 (id, c) values (1,1)", plannercore.ErrNoReferencedRow2)
tk.MustGetDBError("insert into t2 (id, d) values (1,1)", plannercore.ErrNoReferencedRow2)
tk.MustGetDBError("insert into t2 (id, e) values (1,1)", plannercore.ErrNoReferencedRow2)
tk.MustGetDBError("insert into t2 (id, b) values (1,1)", plannererrors.ErrNoReferencedRow2)
tk.MustGetDBError("insert into t2 (id, c) values (1,1)", plannererrors.ErrNoReferencedRow2)
tk.MustGetDBError("insert into t2 (id, d) values (1,1)", plannererrors.ErrNoReferencedRow2)
tk.MustGetDBError("insert into t2 (id, e) values (1,1)", plannererrors.ErrNoReferencedRow2)

// Test add multiple foreign key constraint in one statement but failed.
tk.MustExec("alter table t2 drop foreign key fk")
Expand Down
2 changes: 1 addition & 1 deletion pkg/ddl/tests/serial/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ go_test(
"//pkg/meta/autoid",
"//pkg/parser/model",
"//pkg/parser/mysql",
"//pkg/planner/core",
"//pkg/session",
"//pkg/sessionctx/variable",
"//pkg/sessiontxn",
Expand All @@ -35,6 +34,7 @@ go_test(
"//pkg/testkit/external",
"//pkg/testkit/testsetup",
"//pkg/util/dbterror",
"//pkg/util/dbterror/plannererrors",
"//pkg/util/gcutil",
"@com_github_pingcap_failpoint//:failpoint",
"@com_github_stretchr_testify//require",
Expand Down
26 changes: 13 additions & 13 deletions pkg/ddl/tests/serial/serial_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import (
"github.com/pingcap/tidb/pkg/meta/autoid"
"github.com/pingcap/tidb/pkg/parser/model"
"github.com/pingcap/tidb/pkg/parser/mysql"
"github.com/pingcap/tidb/pkg/planner/core"
"github.com/pingcap/tidb/pkg/session"
"github.com/pingcap/tidb/pkg/sessionctx/variable"
"github.com/pingcap/tidb/pkg/sessiontxn"
Expand All @@ -47,6 +46,7 @@ import (
"github.com/pingcap/tidb/pkg/testkit"
"github.com/pingcap/tidb/pkg/testkit/external"
"github.com/pingcap/tidb/pkg/util/dbterror"
"github.com/pingcap/tidb/pkg/util/dbterror/plannererrors"
"github.com/pingcap/tidb/pkg/util/gcutil"
"github.com/stretchr/testify/require"
"github.com/tikv/client-go/v2/testutils"
Expand Down Expand Up @@ -235,7 +235,7 @@ func TestCreateTableWithLikeAtTemporaryMode(t *testing.T) {
tk.MustExec("create global temporary table temporary_table (a int, b int,index(a)) on commit delete rows")
tk.MustExec("drop table if exists temporary_table_t1")
err := tk.ExecToErr("create table temporary_table_t1 like temporary_table")
require.Equal(t, core.ErrOptOnTemporaryTable.GenWithStackByArgs("create table like").Error(), err.Error())
require.Equal(t, plannererrors.ErrOptOnTemporaryTable.GenWithStackByArgs("create table like").Error(), err.Error())
tk.MustExec("drop table if exists temporary_table")

// Test create temporary table like.
Expand All @@ -245,21 +245,21 @@ func TestCreateTableWithLikeAtTemporaryMode(t *testing.T) {
defer tk.MustExec("drop table if exists auto_random_table")
tk.MustExec("drop table if exists auto_random_temporary_global")
err = tk.ExecToErr("create global temporary table auto_random_temporary_global like auto_random_table on commit delete rows")
require.Equal(t, core.ErrOptOnTemporaryTable.GenWithStackByArgs("auto_random").Error(), err.Error())
require.Equal(t, plannererrors.ErrOptOnTemporaryTable.GenWithStackByArgs("auto_random").Error(), err.Error())

// Test pre split regions.
tk.MustExec("drop table if exists table_pre_split")
err = tk.ExecToErr("create table table_pre_split(id int) shard_row_id_bits = 2 pre_split_regions=2")
defer tk.MustExec("drop table if exists table_pre_split")
tk.MustExec("drop table if exists temporary_table_pre_split")
err = tk.ExecToErr("create global temporary table temporary_table_pre_split like table_pre_split ON COMMIT DELETE ROWS")
require.Equal(t, core.ErrOptOnTemporaryTable.GenWithStackByArgs("pre split regions").Error(), err.Error())
require.Equal(t, plannererrors.ErrOptOnTemporaryTable.GenWithStackByArgs("pre split regions").Error(), err.Error())

// Test shard_row_id_bits.
tk.MustExec("drop table if exists shard_row_id_table, shard_row_id_temporary_table, shard_row_id_table_plus, shard_row_id_temporary_table_plus")
err = tk.ExecToErr("create table shard_row_id_table (a int) shard_row_id_bits = 5")
err = tk.ExecToErr("create global temporary table shard_row_id_temporary_table like shard_row_id_table on commit delete rows")
require.Equal(t, core.ErrOptOnTemporaryTable.GenWithStackByArgs("shard_row_id_bits").Error(), err.Error())
require.Equal(t, plannererrors.ErrOptOnTemporaryTable.GenWithStackByArgs("shard_row_id_bits").Error(), err.Error())
tk.MustExec("create table shard_row_id_table_plus (a int)")
tk.MustExec("create global temporary table shard_row_id_temporary_table_plus (a int) on commit delete rows")
defer tk.MustExec("drop table if exists shard_row_id_table, shard_row_id_temporary_table, shard_row_id_table_plus, shard_row_id_temporary_table_plus")
Expand Down Expand Up @@ -334,14 +334,14 @@ func TestCreateTableWithLikeAtTemporaryMode(t *testing.T) {
tk.MustExec("drop table if exists tb5, tb6")
tk.MustExec("create global temporary table tb5(id int) on commit delete rows")
err = tk.ExecToErr("create table tb6 like tb5")
require.EqualError(t, err, core.ErrOptOnTemporaryTable.GenWithStackByArgs("create table like").Error())
require.EqualError(t, err, plannererrors.ErrOptOnTemporaryTable.GenWithStackByArgs("create table like").Error())
defer tk.MustExec("drop table if exists tb5, tb6")

// Test from->global temporary, to->global temporary.
tk.MustExec("drop table if exists tb7, tb8")
tk.MustExec("create global temporary table tb7(id int) on commit delete rows")
err = tk.ExecToErr("create global temporary table tb8 like tb7 on commit delete rows")
require.EqualError(t, err, core.ErrOptOnTemporaryTable.GenWithStackByArgs("create table like").Error())
require.EqualError(t, err, plannererrors.ErrOptOnTemporaryTable.GenWithStackByArgs("create table like").Error())
defer tk.MustExec("drop table if exists tb7, tb8")

// Test from->normal, to->local temporary
Expand All @@ -359,25 +359,25 @@ func TestCreateTableWithLikeAtTemporaryMode(t *testing.T) {
tk.MustExec("drop table if exists tb13, tb14")
tk.MustExec("create temporary table tb13 (i int primary key, j int)")
err = tk.ExecToErr("create temporary table tb14 like tb13")
require.Equal(t, core.ErrOptOnTemporaryTable.GenWithStackByArgs("create table like").Error(), err.Error())
require.Equal(t, plannererrors.ErrOptOnTemporaryTable.GenWithStackByArgs("create table like").Error(), err.Error())
defer tk.MustExec("drop table if exists tb13, tb14")
// Test from->local temporary, to->normal
tk.MustExec("drop table if exists tb15, tb16")
tk.MustExec("create temporary table tb15 (i int primary key, j int)")
err = tk.ExecToErr("create table tb16 like tb15")
require.Equal(t, core.ErrOptOnTemporaryTable.GenWithStackByArgs("create table like").Error(), err.Error())
require.Equal(t, plannererrors.ErrOptOnTemporaryTable.GenWithStackByArgs("create table like").Error(), err.Error())
defer tk.MustExec("drop table if exists tb15, tb16")

tk.MustExec("drop table if exists table_pre_split, tmp_pre_split")
tk.MustExec("create table table_pre_split(id int) shard_row_id_bits=2 pre_split_regions=2")
err = tk.ExecToErr("create temporary table tmp_pre_split like table_pre_split")
require.Equal(t, core.ErrOptOnTemporaryTable.GenWithStackByArgs("pre split regions").Error(), err.Error())
require.Equal(t, plannererrors.ErrOptOnTemporaryTable.GenWithStackByArgs("pre split regions").Error(), err.Error())
defer tk.MustExec("drop table if exists table_pre_split, tmp_pre_split")

tk.MustExec("drop table if exists table_shard_row_id, tmp_shard_row_id")
tk.MustExec("create table table_shard_row_id(id int) shard_row_id_bits=2")
err = tk.ExecToErr("create temporary table tmp_shard_row_id like table_shard_row_id")
require.Equal(t, core.ErrOptOnTemporaryTable.GenWithStackByArgs("shard_row_id_bits").Error(), err.Error())
require.Equal(t, plannererrors.ErrOptOnTemporaryTable.GenWithStackByArgs("shard_row_id_bits").Error(), err.Error())
defer tk.MustExec("drop table if exists table_shard_row_id, tmp_shard_row_id")

tk.MustExec("drop table if exists partition_table, tmp_partition_table")
Expand Down Expand Up @@ -405,9 +405,9 @@ func TestCreateTableWithLikeAtTemporaryMode(t *testing.T) {
defer tk.MustExec("drop table if exists placement_table1")

err = tk.ExecToErr("create global temporary table g_tmp_placement1 like placement_table1 on commit delete rows")
require.Equal(t, core.ErrOptOnTemporaryTable.GenWithStackByArgs("placement").Error(), err.Error())
require.Equal(t, plannererrors.ErrOptOnTemporaryTable.GenWithStackByArgs("placement").Error(), err.Error())
err = tk.ExecToErr("create temporary table l_tmp_placement1 like placement_table1")
require.Equal(t, core.ErrOptOnTemporaryTable.GenWithStackByArgs("placement").Error(), err.Error())
require.Equal(t, plannererrors.ErrOptOnTemporaryTable.GenWithStackByArgs("placement").Error(), err.Error())
}

func createMockStoreAndDomain(t *testing.T) (store kv.Storage, dom *domain.Domain) {
Expand Down
2 changes: 2 additions & 0 deletions pkg/executor/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ go_library(
"//pkg/util/cteutil",
"//pkg/util/dbterror",
"//pkg/util/dbterror/exeerrors",
"//pkg/util/dbterror/plannererrors",
"//pkg/util/deadlockhistory",
"//pkg/util/disk",
"//pkg/util/disttask",
Expand Down Expand Up @@ -437,6 +438,7 @@ go_test(
"//pkg/util/collate",
"//pkg/util/dbterror",
"//pkg/util/dbterror/exeerrors",
"//pkg/util/dbterror/plannererrors",
"//pkg/util/deadlockhistory",
"//pkg/util/disk",
"//pkg/util/execdetails",
Expand Down
2 changes: 1 addition & 1 deletion pkg/executor/aggfuncs/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,14 @@ go_library(
"//pkg/parser/ast",
"//pkg/parser/charset",
"//pkg/parser/mysql",
"//pkg/planner/core",
"//pkg/planner/util",
"//pkg/sessionctx",
"//pkg/sessionctx/variable",
"//pkg/types",
"//pkg/util/chunk",
"//pkg/util/codec",
"//pkg/util/collate",
"//pkg/util/dbterror/plannererrors",
"//pkg/util/hack",
"//pkg/util/logutil",
"//pkg/util/selection",
Expand Down
6 changes: 3 additions & 3 deletions pkg/executor/aggfuncs/func_group_concat.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ import (
"unsafe"

"github.com/pingcap/tidb/pkg/expression"
plannercore "github.com/pingcap/tidb/pkg/planner/core"
"github.com/pingcap/tidb/pkg/planner/util"
"github.com/pingcap/tidb/pkg/sessionctx"
"github.com/pingcap/tidb/pkg/types"
"github.com/pingcap/tidb/pkg/util/chunk"
"github.com/pingcap/tidb/pkg/util/codec"
"github.com/pingcap/tidb/pkg/util/collate"
"github.com/pingcap/tidb/pkg/util/dbterror/plannererrors"
"github.com/pingcap/tidb/pkg/util/set"
)

Expand Down Expand Up @@ -504,7 +504,7 @@ func (e *groupConcatOrder) UpdatePartialResult(sctx sessionctx.Context, rowsInGr
func (*groupConcatOrder) MergePartialResult(sessionctx.Context, PartialResult, PartialResult) (memDelta int64, err error) {
// If order by exists, the parallel hash aggregation is forbidden in executorBuilder.buildHashAgg.
// So MergePartialResult will not be called.
return 0, plannercore.ErrInternal.GenWithStack("groupConcatOrder.MergePartialResult should not be called")
return 0, plannererrors.ErrInternal.GenWithStack("groupConcatOrder.MergePartialResult should not be called")
}

// SetTruncated will be called in `executorBuilder#buildHashAgg` with duck-type.
Expand Down Expand Up @@ -628,7 +628,7 @@ func (e *groupConcatDistinctOrder) UpdatePartialResult(sctx sessionctx.Context,
func (*groupConcatDistinctOrder) MergePartialResult(sessionctx.Context, PartialResult, PartialResult) (memDelta int64, err error) {
// If order by exists, the parallel hash aggregation is forbidden in executorBuilder.buildHashAgg.
// So MergePartialResult will not be called.
return 0, plannercore.ErrInternal.GenWithStack("groupConcatDistinctOrder.MergePartialResult should not be called")
return 0, plannererrors.ErrInternal.GenWithStack("groupConcatDistinctOrder.MergePartialResult should not be called")
}

// GetDatumMemSize calculates the memory size of each types.Datum in sortRow.byItems.
Expand Down
5 changes: 3 additions & 2 deletions pkg/executor/brie.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ import (
"github.com/pingcap/tidb/pkg/types"
"github.com/pingcap/tidb/pkg/util/chunk"
"github.com/pingcap/tidb/pkg/util/dbterror/exeerrors"
"github.com/pingcap/tidb/pkg/util/dbterror/plannererrors"
"github.com/pingcap/tidb/pkg/util/printer"
"github.com/pingcap/tidb/pkg/util/sem"
"github.com/pingcap/tidb/pkg/util/sqlexec"
Expand Down Expand Up @@ -300,13 +301,13 @@ func (b *executorBuilder) buildBRIE(s *ast.BRIEStmt, schema *expression.Schema)
case "hdfs":
if sem.IsEnabled() {
// Storage is not permitted to be hdfs when SEM is enabled.
b.err = exeerrors.ErrNotSupportedWithSem.GenWithStackByArgs("hdfs storage")
b.err = plannererrors.ErrNotSupportedWithSem.GenWithStackByArgs("hdfs storage")
return nil
}
case "local", "file", "":
if sem.IsEnabled() {
// Storage is not permitted to be local when SEM is enabled.
b.err = exeerrors.ErrNotSupportedWithSem.GenWithStackByArgs("local storage")
b.err = plannererrors.ErrNotSupportedWithSem.GenWithStackByArgs("local storage")
return nil
}
default:
Expand Down
Loading

0 comments on commit 858a0de

Please sign in to comment.