From 71504fd97b1571b56f0ba2ffcfa31b24141da171 Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Wed, 11 Oct 2023 16:20:10 -0700 Subject: [PATCH] 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. --- .../sqle/enginetest/dolt_engine_test.go | 49 ++++++++++++------- go/libraries/doltcore/sqle/tables.go | 18 +++---- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go b/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go index 6f013abb2f..c325b21f8a 100644 --- a/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go +++ b/go/libraries/doltcore/sqle/enginetest/dolt_engine_test.go @@ -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 }) } diff --git a/go/libraries/doltcore/sqle/tables.go b/go/libraries/doltcore/sqle/tables.go index fefb446912..545aa4b78b 100644 --- a/go/libraries/doltcore/sqle/tables.go +++ b/go/libraries/doltcore/sqle/tables.go @@ -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) {