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) {