diff --git a/server/analyzer/assign_insert_casts.go b/server/analyzer/assign_insert_casts.go index 3e03762e06..1f3574ddf4 100644 --- a/server/analyzer/assign_insert_casts.go +++ b/server/analyzer/assign_insert_casts.go @@ -120,8 +120,13 @@ func AssignInsertCasts(ctx *sql.Context, a *analyzer.Analyzer, node sql.Node, sc if err != nil { return nil, false, err } + exprs := append(newDupExprs, insertInto.Checks().ToExpressions()...) + if insertInto.OnDupWhere != nil { + exprs = append(exprs, insertInto.OnDupWhere) + } + exprs = append(exprs, insertInto.Returning...) // TODO: this relies on a particular implementation detail InsertInto.WithExpressions - newInsertInto, err := insertInto.WithExpressions(ctx, append(newDupExprs, insertInto.Checks().ToExpressions()...)...) + newInsertInto, err := insertInto.WithExpressions(ctx, exprs...) if err != nil { return nil, false, err } diff --git a/server/ast/insert.go b/server/ast/insert.go index fa7a6f8e47..d216a8fde9 100644 --- a/server/ast/insert.go +++ b/server/ast/insert.go @@ -41,6 +41,7 @@ func nodeInsert(ctx *Context, node *tree.Insert) (insert *vitess.Insert, err err } var ignore string var onDuplicate vitess.OnDup + var onDuplicateWhere vitess.Expr if node.OnConflict != nil { if isIgnore(node.OnConflict) { @@ -54,6 +55,12 @@ func nodeInsert(ctx *Context, node *tree.Insert) (insert *vitess.Insert, err err for _, updateExpr := range updateExprs { onDuplicate = append(onDuplicate, updateExpr) } + if node.OnConflict.Where != nil { + onDuplicateWhere, err = nodeExpr(ctx, node.OnConflict.Where.Expr) + if err != nil { + return nil, err + } + } } else { return nil, errors.Errorf("the ON CONFLICT clause provided is not yet supported") } @@ -107,14 +114,19 @@ func nodeInsert(ctx *Context, node *tree.Insert) (insert *vitess.Insert, err err } } return &vitess.Insert{ - Action: vitess.InsertStr, - Ignore: ignore, - Table: tableName, - Returning: returningExprs, - With: with, - Columns: columns, - Rows: rows, - OnDup: onDuplicate, + Action: vitess.InsertStr, + Ignore: ignore, + Table: tableName, + Returning: returningExprs, + With: with, + Columns: columns, + Rows: rows, + OnDup: onDuplicate, + OnDupValuesAlias: "excluded", + OnDupWhere: onDuplicateWhere, + // TODO: Apply PostgreSQL's single-row count to unconditional conflict updates once + // enginetests support dialect-specific affected-row expectations. + CountOnDuplicateUpdateAsOneRow: node.OnConflict != nil && node.OnConflict.Where != nil, Auth: vitess.AuthInformation{ AuthType: auth.AuthType_INSERT, TargetType: auth.AuthTargetType_TableIdentifiers, @@ -134,11 +146,5 @@ func isIgnore(conflict *tree.OnConflict) bool { // supportedOnConflictClause returns true if the ON CONFLICT clause given can be represented as // an ON DUPLICATE KEY UPDATE clause in GMS func supportedOnConflictClause(conflict *tree.OnConflict) bool { - if conflict.ArbiterPredicate != nil { - return false - } - if conflict.Where != nil { - return false - } - return true + return conflict.ArbiterPredicate == nil } diff --git a/testing/generation/command_docs/output/insert_test.go b/testing/generation/command_docs/output/insert_test.go index 68f3802af4..454a4625ab 100644 --- a/testing/generation/command_docs/output/insert_test.go +++ b/testing/generation/command_docs/output/insert_test.go @@ -1918,7 +1918,7 @@ func TestInsert(t *testing.T) { Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( DEFAULT , DEFAULT ) , ( DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US opclass , ( index_expression ) COLLATE en_US opclass ) DO UPDATE SET column_name = DEFAULT , ( column_name , column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( expression , expression ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( ( index_expression ) opclass , index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( DEFAULT ) , ( column_name , column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname"), Parses("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name VALUES ( DEFAULT ) , ( expression ) ON CONFLICT ( index_column_name ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ( DEFAULT ) , ( column_name , column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname"), - Parses("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( expression , DEFAULT ) , ( DEFAULT ) ON CONFLICT ( index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( SELECT 1 ) , ( column_name , column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname"), + Converts("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( expression , DEFAULT ) , ( DEFAULT ) ON CONFLICT ( index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( SELECT 1 ) , ( column_name , column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( DEFAULT , DEFAULT ) , ( expression ) ON CONFLICT ( ( index_expression ) opclass , ( index_expression ) COLLATE en_US opclass ) DO UPDATE SET column_name = DEFAULT , ( column_name ) = ROW ( DEFAULT , expression ) WHERE condition RETURNING colname"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name AS alias ( column_name , column_name ) VALUES ( DEFAULT , expression ) , ( expression ) ON CONFLICT ( index_column_name opclass , index_column_name ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ( expression ) , ( column_name ) = ROW ( DEFAULT , expression ) WHERE condition RETURNING colname"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name VALUES ( expression ) , ( expression , expression ) ON CONFLICT ( ( index_expression ) COLLATE en_US opclass , ( index_expression ) COLLATE en_US opclass ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ( DEFAULT ) , ( column_name ) = ROW ( DEFAULT , expression ) WHERE condition RETURNING colname"), @@ -2002,7 +2002,7 @@ func TestInsert(t *testing.T) { Unimplemented("INSERT INTO table_name ( column_name , column_name ) VALUES ( DEFAULT , DEFAULT ) ON CONFLICT ( index_column_name COLLATE en_US , index_column_name opclass ) DO UPDATE SET ( column_name , column_name ) = ROW ( expression ) , ( column_name , column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname"), Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( expression , expression ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( index_column_name opclass , index_column_name COLLATE en_US opclass ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ROW ( DEFAULT ) , ( column_name , column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( expression ) , ( expression , DEFAULT ) ON CONFLICT ( ( index_expression ) , ( index_expression ) COLLATE en_US ) WHERE index_predicate DO UPDATE SET ( column_name ) = ROW ( expression , expression ) , ( column_name , column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname"), - Parses("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( expression , DEFAULT ) , ( expression , DEFAULT ) ON CONFLICT ( index_column_name , index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( DEFAULT , expression ) , ( column_name , column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname"), + Converts("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( expression , DEFAULT ) , ( expression , DEFAULT ) ON CONFLICT ( index_column_name , index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( DEFAULT , expression ) , ( column_name , column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name VALUES ( expression , expression ) , ( DEFAULT ) ON CONFLICT ( index_column_name opclass , index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( DEFAULT , expression ) , ( column_name , column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname"), Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( expression ) , ( DEFAULT ) ON CONFLICT ( ( index_expression ) opclass , ( index_expression ) COLLATE en_US opclass ) DO UPDATE SET ( column_name , column_name ) = ( DEFAULT , expression ) , ( column_name , column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( expression , expression ) , ( DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US , ( index_expression ) opclass ) DO UPDATE SET ( column_name , column_name ) = ROW ( DEFAULT , expression ) , ( column_name , column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname"), @@ -2697,7 +2697,7 @@ func TestInsert(t *testing.T) { Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name AS alias VALUES ( DEFAULT , expression ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( index_column_name COLLATE en_US opclass , ( index_expression ) opclass ) DO UPDATE SET ( column_name , column_name ) = ( DEFAULT , DEFAULT ) , ( column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname output_name"), Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name AS alias VALUES ( expression , expression ) , ( expression , DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US , index_column_name ) DO UPDATE SET ( column_name ) = ROW ( DEFAULT , DEFAULT ) , ( column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname output_name"), Unimplemented("INSERT INTO table_name ( column_name ) VALUES ( expression ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( ( index_expression ) opclass , ( index_expression ) COLLATE en_US ) WHERE index_predicate DO UPDATE SET ( column_name ) = ( SELECT 1 ) , ( column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname output_name"), - Parses("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( DEFAULT , expression ) , ( expression , expression ) ON CONFLICT ( index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( SELECT 1 ) , ( column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname output_name"), + Converts("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( DEFAULT , expression ) , ( expression , expression ) ON CONFLICT ( index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( SELECT 1 ) , ( column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( expression ) , ( expression ) ON CONFLICT ( index_column_name COLLATE en_US opclass , ( index_expression ) opclass ) WHERE index_predicate DO UPDATE SET ( column_name ) = ( expression ) , ( column_name , column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname output_name"), Unimplemented("INSERT INTO table_name AS alias ( column_name , column_name ) VALUES ( expression ) , ( expression , DEFAULT ) ON CONFLICT ( ( index_expression ) opclass , index_column_name ) DO UPDATE SET ( column_name , column_name ) = ROW ( expression ) , ( column_name , column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname output_name"), Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name VALUES ( DEFAULT ) ON CONFLICT ( index_column_name COLLATE en_US opclass , ( index_expression ) COLLATE en_US opclass ) WHERE index_predicate DO UPDATE SET ( column_name ) = ( DEFAULT ) , ( column_name , column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname output_name"), @@ -3052,7 +3052,7 @@ func TestInsert(t *testing.T) { Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( DEFAULT , expression ) , ( expression ) ON CONFLICT ( index_column_name COLLATE en_US opclass , ( index_expression ) COLLATE en_US ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ROW ( DEFAULT ) , column_name = DEFAULT WHERE condition RETURNING colname AS output_name"), Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( DEFAULT , DEFAULT ) , ( expression , DEFAULT ) ON CONFLICT ( index_column_name COLLATE en_US , index_column_name ) DO UPDATE SET ( column_name ) = ( DEFAULT , expression ) , column_name = DEFAULT WHERE condition RETURNING colname AS output_name"), Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( DEFAULT , expression ) , ( DEFAULT , expression ) ON CONFLICT ( ( index_expression ) , ( index_expression ) ) DO UPDATE SET ( column_name , column_name ) = ROW ( expression , DEFAULT ) , column_name = DEFAULT WHERE condition RETURNING colname AS output_name"), - Parses("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( DEFAULT , DEFAULT ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( index_column_name ) DO UPDATE SET ( column_name ) = ( DEFAULT , DEFAULT ) , column_name = DEFAULT WHERE condition RETURNING colname AS output_name"), + Converts("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( DEFAULT , DEFAULT ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( index_column_name ) DO UPDATE SET ( column_name ) = ( DEFAULT , DEFAULT ) , column_name = DEFAULT WHERE condition RETURNING colname AS output_name"), Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name , column_name ) VALUES ( DEFAULT ) , ( expression ) ON CONFLICT ( index_column_name COLLATE en_US opclass , index_column_name ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ( DEFAULT , DEFAULT ) , column_name = DEFAULT WHERE condition RETURNING colname AS output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name VALUES ( expression , DEFAULT ) , ( DEFAULT , expression ) ON CONFLICT ( index_column_name opclass , ( index_expression ) COLLATE en_US ) DO UPDATE SET ( column_name ) = ROW ( DEFAULT , DEFAULT ) , column_name = DEFAULT WHERE condition RETURNING colname AS output_name"), Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name , column_name ) VALUES ( expression , expression ) , ( DEFAULT ) ON CONFLICT ( ( index_expression ) opclass , index_column_name ) DO UPDATE SET ( column_name , column_name ) = ROW ( DEFAULT , DEFAULT ) , column_name = DEFAULT WHERE condition RETURNING colname AS output_name"), @@ -4029,7 +4029,7 @@ func TestInsert(t *testing.T) { Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( expression , expression ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US opclass , index_column_name COLLATE en_US ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ROW ( expression ) , ( column_name , column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname , colname"), Unimplemented("INSERT INTO table_name AS alias ( column_name , column_name ) VALUES ( expression , DEFAULT ) , ( DEFAULT ) ON CONFLICT ( index_column_name , index_column_name ) DO UPDATE SET ( column_name ) = ROW ( DEFAULT ) , ( column_name , column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname , colname"), Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name VALUES ( DEFAULT , DEFAULT ) , ( DEFAULT , expression ) ON CONFLICT ( index_column_name , index_column_name opclass ) WHERE index_predicate DO UPDATE SET ( column_name ) = ROW ( DEFAULT ) , ( column_name , column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname , colname"), - Parses("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( DEFAULT , expression ) , ( expression , expression ) ON CONFLICT ( index_column_name , index_column_name ) DO UPDATE SET ( column_name ) = ( expression , expression ) , ( column_name , column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname , colname"), + Converts("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( DEFAULT , expression ) , ( expression , expression ) ON CONFLICT ( index_column_name , index_column_name ) DO UPDATE SET ( column_name ) = ( expression , expression ) , ( column_name , column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname , colname"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name AS alias ( column_name , column_name ) VALUES ( DEFAULT , expression ) , ( expression , DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US , index_column_name ) DO UPDATE SET ( column_name ) = ( expression , expression ) , ( column_name , column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname , colname"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( DEFAULT , expression ) , ( DEFAULT , expression ) ON CONFLICT ( index_column_name COLLATE en_US , ( index_expression ) opclass ) DO UPDATE SET ( column_name , column_name ) = ( expression , expression ) , ( column_name , column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname , colname"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name AS alias VALUES ( DEFAULT ) , ( DEFAULT ) ON CONFLICT ( index_column_name , ( index_expression ) COLLATE en_US ) DO UPDATE SET ( column_name ) = ROW ( DEFAULT , expression ) , ( column_name , column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname , colname"), @@ -4426,7 +4426,7 @@ func TestInsert(t *testing.T) { Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( expression ) ON CONFLICT ( ( index_expression ) COLLATE en_US , index_column_name COLLATE en_US opclass ) DO UPDATE SET ( column_name ) = ( expression ) , ( column_name ) = ( expression ) WHERE condition RETURNING colname output_name , colname"), Unimplemented("INSERT INTO table_name AS alias ( column_name , column_name ) VALUES ( expression , expression ) , ( expression ) ON CONFLICT ( ( index_expression ) opclass , ( index_expression ) COLLATE en_US ) WHERE index_predicate DO UPDATE SET ( column_name ) = ( expression ) , ( column_name ) = ( expression ) WHERE condition RETURNING colname output_name , colname"), Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) SELECT 1 ON CONFLICT ( index_column_name , ( index_expression ) ) DO UPDATE SET ( column_name , column_name ) = ROW ( expression ) , ( column_name ) = ( expression ) WHERE condition RETURNING colname output_name , colname"), - Parses("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name VALUES ( expression , DEFAULT ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( index_column_name , index_column_name ) DO UPDATE SET ( column_name ) = ( DEFAULT ) , ( column_name ) = ( expression ) WHERE condition RETURNING colname output_name , colname"), + Converts("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name VALUES ( expression , DEFAULT ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( index_column_name , index_column_name ) DO UPDATE SET ( column_name ) = ( DEFAULT ) , ( column_name ) = ( expression ) WHERE condition RETURNING colname output_name , colname"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( expression , DEFAULT ) , ( DEFAULT ) ON CONFLICT ( index_column_name , ( index_expression ) ) DO UPDATE SET ( column_name ) = ROW ( DEFAULT ) , ( column_name ) = ( expression ) WHERE condition RETURNING colname output_name , colname"), Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( expression ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US , index_column_name COLLATE en_US ) DO UPDATE SET ( column_name ) = ROW ( DEFAULT ) , ( column_name ) = ( expression ) WHERE condition RETURNING colname output_name , colname"), Unimplemented("INSERT INTO table_name ( column_name , column_name ) VALUES ( DEFAULT , DEFAULT ) , ( expression ) ON CONFLICT ( ( index_expression ) , index_column_name opclass ) DO UPDATE SET ( column_name ) = ROW ( DEFAULT ) , ( column_name ) = ( expression ) WHERE condition RETURNING colname output_name , colname"), @@ -6338,7 +6338,7 @@ func TestInsert(t *testing.T) { Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name AS alias VALUES ( DEFAULT , DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US , ( index_expression ) COLLATE en_US ) DO UPDATE SET ( column_name , column_name ) = ( DEFAULT ) WHERE condition RETURNING colname output_name , colname output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( expression , DEFAULT ) , ( DEFAULT ) ON CONFLICT ( ( index_expression ) opclass , ( index_expression ) COLLATE en_US opclass ) DO UPDATE SET ( column_name ) = ROW ( DEFAULT ) WHERE condition RETURNING colname output_name , colname output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( expression , DEFAULT ) , ( expression , expression ) ON CONFLICT ( ( index_expression ) , index_column_name COLLATE en_US opclass ) DO UPDATE SET ( column_name , column_name ) = ROW ( DEFAULT ) WHERE condition RETURNING colname output_name , colname output_name"), - Parses("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( expression , DEFAULT ) , ( DEFAULT , expression ) ON CONFLICT ( index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( expression , expression ) WHERE condition RETURNING colname output_name , colname output_name"), + Converts("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( expression , DEFAULT ) , ( DEFAULT , expression ) ON CONFLICT ( index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( expression , expression ) WHERE condition RETURNING colname output_name , colname output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name AS alias ( column_name , column_name ) VALUES ( DEFAULT ) , ( expression , DEFAULT ) ON CONFLICT ( ( index_expression ) ) DO UPDATE SET ( column_name , column_name ) = ROW ( expression , expression ) WHERE condition RETURNING colname output_name , colname output_name"), Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( DEFAULT , expression ) , ( DEFAULT , expression ) ON CONFLICT ( ( index_expression ) COLLATE en_US opclass , index_column_name opclass ) WHERE index_predicate DO UPDATE SET ( column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname output_name , colname output_name"), Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias VALUES ( expression , DEFAULT ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US opclass , index_column_name opclass ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ROW ( DEFAULT , expression ) WHERE condition RETURNING colname output_name , colname output_name"), @@ -6592,7 +6592,7 @@ func TestInsert(t *testing.T) { Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( expression ) , ( expression , expression ) ON CONFLICT ( ( index_expression ) opclass , ( index_expression ) COLLATE en_US opclass ) WHERE index_predicate DO UPDATE SET ( column_name ) = ( DEFAULT ) , ( column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname output_name , colname output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( expression ) , ( expression , DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US opclass ) DO UPDATE SET ( column_name , column_name ) = ROW ( DEFAULT ) , ( column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname output_name , colname output_name"), Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( expression , DEFAULT ) , ( expression , expression ) ON CONFLICT ( index_column_name COLLATE en_US opclass , index_column_name ) WHERE index_predicate DO UPDATE SET ( column_name ) = ( expression , expression ) , ( column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname output_name , colname output_name"), - Parses("WITH queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( expression , expression ) , ( DEFAULT , expression ) ON CONFLICT ( index_column_name , index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( expression , expression ) , ( column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname output_name , colname output_name"), + Converts("WITH queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( expression , expression ) , ( DEFAULT , expression ) ON CONFLICT ( index_column_name , index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( expression , expression ) , ( column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname output_name , colname output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name , column_name ) VALUES ( expression , DEFAULT ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US , index_column_name COLLATE en_US ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ROW ( expression , expression ) , ( column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname output_name , colname output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name VALUES ( DEFAULT , DEFAULT ) , ( expression , DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US , index_column_name COLLATE en_US ) DO UPDATE SET ( column_name ) = ( DEFAULT , expression ) , ( column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname output_name , colname output_name"), Unimplemented("INSERT INTO table_name AS alias ( column_name ) VALUES ( expression ) , ( expression , expression ) ON CONFLICT ( index_column_name COLLATE en_US , index_column_name ) WHERE index_predicate DO UPDATE SET ( column_name ) = ( DEFAULT , expression ) , ( column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname output_name , colname output_name"), @@ -7083,7 +7083,7 @@ func TestInsert(t *testing.T) { Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( DEFAULT , expression ) , ( expression , expression ) ON CONFLICT ( ( index_expression ) COLLATE en_US opclass , ( index_expression ) COLLATE en_US opclass ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ( expression , DEFAULT ) , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname AS output_name , colname output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name AS alias VALUES ( expression , DEFAULT ) , ( DEFAULT , expression ) ON CONFLICT ( ( index_expression ) , index_column_name opclass ) WHERE index_predicate DO UPDATE SET ( column_name ) = ROW ( expression , DEFAULT ) , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname AS output_name , colname output_name"), Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( expression , DEFAULT ) ON CONFLICT ( ( index_expression ) , ( index_expression ) COLLATE en_US ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ROW ( expression , DEFAULT ) , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname AS output_name , colname output_name"), - Parses("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( expression , DEFAULT ) , ( expression , DEFAULT ) ON CONFLICT ( index_column_name , index_column_name ) DO UPDATE SET ( column_name ) = ( DEFAULT , DEFAULT ) , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname AS output_name , colname output_name"), + Converts("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( expression , DEFAULT ) , ( expression , DEFAULT ) ON CONFLICT ( index_column_name , index_column_name ) DO UPDATE SET ( column_name ) = ( DEFAULT , DEFAULT ) , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname AS output_name , colname output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( DEFAULT ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( index_column_name opclass , ( index_expression ) COLLATE en_US opclass ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ( DEFAULT , DEFAULT ) , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname AS output_name , colname output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( DEFAULT , DEFAULT ) , ( expression , DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US , index_column_name COLLATE en_US opclass ) DO UPDATE SET ( column_name , column_name ) = ROW ( DEFAULT , DEFAULT ) , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname AS output_name , colname output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( expression , DEFAULT ) , ( expression , DEFAULT ) ON CONFLICT ( index_column_name opclass , index_column_name COLLATE en_US ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ROW ( DEFAULT , DEFAULT ) , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname AS output_name , colname output_name"), @@ -7678,7 +7678,7 @@ func TestInsert(t *testing.T) { Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias VALUES ( DEFAULT , expression ) , ( expression , DEFAULT ) ON CONFLICT ( index_column_name opclass , index_column_name ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ROW ( DEFAULT , DEFAULT ) , ( column_name , column_name ) = ROW ( expression ) WHERE condition RETURNING colname , colname AS output_name"), Unimplemented("INSERT INTO table_name VALUES ( expression , DEFAULT ) , ( DEFAULT , expression ) ON CONFLICT ( index_column_name opclass , ( index_expression ) COLLATE en_US opclass ) DO UPDATE SET ( column_name , column_name ) = ( SELECT 1 ) , ( column_name , column_name ) = ROW ( expression ) WHERE condition RETURNING colname , colname AS output_name"), Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( DEFAULT , DEFAULT ) ON CONFLICT ( index_column_name COLLATE en_US , ( index_expression ) opclass ) DO UPDATE SET column_name = expression , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname , colname AS output_name"), - Parses("WITH queryname AS ( select ) INSERT INTO table_name VALUES ( expression ) ON CONFLICT ( index_column_name ) DO UPDATE SET column_name = DEFAULT , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname , colname AS output_name"), + Converts("WITH queryname AS ( select ) INSERT INTO table_name VALUES ( expression ) ON CONFLICT ( index_column_name ) DO UPDATE SET column_name = DEFAULT , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname , colname AS output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( DEFAULT , DEFAULT ) , ( expression , DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US opclass ) WHERE index_predicate DO UPDATE SET ( column_name ) = ( expression ) , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname , colname AS output_name"), Unimplemented("INSERT INTO table_name VALUES ( DEFAULT , DEFAULT ) , ( expression ) ON CONFLICT ( index_column_name COLLATE en_US , index_column_name COLLATE en_US ) WHERE index_predicate DO UPDATE SET ( column_name ) = ( expression ) , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname , colname AS output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) SELECT 1 ON CONFLICT ( ( index_expression ) COLLATE en_US opclass , index_column_name COLLATE en_US opclass ) DO UPDATE SET ( column_name , column_name ) = ( expression ) , ( column_name ) = ( DEFAULT ) WHERE condition RETURNING colname , colname AS output_name"), @@ -8252,7 +8252,7 @@ func TestInsert(t *testing.T) { Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name VALUES ( expression , expression ) , ( expression ) ON CONFLICT ( index_column_name , ( index_expression ) opclass ) DO UPDATE SET ( column_name ) = ( expression , DEFAULT ) WHERE condition RETURNING colname output_name , colname AS output_name"), Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name , column_name ) VALUES ( DEFAULT , DEFAULT ) , ( DEFAULT , expression ) ON CONFLICT ( index_column_name , ( index_expression ) COLLATE en_US ) WHERE index_predicate DO UPDATE SET ( column_name ) = ( expression , DEFAULT ) WHERE condition RETURNING colname output_name , colname AS output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( DEFAULT , expression ) , ( expression ) ON CONFLICT ( index_column_name COLLATE en_US opclass , ( index_expression ) COLLATE en_US ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ROW ( expression , DEFAULT ) WHERE condition RETURNING colname output_name , colname AS output_name"), - Parses("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( expression ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( index_column_name ) DO UPDATE SET ( column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname output_name , colname AS output_name"), + Converts("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( expression ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( index_column_name ) DO UPDATE SET ( column_name ) = ( DEFAULT , DEFAULT ) WHERE condition RETURNING colname output_name , colname AS output_name"), Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name , column_name ) VALUES ( DEFAULT , expression ) ON CONFLICT ( index_column_name COLLATE en_US opclass , ( index_expression ) ) DO UPDATE SET ( column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname output_name , colname AS output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name , column_name ) VALUES ( expression , expression ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( ( index_expression ) , index_column_name COLLATE en_US opclass ) WHERE index_predicate DO UPDATE SET ( column_name ) = ( SELECT 1 ) WHERE condition RETURNING colname output_name , colname AS output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( expression , expression ) , ( DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US opclass , ( index_expression ) COLLATE en_US opclass ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ( expression ) , column_name = expression WHERE condition RETURNING colname output_name , colname AS output_name"), @@ -8989,7 +8989,7 @@ func TestInsert(t *testing.T) { Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias VALUES ( DEFAULT ) , ( expression ) ON CONFLICT ( index_column_name COLLATE en_US ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ( expression , DEFAULT ) , ( column_name , column_name ) = ROW ( DEFAULT ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), Unimplemented("INSERT INTO table_name ( column_name ) VALUES ( expression , DEFAULT ) ON CONFLICT ( ( index_expression ) opclass , ( index_expression ) COLLATE en_US opclass ) DO UPDATE SET ( column_name ) = ( DEFAULT , DEFAULT ) , ( column_name , column_name ) = ROW ( DEFAULT ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias ( column_name ) VALUES ( DEFAULT , DEFAULT ) , ( DEFAULT ) ON CONFLICT ( index_column_name COLLATE en_US , ( index_expression ) COLLATE en_US opclass ) WHERE index_predicate DO UPDATE SET ( column_name ) = ( SELECT 1 ) , ( column_name , column_name ) = ROW ( DEFAULT ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), - Parses("WITH queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( DEFAULT ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( expression ) , ( column_name ) = ( expression , expression ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), + Converts("WITH queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( DEFAULT ) , ( DEFAULT , DEFAULT ) ON CONFLICT ( index_column_name ) DO UPDATE SET ( column_name , column_name ) = ( expression ) , ( column_name ) = ( expression , expression ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), Unimplemented("INSERT INTO table_name AS alias ( column_name , column_name ) VALUES ( expression , expression ) , ( DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US opclass , index_column_name COLLATE en_US ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ( expression ) , ( column_name ) = ( expression , expression ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name VALUES ( expression , expression ) , ( expression , expression ) ON CONFLICT ( ( index_expression ) , index_column_name ) WHERE index_predicate DO UPDATE SET ( column_name ) = ROW ( expression ) , ( column_name ) = ( expression , expression ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), Unimplemented("WITH queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias VALUES ( expression , DEFAULT ) , ( DEFAULT ) ON CONFLICT ( ( index_expression ) COLLATE en_US , index_column_name ) WHERE index_predicate DO UPDATE SET ( column_name ) = ROW ( expression ) , ( column_name ) = ( expression , expression ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), @@ -9045,7 +9045,7 @@ func TestInsert(t *testing.T) { Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name VALUES ( expression ) , ( expression , DEFAULT ) ON CONFLICT ON CONSTRAINT constraint_name DO UPDATE SET ( column_name , column_name ) = ROW ( expression , DEFAULT ) , ( column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( DEFAULT , expression ) , ( DEFAULT , expression ) ON CONFLICT ( index_column_name COLLATE en_US opclass , index_column_name COLLATE en_US opclass ) WHERE index_predicate DO UPDATE SET ( column_name , column_name ) = ROW ( DEFAULT , DEFAULT ) , ( column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) , queryname AS ( select ) INSERT INTO table_name AS alias VALUES ( expression , expression ) ON CONFLICT ( ( index_expression ) , index_column_name COLLATE en_US ) DO UPDATE SET ( column_name ) = ( SELECT 1 ) , ( column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), - Parses("WITH queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( expression , DEFAULT ) , ( expression , DEFAULT ) ON CONFLICT ( index_column_name , index_column_name ) DO UPDATE SET ( column_name ) = ( DEFAULT ) , ( column_name , column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), + Converts("WITH queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( expression , DEFAULT ) , ( expression , DEFAULT ) ON CONFLICT ( index_column_name , index_column_name ) DO UPDATE SET ( column_name ) = ( DEFAULT ) , ( column_name , column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name AS alias VALUES ( expression ) , ( expression , DEFAULT ) ON CONFLICT ( index_column_name COLLATE en_US opclass ) DO UPDATE SET ( column_name , column_name ) = ROW ( DEFAULT ) , ( column_name , column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), Unimplemented("WITH queryname AS ( select ) INSERT INTO table_name ( column_name , column_name ) VALUES ( expression , DEFAULT ) , ( DEFAULT , expression ) ON CONFLICT ( ( index_expression ) COLLATE en_US , ( index_expression ) COLLATE en_US opclass ) DO UPDATE SET ( column_name ) = ( expression , expression ) , ( column_name , column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), Unimplemented("WITH RECURSIVE queryname AS ( select ) INSERT INTO table_name ( column_name ) VALUES ( expression ) , ( expression , DEFAULT ) ON CONFLICT DO UPDATE SET ( column_name , column_name ) = ( expression , expression ) , ( column_name , column_name ) = ( DEFAULT , expression ) WHERE condition RETURNING colname AS output_name , colname AS output_name"), diff --git a/testing/go/framework.go b/testing/go/framework.go index 31a4213321..9e8e4b730e 100644 --- a/testing/go/framework.go +++ b/testing/go/framework.go @@ -279,7 +279,7 @@ func runScript(t *testing.T, ctx context.Context, script ScriptTest, conn *Conne require.NoError(t, err) } } else if assertion.ExpectedTag != "" { - commandTag, err := conn.Exec(ctx, assertion.Query) + commandTag, err := conn.Exec(ctx, assertion.Query, assertion.BindVars...) require.NoError(t, err) tag := assertion.ExpectedTag if tag == EmptyCommandTag { diff --git a/testing/go/insert_test.go b/testing/go/insert_test.go index 7e887b913e..7c81f812c6 100755 --- a/testing/go/insert_test.go +++ b/testing/go/insert_test.go @@ -138,6 +138,56 @@ ON CONFLICT (id) do update set c1 = $4`, }, }, }, + { + Name: "conditional on conflict update", + SetUpScript: []string{ + "CREATE TABLE conditional_upsert (id INT PRIMARY KEY, version INT, note TEXT)", + "INSERT INTO conditional_upsert VALUES (1, 5, 'original'), (2, 1, 'second')", + }, + Assertions: []ScriptTestAssertion{ + { + Query: "INSERT INTO conditional_upsert VALUES (1, 6, 'advanced') ON CONFLICT (id) DO UPDATE SET version = 6, note = 'advanced' WHERE conditional_upsert.version < 6", + ExpectedTag: "INSERT 0 1", + }, + { + Query: "INSERT INTO conditional_upsert VALUES (1, 4, 'stale') ON CONFLICT (id) DO UPDATE SET version = 4, note = 'stale' WHERE conditional_upsert.version < 4", + ExpectedTag: "INSERT 0 0", + }, + { + Query: "INSERT INTO conditional_upsert VALUES (1, 7, 'one'), (2, 0, 'two'), (3, 3, 'three') ON CONFLICT (id) DO UPDATE SET version = 7, note = 'updated' WHERE conditional_upsert.version <= 5", + ExpectedTag: "INSERT 0 2", + }, + { + Query: "INSERT INTO conditional_upsert VALUES (2, 8, 'null predicate') ON CONFLICT (id) DO UPDATE SET version = 8 WHERE NULL", + ExpectedTag: "INSERT 0 0", + }, + { + Query: "INSERT INTO conditional_upsert VALUES (2, $1, 'bound') ON CONFLICT (id) DO UPDATE SET version = $1, note = 'bound' WHERE conditional_upsert.version < $1", + BindVars: []any{8}, + ExpectedTag: "INSERT 0 1", + }, + { + Query: "INSERT INTO conditional_upsert VALUES (1, 9, 'proposed') ON CONFLICT (id) DO UPDATE SET version = excluded.version, note = excluded.note WHERE conditional_upsert.version < excluded.version RETURNING id, version, note", + Expected: []sql.Row{{1, 9, "proposed"}}, + }, + { + Query: "INSERT INTO conditional_upsert VALUES (1, 10, 'casted') ON CONFLICT (id) DO UPDATE SET version = excluded.version::BIGINT, note = excluded.note WHERE conditional_upsert.version < excluded.version RETURNING id, version", + Expected: []sql.Row{{1, 10}}, + }, + { + Query: "INSERT INTO conditional_upsert SELECT 1, 11::BIGINT, 'selected' ON CONFLICT (id) DO UPDATE SET version = excluded.version, note = excluded.note WHERE conditional_upsert.version < excluded.version RETURNING id, version, note", + Expected: []sql.Row{{1, 11, "selected"}}, + }, + { + Query: "SELECT * FROM conditional_upsert ORDER BY id", + Expected: []sql.Row{ + {1, 11, "selected"}, + {2, 8, "bound"}, + {3, 3, "three"}, + }, + }, + }, + }, { Name: "null and unspecified default values", SetUpScript: []string{