Moved GetForeignKeyEditor to WritableDoltTable, from AlterableDoltTable. This is necessary for recent analyzer changes, which replace the Table implementation in the plan node when creating an indexed access. IndexedDoltTable embeds WritableDoltTable, but not AlterableDoltTable.

This commit is contained in:
Zach Musgrave
2023-10-11 16:20:10 -07:00
parent c8c8068fa8
commit 71504fd97b
2 changed files with 40 additions and 27 deletions

View File

@@ -119,32 +119,37 @@ func TestSingleScript(t *testing.T) {
var scripts = []queries.ScriptTest{
{
Name: "insert duplicate key doesn't prevent other updates, autocommit off",
Name: "failed statements data validation for DELETE, REPLACE",
SetUpScript: []string{
"CREATE TABLE t1 (pk BIGINT PRIMARY KEY, v1 VARCHAR(3));",
"INSERT INTO t1 VALUES (1, 'abc');",
"SET autocommit = 0;",
"CREATE TABLE test (pk BIGINT PRIMARY KEY, v1 BIGINT, INDEX (v1));",
"INSERT INTO test VALUES (1,1), (4,4), (5,5);",
"CREATE TABLE test2 (pk BIGINT PRIMARY KEY, CONSTRAINT fk_test FOREIGN KEY (pk) REFERENCES test (v1));",
"INSERT INTO test2 VALUES (4);",
},
Assertions: []queries.ScriptTestAssertion{
{
Query: "select * from t1 order by pk",
Expected: []sql.Row{{1, "abc"}},
Query: "DELETE FROM test WHERE pk > 0;",
ExpectedErr: sql.ErrForeignKeyParentViolation,
},
{
Query: "INSERT INTO t1 VALUES (1, 'abc');",
ExpectedErr: sql.ErrPrimaryKeyViolation,
Query: "SELECT * FROM test;",
Expected: []sql.Row{{1, 1}, {4, 4}, {5, 5}},
},
{
Query: "INSERT INTO t1 VALUES (2, 'def');",
Expected: []sql.Row{{gmstypes.NewOkResult(1)}},
Query: "SELECT * FROM test2;",
Expected: []sql.Row{{4}},
},
{
Query: "commit",
SkipResultsCheck: true,
Query: "REPLACE INTO test VALUES (1,7), (4,8), (5,9);",
ExpectedErr: sql.ErrForeignKeyParentViolation,
},
{
Query: "select * from t1 order by pk",
Expected: []sql.Row{{1, "abc"}, {2, "def"}},
Query: "SELECT * FROM test;",
Expected: []sql.Row{{1, 1}, {4, 4}, {5, 5}},
},
{
Query: "SELECT * FROM test2;",
Expected: []sql.Row{{4}},
},
},
},
@@ -153,12 +158,20 @@ func TestSingleScript(t *testing.T) {
tcc := &testCommitClock{}
cleanup := installTestCommitClock(tcc)
defer cleanup()
harness := newDoltHarness(t)
harness.Setup(setup.MydbData)
for _, script := range scripts {
sql.RunWithNowFunc(tcc.Now, func() error {
enginetest.TestScript(t, harness, script)
harness := newDoltHarness(t)
harness.Setup(setup.MydbData)
engine, err := harness.NewEngine(t)
if err != nil {
panic(err)
}
engine.EngineAnalyzer().Debug = true
engine.EngineAnalyzer().Verbose = true
enginetest.TestScriptWithEngine(t, engine, harness, script)
return nil
})
}

View File

@@ -996,6 +996,15 @@ func checksInSchema(sch schema.Schema) []sql.CheckDefinition {
return checks
}
// GetForeignKeyEditor implements sql.ForeignKeyTable
func (t *WritableDoltTable) GetForeignKeyEditor(ctx *sql.Context) sql.ForeignKeyEditor {
te, err := t.getTableEditor(ctx)
if err != nil {
return sqlutil.NewStaticErrorEditor(err)
}
return te
}
// GetDeclaredForeignKeys implements sql.ForeignKeyTable
func (t *DoltTable) GetDeclaredForeignKeys(ctx *sql.Context) ([]sql.ForeignKeyConstraint, error) {
root, err := t.workingRoot(ctx)
@@ -2676,15 +2685,6 @@ func (t *AlterableDoltTable) CreateIndexForForeignKey(ctx *sql.Context, idx sql.
return t.updateFromRoot(ctx, newRoot)
}
// GetForeignKeyEditor implements sql.ForeignKeyTable
func (t *AlterableDoltTable) GetForeignKeyEditor(ctx *sql.Context) sql.ForeignKeyEditor {
te, err := t.getTableEditor(ctx)
if err != nil {
return sqlutil.NewStaticErrorEditor(err)
}
return te
}
// toForeignKeyConstraint converts a Dolt resolved foreign key to a GMS foreign key. If the key is unresolved, then this
// function should not be used.
func toForeignKeyConstraint(fk doltdb.ForeignKey, dbName string, childSch, parentSch schema.Schema) (cst sql.ForeignKeyConstraint, err error) {