Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

telemetry: interval partitioning #36486

Merged
merged 72 commits into from Sep 14, 2022
Merged
Show file tree
Hide file tree
Changes from 69 commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
2e130a7
WIP: support INTERVAL table partitioning syntax
mjonss Jun 10, 2022
44e81ed
INTERVAL partitioning yacc OK
mjonss Jun 12, 2022
69129df
INTERVAL partitioning, parser restore OK
mjonss Jun 12, 2022
0b0fe85
INTERVAL partitioning, updated parser.go (auto generated from parser.y)
mjonss Jun 12, 2022
8a5fedc
fix for INTERVAL partitioning parser Restore
mjonss Jun 12, 2022
20cdac4
Fixed compilation issue
mjonss Jun 22, 2022
f68c684
Added 'ALTER TABLE t LAST PARTITION LESS THAN (expr)'
mjonss Jun 22, 2022
97218a4
Added ALTER TABLE t SPLIT MAX PARTITION (new end)
mjonss Jun 23, 2022
9fa7702
Added syntax for MERGE FIRST PARTITION (new start)
mjonss Jun 23, 2022
1b8b88b
Merge remote-tracking branch 'pingcap/master' into interval-partitioning
mjonss Jun 23, 2022
b0a1962
WIP
mjonss Jun 24, 2022
c1e104f
Added tidb_extension_non_mysql_compatible to show INTERVAL partitioning
mjonss Jun 30, 2022
5077070
Added support for NULL PARTITION
mjonss Jun 30, 2022
701118d
wip adding ALTER support for RANGE INTERVAL
mjonss Jul 1, 2022
9ee5581
Added ALTER TABLE t FIRST PARTITION LESS THAN
mjonss Jul 1, 2022
4a7b39c
Merge remote-tracking branch 'pingcap/master' into interval-partitioning
mjonss Jul 1, 2022
dc7b02f
ALTER TABLE t LAST PARTITION (expr)
mjonss Jul 4, 2022
3cb6dfa
ALTER TABLE FIRST PARTITION (expr)
mjonss Jul 5, 2022
6711ead
Added comment to exported function
mjonss Jul 5, 2022
a4a8a83
Rearranged tests
mjonss Jul 6, 2022
73b24c3
Added errors for SPLIT and MERGE partition
mjonss Jul 6, 2022
26e307c
Added more specific errors
mjonss Jul 6, 2022
2055d6d
Fix for ALTER TABLE t DISABLE/ENABLE KEYS
mjonss Jul 6, 2022
849b407
More error shuffling
mjonss Jul 6, 2022
6f358cd
More error fixing
mjonss Jul 6, 2022
4e3fff2
Merge remote-tracking branch 'pingcap/master' into interval-partitioning
mjonss Jul 6, 2022
f0a9c48
Merge remote-tracking branch 'pingcap/master' into interval-partitioning
mjonss Jul 7, 2022
fe629c6
More tests
mjonss Jul 7, 2022
b336b03
Added parser feature [interval_partitioning]
mjonss Jul 13, 2022
5904271
Updated tests and only allow INT/DATE/DATETIME INTERVALs types
mjonss Jul 13, 2022
e437322
Accepting both INTERVAL definition and legacy partition definitions
mjonss Jul 13, 2022
16e08cd
Fixed test issue with unix_timestamp and time_zone
mjonss Jul 15, 2022
3a79873
Start to match INTERVAL to existing partitioning schemas
mjonss Jul 18, 2022
c67c184
Removed the compatibility checks for non-INTERVAL created tables
mjonss Jul 18, 2022
54f33df
Corrected errors, to reuse generic error number
mjonss Jul 18, 2022
b2c9448
Fixes for date INTERVALs
mjonss Jul 19, 2022
46c5e81
Revert "Removed the compatibility checks for non-INTERVAL created tab…
mjonss Jul 19, 2022
074de48
Removed simplified SHOW CREATE output and interval_partitioning
mjonss Jul 19, 2022
08a0dfa
Fix linting
mjonss Jul 19, 2022
eb53b16
Minor fix of unquote
mjonss Jul 19, 2022
35714f1
Fix linting
mjonss Jul 19, 2022
8089798
Always generate and test INTERVAL partitioning instead of storing it
mjonss Jul 19, 2022
953505e
Linting
mjonss Jul 19, 2022
ad64d6d
Minor cleanup and linting
mjonss Jul 19, 2022
2cc9889
Fixed integer values output
mjonss Jul 19, 2022
78eeae9
Allow pre-existing options like Placement Policy
mjonss Jul 19, 2022
54e3e64
Added placement policy test
mjonss Jul 19, 2022
690a232
Updated some comments
mjonss Jul 19, 2022
41ace95
Renamed partitions from SYS_P_[LT/NULL/MAXVALUE] to P_...
mjonss Jul 19, 2022
e47dc39
Restored non edited files
mjonss Jul 19, 2022
5bc947c
More tests
mjonss Jul 19, 2022
a576709
Merge remote-tracking branch 'pingcap/master' into interval-partitioning
mjonss Jul 19, 2022
3ab653a
Generating new QueryString for ALTER TABLE t {FIRST|LAST} PARTITION
mjonss Jul 19, 2022
3cdb0ff
Fix of generating query text for ALTER TABLE t LAST/FIRST PARTITION
mjonss Jul 19, 2022
2637037
more tests
mjonss Jul 20, 2022
9645c9d
Self review fixes
mjonss Jul 20, 2022
491c22e
Removed unused variables and arguments
mjonss Jul 20, 2022
40c5188
Move back a code block
mjonss Jul 20, 2022
698e178
Less changes for reviewers
mjonss Jul 20, 2022
1396f07
Removed one unused argument
mjonss Jul 20, 2022
937c309
Fixed a typo
mjonss Jul 20, 2022
680e4bd
Merge remote-tracking branch 'pingcap/master' into interval-partitioning
mjonss Jul 20, 2022
6efb781
Fixed query string generation for INTERVAL syntactic sugar
mjonss Jul 21, 2022
87fdd15
Merge remote-tracking branch 'pingcap/master' into interval-partitioning
mjonss Jul 22, 2022
fcb3fec
Fix after change in ddl api
mjonss Jul 22, 2022
0e25fca
Added telemetry for INTERVAL partitioning commands
mjonss Jul 22, 2022
1babe96
Merge remote-tracking branch 'pingcap/master' into telemetry-interval…
mjonss Aug 9, 2022
fec2b03
Cleanup, since it was based on dev branch interval-partitioning
mjonss Aug 9, 2022
9fb3ce6
Merge remote-tracking branch 'pingcap/master' into telemetry-interval…
mjonss Sep 8, 2022
544bb3d
Merge branch 'master' into telemetry-interval-partitioning
ti-chi-bot Sep 14, 2022
8c92ca7
Merge branch 'master' into telemetry-interval-partitioning
ti-chi-bot Sep 14, 2022
3340799
Merge branch 'master' into telemetry-interval-partitioning
ti-chi-bot Sep 14, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions executor/adapter.go
Expand Up @@ -206,6 +206,9 @@ type PartitionTelemetryInfo struct {
UseTablePartitionRangeColumns bool
UseTablePartitionListColumns bool
TablePartitionMaxPartitionsNum uint64
UseCreateIntervalPartition bool
UseAddIntervalPartition bool
UseDropIntervalPartition bool
}

