Skip to content

Commit 34a0a13

Browse files
committed
Fix MERGE statement parsing for derived tables and TableAlias
- Fixed parseMergeSourceTableReference to handle derived table subqueries - Added TableAlias field to MergeSpecification for target table alias - Move target alias to MergeSpecification.TableAlias per ScriptDOM convention - Enabled MergeStatementTests160 and Baselines160_MergeStatementTests160 tests
1 parent 8be8900 commit 34a0a13

4 files changed

Lines changed: 18 additions & 4 deletions

File tree

ast/merge_statement.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ func (s *MergeStatement) statement() {}
1111
// MergeSpecification represents the specification of a MERGE statement
1212
type MergeSpecification struct {
1313
Target TableReference // The target table
14+
TableAlias *Identifier // Alias for the USING clause table reference (e.g., AS src)
1415
TableReference TableReference // The USING clause table reference
1516
SearchCondition BooleanExpression // The ON clause condition (may be GraphMatchPredicate)
1617
ActionClauses []*MergeActionClause

parser/marshal.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3100,6 +3100,9 @@ func mergeSpecificationToJSON(spec *ast.MergeSpecification) jsonNode {
31003100
node := jsonNode{
31013101
"$type": "MergeSpecification",
31023102
}
3103+
if spec.TableAlias != nil {
3104+
node["TableAlias"] = identifierToJSON(spec.TableAlias)
3105+
}
31033106
if spec.TableReference != nil {
31043107
node["TableReference"] = tableReferenceToJSON(spec.TableReference)
31053108
}
@@ -4286,14 +4289,19 @@ func (p *Parser) parseMergeStatement() (*ast.MergeStatement, error) {
42864289
if err != nil {
42874290
return nil, err
42884291
}
4292+
// If target has an alias, move it to TableAlias (ScriptDOM convention)
4293+
if ntr, ok := target.(*ast.NamedTableReference); ok && ntr.Alias != nil {
4294+
stmt.MergeSpecification.TableAlias = ntr.Alias
4295+
ntr.Alias = nil
4296+
}
42894297
stmt.MergeSpecification.Target = target
42904298

42914299
// Expect USING
42924300
if strings.ToUpper(p.curTok.Literal) == "USING" {
42934301
p.nextToken()
42944302
}
42954303

4296-
// Parse source table reference (may be parenthesized join)
4304+
// Parse source table reference (may be parenthesized join or subquery)
42974305
sourceRef, err := p.parseMergeSourceTableReference()
42984306
if err != nil {
42994307
return nil, err
@@ -4348,8 +4356,13 @@ func (p *Parser) parseMergeStatement() (*ast.MergeStatement, error) {
43484356

43494357
// parseMergeSourceTableReference parses the source table reference in a MERGE statement
43504358
func (p *Parser) parseMergeSourceTableReference() (ast.TableReference, error) {
4351-
// Check for parenthesized expression (usually joins)
4359+
// Check for parenthesized expression
43524360
if p.curTok.Type == TokenLParen {
4361+
// Check if this is a derived table (subquery) or a join
4362+
if p.peekTok.Type == TokenSelect {
4363+
// This is a derived table like (SELECT ...) AS alias
4364+
return p.parseDerivedTableReference()
4365+
}
43534366
p.nextToken() // consume (
43544367
// Parse the inner join expression
43554368
inner, err := p.parseMergeJoinTableReference()
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}

0 commit comments

Comments
 (0)