parseMergeWhenClause parses a WHEN clause in a MERGE statement
()
| 127 | |
| 128 | // parseMergeWhenClause parses a WHEN clause in a MERGE statement |
| 129 | func (p *Parser) parseMergeWhenClause() (*ast.MergeWhenClause, error) { |
| 130 | clause := &ast.MergeWhenClause{} |
| 131 | |
| 132 | p.advance() // Consume WHEN |
| 133 | |
| 134 | // Determine clause type: MATCHED, NOT MATCHED, NOT MATCHED BY SOURCE |
| 135 | if p.isType(models.TokenTypeMatched) || p.currentToken.Token.Value == "MATCHED" { |
| 136 | clause.Type = "MATCHED" |
| 137 | p.advance() // Consume MATCHED |
| 138 | } else if p.isType(models.TokenTypeNot) { |
| 139 | p.advance() // Consume NOT |
| 140 | if !p.isType(models.TokenTypeMatched) && p.currentToken.Token.Value != "MATCHED" { |
| 141 | return nil, p.expectedError("MATCHED after NOT") |
| 142 | } |
| 143 | p.advance() // Consume MATCHED |
| 144 | |
| 145 | // Check for BY SOURCE |
| 146 | if p.isType(models.TokenTypeBy) { |
| 147 | p.advance() // Consume BY |
| 148 | if !p.isType(models.TokenTypeSource) && p.currentToken.Token.Value != "SOURCE" { |
| 149 | return nil, p.expectedError("SOURCE after BY") |
| 150 | } |
| 151 | p.advance() // Consume SOURCE |
| 152 | clause.Type = "NOT_MATCHED_BY_SOURCE" |
| 153 | } else { |
| 154 | clause.Type = "NOT_MATCHED" |
| 155 | } |
| 156 | } else { |
| 157 | return nil, p.expectedError("MATCHED or NOT MATCHED") |
| 158 | } |
| 159 | |
| 160 | // Parse optional AND condition |
| 161 | if p.isType(models.TokenTypeAnd) { |
| 162 | p.advance() // Consume AND |
| 163 | condition, err := p.parseExpression() |
| 164 | if err != nil { |
| 165 | return nil, goerrors.WrapError(goerrors.ErrCodeInvalidSyntax, "error parsing WHEN condition", models.Location{}, "", err) |
| 166 | } |
| 167 | clause.Condition = condition |
| 168 | } |
| 169 | |
| 170 | // Parse THEN |
| 171 | if !p.isType(models.TokenTypeThen) { |
| 172 | return nil, p.expectedError("THEN") |
| 173 | } |
| 174 | p.advance() // Consume THEN |
| 175 | |
| 176 | // Parse action (UPDATE, INSERT, DELETE) |
| 177 | action, err := p.parseMergeAction(clause.Type) |
| 178 | if err != nil { |
| 179 | return nil, err |
| 180 | } |
| 181 | clause.Action = action |
| 182 | |
| 183 | return clause, nil |
| 184 | } |
| 185 | |
| 186 | // parseMergeAction parses the action in a WHEN clause |
no test coverage detected