// AccountLockTelemetryInfo records account lock/unlock information during execution
Expand Down
89 changes: 55 additions & 34 deletions executor/builder.go
Expand Up @@ -1017,51 +1017,72 @@ func (b *executorBuilder) buildRevoke(revoke *ast.RevokeStmt) Executor {
return e
}

func (b *executorBuilder) buildDDL(v *plannercore.DDL) Executor {
switch v.Statement.(type) {
func (b *executorBuilder) setTelemetryInfo(v *plannercore.DDL) {
if v == nil || b.Ti == nil {
return
}
switch s := v.Statement.(type) {
case *ast.AlterTableStmt:
if len(v.Statement.(*ast.AlterTableStmt).Specs) > 1 && b.Ti != nil {
if len(s.Specs) > 1 {
b.Ti.UseMultiSchemaChange = true
}
case *ast.CreateTableStmt:
stmt := v.Statement.(*ast.CreateTableStmt)
if stmt != nil && stmt.Partition != nil {
if strings.EqualFold(b.ctx.GetSessionVars().EnableTablePartition, "OFF") {
break
for _, spec := range s.Specs {
switch spec.Tp {
case ast.AlterTableDropFirstPartition:
if b.Ti.PartitionTelemetry == nil {
b.Ti.PartitionTelemetry = &PartitionTelemetryInfo{}
}
b.Ti.PartitionTelemetry.UseDropIntervalPartition = true
case ast.AlterTableAddLastPartition:
if b.Ti.PartitionTelemetry == nil {
b.Ti.PartitionTelemetry = &PartitionTelemetryInfo{}
}
b.Ti.PartitionTelemetry.UseAddIntervalPartition = true
}
}
case *ast.CreateTableStmt:
if s.Partition == nil || strings.EqualFold(b.ctx.GetSessionVars().EnableTablePartition, "OFF") {
break
}

s := stmt.Partition
if b.Ti.PartitionTelemetry == nil {
b.Ti.PartitionTelemetry = &PartitionTelemetryInfo{}
}
b.Ti.PartitionTelemetry.TablePartitionMaxPartitionsNum = mathutil.Max(s.Num, uint64(len(s.Definitions)))
b.Ti.PartitionTelemetry.UseTablePartition = true

switch s.Tp {
case model.PartitionTypeRange:
if s.Sub == nil {
if len(s.ColumnNames) > 0 {
b.Ti.PartitionTelemetry.UseTablePartitionRangeColumns = true
} else {
b.Ti.PartitionTelemetry.UseTablePartitionRange = true
}
p := s.Partition
if b.Ti.PartitionTelemetry == nil {
b.Ti.PartitionTelemetry = &PartitionTelemetryInfo{}
}
b.Ti.PartitionTelemetry.TablePartitionMaxPartitionsNum = mathutil.Max(p.Num, uint64(len(p.Definitions)))
b.Ti.PartitionTelemetry.UseTablePartition = true

switch p.Tp {
case model.PartitionTypeRange:
if p.Sub == nil {
if len(p.ColumnNames) > 0 {
b.Ti.PartitionTelemetry.UseTablePartitionRangeColumns = true
} else {
b.Ti.PartitionTelemetry.UseTablePartitionRange = true
}
case model.PartitionTypeHash:
if !s.Linear && s.Sub == nil {
b.Ti.PartitionTelemetry.UseTablePartitionHash = true
if p.Interval != nil {
b.Ti.PartitionTelemetry.UseCreateIntervalPartition = true
}
case model.PartitionTypeList:
enable := b.ctx.GetSessionVars().EnableListTablePartition
if s.Sub == nil && enable {
if len(s.ColumnNames) > 0 {
b.Ti.PartitionTelemetry.UseTablePartitionListColumns = true
} else {
b.Ti.PartitionTelemetry.UseTablePartitionList = true
}
}
case model.PartitionTypeHash:
if !p.Linear && p.Sub == nil {
b.Ti.PartitionTelemetry.UseTablePartitionHash = true
}
case model.PartitionTypeList:
enable := b.ctx.GetSessionVars().EnableListTablePartition
if p.Sub == nil && enable {
if len(p.ColumnNames) > 0 {
b.Ti.PartitionTelemetry.UseTablePartitionListColumns = true
} else {
b.Ti.PartitionTelemetry.UseTablePartitionList = true
}
}
}
}
}

func (b *executorBuilder) buildDDL(v *plannercore.DDL) Executor {
b.setTelemetryInfo(v)

e := &DDLExec{
baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()),
Expand Down
72 changes: 51 additions & 21 deletions metrics/telemetry.go
Expand Up @@ -92,6 +92,27 @@ var (
Name: "account_lock_usage",
Help: "Counter of locked/unlocked users",
}, []string{LblAccountLock})
TelemetryTablePartitionCreateIntervalPartitionsCnt = prometheus.NewCounter(
prometheus.CounterOpts{
Namespace: "tidb",
Subsystem: "telemetry",
Name: "table_partition_create_interval_partition_usage",
Help: "Counter of partitions created by CREATE TABLE INTERVAL statements",
})
TelemetryTablePartitionAddIntervalPartitionsCnt = prometheus.NewCounter(
prometheus.CounterOpts{
Namespace: "tidb",
Subsystem: "telemetry",
Name: "table_partition_add_interval_partition_usage",
Help: "Counter of partitions added by ALTER TABLE LAST PARTITION statements",
})
TelemetryTablePartitionDropIntervalPartitionsCnt = prometheus.NewCounter(
prometheus.CounterOpts{
Namespace: "tidb",
Subsystem: "telemetry",
Name: "table_partition_drop_interval_partition_usage",
Help: "Counter of partitions added by ALTER TABLE FIRST PARTITION statements",
})
)

// readCounter reads the value of a prometheus.Counter.
Expand Down Expand Up @@ -178,25 +199,31 @@ func GetMultiSchemaCounter() MultiSchemaChangeUsageCounter {

// TablePartitionUsageCounter records the usages of table partition.
type TablePartitionUsageCounter struct {
TablePartitionCnt int64 `json:"table_partition_cnt"`
TablePartitionListCnt int64 `json:"table_partition_list_cnt"`
TablePartitionRangeCnt int64 `json:"table_partition_range_cnt"`
TablePartitionHashCnt int64 `json:"table_partition_hash_cnt"`
TablePartitionRangeColumnsCnt int64 `json:"table_partition_range_columns_cnt"`
TablePartitionListColumnsCnt int64 `json:"table_partition_list_columns_cnt"`
TablePartitionMaxPartitionsCnt int64 `json:"table_partition_max_partitions_cnt"`
TablePartitionCnt int64 `json:"table_partition_cnt"`
TablePartitionListCnt int64 `json:"table_partition_list_cnt"`
TablePartitionRangeCnt int64 `json:"table_partition_range_cnt"`
TablePartitionHashCnt int64 `json:"table_partition_hash_cnt"`
TablePartitionRangeColumnsCnt int64 `json:"table_partition_range_columns_cnt"`
TablePartitionListColumnsCnt int64 `json:"table_partition_list_columns_cnt"`
TablePartitionMaxPartitionsCnt int64 `json:"table_partition_max_partitions_cnt"`
TablePartitionCreateIntervalPartitionsCnt int64 `json:"table_partition_create_interval_partitions_cnt"`
TablePartitionAddIntervalPartitionsCnt int64 `json:"table_partition_add_interval_partitions_cnt"`
TablePartitionDropIntervalPartitionsCnt int64 `json:"table_partition_drop_interval_partitions_cnt"`
}

// Cal returns the difference of two counters.
func (c TablePartitionUsageCounter) Cal(rhs TablePartitionUsageCounter) TablePartitionUsageCounter {
return TablePartitionUsageCounter{
TablePartitionCnt: c.TablePartitionCnt - rhs.TablePartitionCnt,
TablePartitionListCnt: c.TablePartitionListCnt - rhs.TablePartitionListCnt,
TablePartitionRangeCnt: c.TablePartitionRangeCnt - rhs.TablePartitionRangeCnt,
TablePartitionHashCnt: c.TablePartitionHashCnt - rhs.TablePartitionHashCnt,
TablePartitionRangeColumnsCnt: c.TablePartitionRangeColumnsCnt - rhs.TablePartitionRangeColumnsCnt,
TablePartitionListColumnsCnt: c.TablePartitionListColumnsCnt - rhs.TablePartitionListColumnsCnt,
TablePartitionMaxPartitionsCnt: mathutil.Max(c.TablePartitionMaxPartitionsCnt-rhs.TablePartitionMaxPartitionsCnt, rhs.TablePartitionMaxPartitionsCnt),
TablePartitionCnt: c.TablePartitionCnt - rhs.TablePartitionCnt,
TablePartitionListCnt: c.TablePartitionListCnt - rhs.TablePartitionListCnt,
TablePartitionRangeCnt: c.TablePartitionRangeCnt - rhs.TablePartitionRangeCnt,
TablePartitionHashCnt: c.TablePartitionHashCnt - rhs.TablePartitionHashCnt,
TablePartitionRangeColumnsCnt: c.TablePartitionRangeColumnsCnt - rhs.TablePartitionRangeColumnsCnt,
TablePartitionListColumnsCnt: c.TablePartitionListColumnsCnt - rhs.TablePartitionListColumnsCnt,
TablePartitionMaxPartitionsCnt: mathutil.Max(c.TablePartitionMaxPartitionsCnt-rhs.TablePartitionMaxPartitionsCnt, rhs.TablePartitionMaxPartitionsCnt),
TablePartitionCreateIntervalPartitionsCnt: c.TablePartitionCreateIntervalPartitionsCnt - rhs.TablePartitionCreateIntervalPartitionsCnt,
TablePartitionAddIntervalPartitionsCnt: c.TablePartitionAddIntervalPartitionsCnt - rhs.TablePartitionAddIntervalPartitionsCnt,
TablePartitionDropIntervalPartitionsCnt: c.TablePartitionDropIntervalPartitionsCnt - rhs.TablePartitionDropIntervalPartitionsCnt,
}
}

Expand All @@ -216,13 +243,16 @@ func ResetTablePartitionCounter(pre TablePartitionUsageCounter) TablePartitionUs
// GetTablePartitionCounter gets the TxnCommitCounter.
func GetTablePartitionCounter() TablePartitionUsageCounter {
return TablePartitionUsageCounter{
TablePartitionCnt: readCounter(TelemetryTablePartitionCnt),
TablePartitionListCnt: readCounter(TelemetryTablePartitionListCnt),
TablePartitionRangeCnt: readCounter(TelemetryTablePartitionRangeCnt),
TablePartitionHashCnt: readCounter(TelemetryTablePartitionHashCnt),
TablePartitionRangeColumnsCnt: readCounter(TelemetryTablePartitionRangeColumnsCnt),
TablePartitionListColumnsCnt: readCounter(TelemetryTablePartitionListColumnsCnt),
TablePartitionMaxPartitionsCnt: readCounter(TelemetryTablePartitionMaxPartitionsCnt),
TablePartitionCnt: readCounter(TelemetryTablePartitionCnt),
TablePartitionListCnt: readCounter(TelemetryTablePartitionListCnt),
TablePartitionRangeCnt: readCounter(TelemetryTablePartitionRangeCnt),
TablePartitionHashCnt: readCounter(TelemetryTablePartitionHashCnt),
TablePartitionRangeColumnsCnt: readCounter(TelemetryTablePartitionRangeColumnsCnt),
TablePartitionListColumnsCnt: readCounter(TelemetryTablePartitionListColumnsCnt),
TablePartitionMaxPartitionsCnt: readCounter(TelemetryTablePartitionMaxPartitionsCnt),
TablePartitionCreateIntervalPartitionsCnt: readCounter(TelemetryTablePartitionCreateIntervalPartitionsCnt),
TablePartitionAddIntervalPartitionsCnt: readCounter(TelemetryTablePartitionAddIntervalPartitionsCnt),
TablePartitionDropIntervalPartitionsCnt: readCounter(TelemetryTablePartitionDropIntervalPartitionsCnt),
}
}

Expand Down
40 changes: 26 additions & 14 deletions session/session.go
Expand Up @@ -121,20 +121,23 @@ var (
sessionExecuteParseDurationInternal = metrics.SessionExecuteParseDuration.WithLabelValues(metrics.LblInternal)
sessionExecuteParseDurationGeneral = metrics.SessionExecuteParseDuration.WithLabelValues(metrics.LblGeneral)

telemetryCTEUsageRecurCTE = metrics.TelemetrySQLCTECnt.WithLabelValues("recurCTE")
telemetryCTEUsageNonRecurCTE = metrics.TelemetrySQLCTECnt.WithLabelValues("nonRecurCTE")
telemetryCTEUsageNotCTE = metrics.TelemetrySQLCTECnt.WithLabelValues("notCTE")
telemetryMultiSchemaChangeUsage = metrics.TelemetryMultiSchemaChangeCnt
telemetryTablePartitionUsage = metrics.TelemetryTablePartitionCnt
telemetryTablePartitionListUsage = metrics.TelemetryTablePartitionListCnt
telemetryTablePartitionRangeUsage = metrics.TelemetryTablePartitionRangeCnt
telemetryTablePartitionHashUsage = metrics.TelemetryTablePartitionHashCnt
telemetryTablePartitionRangeColumnsUsage = metrics.TelemetryTablePartitionRangeColumnsCnt
telemetryTablePartitionListColumnsUsage = metrics.TelemetryTablePartitionListColumnsCnt
telemetryTablePartitionMaxPartitionsUsage = metrics.TelemetryTablePartitionMaxPartitionsCnt
telemetryLockUserUsage = metrics.TelemetryAccountLockCnt.WithLabelValues("lockUser")
telemetryUnlockUserUsage = metrics.TelemetryAccountLockCnt.WithLabelValues("unlockUser")
telemetryCreateOrAlterUserUsage = metrics.TelemetryAccountLockCnt.WithLabelValues("createOrAlterUser")
telemetryCTEUsageRecurCTE = metrics.TelemetrySQLCTECnt.WithLabelValues("recurCTE")
telemetryCTEUsageNonRecurCTE = metrics.TelemetrySQLCTECnt.WithLabelValues("nonRecurCTE")
telemetryCTEUsageNotCTE = metrics.TelemetrySQLCTECnt.WithLabelValues("notCTE")
telemetryMultiSchemaChangeUsage = metrics.TelemetryMultiSchemaChangeCnt
telemetryTablePartitionUsage = metrics.TelemetryTablePartitionCnt
telemetryTablePartitionListUsage = metrics.TelemetryTablePartitionListCnt
telemetryTablePartitionRangeUsage = metrics.TelemetryTablePartitionRangeCnt
telemetryTablePartitionHashUsage = metrics.TelemetryTablePartitionHashCnt
telemetryTablePartitionRangeColumnsUsage = metrics.TelemetryTablePartitionRangeColumnsCnt
telemetryTablePartitionListColumnsUsage = metrics.TelemetryTablePartitionListColumnsCnt
telemetryTablePartitionMaxPartitionsUsage = metrics.TelemetryTablePartitionMaxPartitionsCnt
telemetryLockUserUsage = metrics.TelemetryAccountLockCnt.WithLabelValues("lockUser")
telemetryUnlockUserUsage = metrics.TelemetryAccountLockCnt.WithLabelValues("unlockUser")
telemetryCreateOrAlterUserUsage = metrics.TelemetryAccountLockCnt.WithLabelValues("createOrAlterUser")
telemetryTablePartitionCreateIntervalUsage = metrics.TelemetryTablePartitionCreateIntervalPartitionsCnt
telemetryTablePartitionAddIntervalUsage = metrics.TelemetryTablePartitionAddIntervalPartitionsCnt
telemetryTablePartitionDropIntervalUsage = metrics.TelemetryTablePartitionDropIntervalPartitionsCnt
)

// Session context, it is consistent with the lifecycle of a client connection.
Expand Down Expand Up @@ -3310,6 +3313,15 @@ func (s *session) updateTelemetryMetric(es *executor.ExecStmt) {
if ti.PartitionTelemetry.UseTablePartitionListColumns {
telemetryTablePartitionListColumnsUsage.Inc()
}
if ti.PartitionTelemetry.UseCreateIntervalPartition {
telemetryTablePartitionCreateIntervalUsage.Inc()
}
if ti.PartitionTelemetry.UseAddIntervalPartition {
telemetryTablePartitionAddIntervalUsage.Inc()
}
if ti.PartitionTelemetry.UseDropIntervalPartition {
telemetryTablePartitionDropIntervalUsage.Inc()
}
}

if ti.AccountLockTelemetry != nil {
Expand Down
15 changes: 13 additions & 2 deletions telemetry/data_feature_usage_test.go
Expand Up @@ -208,6 +208,9 @@ func TestTablePartition(t *testing.T) {
require.Equal(t, int64(0), usage.TablePartition.TablePartitionRangeCnt)
require.Equal(t, int64(0), usage.TablePartition.TablePartitionRangeColumnsCnt)
require.Equal(t, int64(0), usage.TablePartition.TablePartitionListColumnsCnt)
require.Equal(t, int64(0), usage.TablePartition.TablePartitionCreateIntervalPartitionsCnt)
require.Equal(t, int64(0), usage.TablePartition.TablePartitionAddIntervalPartitionsCnt)
require.Equal(t, int64(0), usage.TablePartition.TablePartitionDropIntervalPartitionsCnt)

telemetry.PostReportTelemetryDataForTest()
tk.MustExec("drop table if exists pt1")
Expand All @@ -217,15 +220,23 @@ func TestTablePartition(t *testing.T) {
"partition p2 values less than (9)," +
"partition p3 values less than (12)," +
"partition p4 values less than (15))")
tk.MustExec("alter table pt1 first partition less than (9)")
tk.MustExec("alter table pt1 last partition less than (21)")
tk.MustExec("drop table if exists pt1")
tk.MustExec("create table pt1 (d datetime primary key, v varchar(255)) partition by range columns(d)" +
" interval (1 day) first partition less than ('2022-01-01') last partition less than ('2022-02-22')")
usage, err = telemetry.GetFeatureUsage(tk.Session())
require.NoError(t, err)
require.Equal(t, int64(1), usage.TablePartition.TablePartitionCnt)
require.Equal(t, int64(2), usage.TablePartition.TablePartitionCnt)
require.Equal(t, int64(0), usage.TablePartition.TablePartitionHashCnt)
require.Equal(t, int64(5), usage.TablePartition.TablePartitionMaxPartitionsCnt)
require.Equal(t, int64(0), usage.TablePartition.TablePartitionListCnt)
require.Equal(t, int64(1), usage.TablePartition.TablePartitionRangeCnt)
require.Equal(t, int64(0), usage.TablePartition.TablePartitionRangeColumnsCnt)
require.Equal(t, int64(1), usage.TablePartition.TablePartitionRangeColumnsCnt)
require.Equal(t, int64(0), usage.TablePartition.TablePartitionListColumnsCnt)
require.Equal(t, int64(1), usage.TablePartition.TablePartitionCreateIntervalPartitionsCnt)
require.Equal(t, int64(1), usage.TablePartition.TablePartitionAddIntervalPartitionsCnt)
require.Equal(t, int64(1), usage.TablePartition.TablePartitionDropIntervalPartitionsCnt)
}

func TestPlacementPolicies(t *testing.T) {
Expand Down