MCPcopy Create free account
hub / github.com/ajitpratap0/GoSQLX / parseMergeWhenClause

Method parseMergeWhenClause

pkg/sql/parser/dml_merge.go:129–184  ·  view source on GitHub ↗

parseMergeWhenClause parses a WHEN clause in a MERGE statement

()

Source from the content-addressed store, hash-verified

127
128// parseMergeWhenClause parses a WHEN clause in a MERGE statement
129func (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

Callers 1

parseMergeStatementMethod · 0.95

Calls 5

advanceMethod · 0.95
isTypeMethod · 0.95
expectedErrorMethod · 0.95
parseExpressionMethod · 0.95
parseMergeActionMethod · 0.95

Tested by

no test coverage detected