Skip to content

Commit 695c42b

Browse files
committed
fix fk time issues
1 parent 9ae1a2f commit 695c42b

File tree

2 files changed

+14
-15
lines changed

2 files changed

+14
-15
lines changed

enginetest/queries/script_queries.go

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10856,83 +10856,72 @@ where
1085610856
},
1085710857
Assertions: []ScriptTestAssertion{
1085810858
{
10859-
Skip: true,
1086010859
Query: "create table child_datetime0 (dt datetime, foreign key (dt) references parent_datetime6(dt));",
1086110860
Expected: []sql.Row{
1086210861
{types.NewOkResult(0)},
1086310862
},
1086410863
},
1086510864
{
10866-
Skip: true,
1086710865
Query: "insert into child_datetime0 values ('2001-02-03 12:34:56');",
1086810866
ExpectedErr: sql.ErrForeignKeyChildViolation,
1086910867
},
1087010868
{
10871-
Skip: true,
1087210869
Query: "create table child_datetime6 (dt datetime(6), foreign key (dt) references parent_datetime0(dt));",
1087310870
Expected: []sql.Row{
1087410871
{types.NewOkResult(0)},
1087510872
},
1087610873
},
1087710874
{
10878-
Skip: true,
1087910875
Query: "insert into child_datetime6 values ('2001-02-03 12:34:56');",
1088010876
ExpectedErr: sql.ErrForeignKeyChildViolation,
1088110877
},
1088210878

1088310879
{
10884-
Skip: true,
1088510880
Query: "create table child1_timestamp0 (ts timestamp, foreign key (ts) references parent_datetime0(dt));",
1088610881
Expected: []sql.Row{
1088710882
{types.NewOkResult(0)},
1088810883
},
1088910884
},
1089010885
{
10891-
Skip: true,
1089210886
Query: "insert into child1_timestamp0 values ('2001-02-03 12:34:56');",
1089310887
ExpectedErr: sql.ErrForeignKeyChildViolation,
1089410888
},
1089510889
{
10896-
Skip: true,
1089710890
Query: "create table child2_timestamp0 (ts timestamp, foreign key (ts) references parent_datetime6(dt));",
1089810891
Expected: []sql.Row{
1089910892
{types.NewOkResult(0)},
1090010893
},
1090110894
},
1090210895
{
10903-
Skip: true,
1090410896
Query: "insert into child2_timestamp0 values ('2001-02-03 12:34:56');",
1090510897
ExpectedErr: sql.ErrForeignKeyChildViolation,
1090610898
},
1090710899

1090810900
{
10909-
Skip: true,
1091010901
Query: "create table child1_timestamp6 (ts timestamp(6), foreign key (ts) references parent_datetime0(dt));",
1091110902
Expected: []sql.Row{
1091210903
{types.NewOkResult(0)},
1091310904
},
1091410905
},
1091510906
{
10916-
Skip: true,
1091710907
Query: "insert into child1_timestamp6 values ('2001-02-03 12:34:56');",
1091810908
ExpectedErr: sql.ErrForeignKeyChildViolation,
1091910909
},
1092010910
{
10921-
Skip: true,
1092210911
Query: "create table child2_timestamp6 (ts timestamp(6), foreign key (ts) references parent_datetime6(dt));",
1092310912
Expected: []sql.Row{
1092410913
{types.NewOkResult(0)},
1092510914
},
1092610915
},
1092710916
{
10928-
Skip: true,
1092910917
Query: "insert into child2_timestamp6 values ('2001-02-03 12:34:56');",
1093010918
ExpectedErr: sql.ErrForeignKeyChildViolation,
1093110919
},
1093210920
{
10933-
Skip: true,
10934-
Query: "insert into child2_timestamp6 values ('2001-02-03 12:34:56.123456');",
10935-
ExpectedErr: sql.ErrForeignKeyChildViolation,
10921+
Query: "insert into child2_timestamp6 values ('2001-02-03 12:34:56.123456');",
10922+
Expected: []sql.Row{
10923+
{types.NewOkResult(1)},
10924+
},
1093610925
},
1093710926
},
1093810927
},

sql/plan/alter_foreign_key.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,16 @@ func foreignKeyComparableTypes(ctx *sql.Context, type1 sql.Type, type2 sql.Type)
651651
t1 := type1.Type()
652652
t2 := type2.Type()
653653

654+
// Handle time-related types with different precisions or cross-type references
655+
if (types.IsTime(type1) || types.IsTimespan(type1)) && (types.IsTime(type2) || types.IsTimespan(type2)) {
656+
// MySQL allows time-related types to reference each other in foreign keys:
657+
// - DATETIME can reference DATETIME with different precision
658+
// - TIMESTAMP can reference TIMESTAMP with different precision
659+
// - DATETIME can reference TIMESTAMP and vice versa
660+
// - TIME can reference TIME with different precision
661+
return true
662+
}
663+
654664
// Handle same-type cases for special types
655665
if t1 == t2 {
656666
switch t1 {

0 commit comments

Comments
 (0)