Skip to content

Commit 9d7244b

Browse files
Ajit Pratap Singhclaude
authored andcommitted
feat: implement comprehensive subquery and expression parsing
Parser Features: - Add subquery support in WHERE clause (scalar subqueries) - Add EXISTS/NOT EXISTS subquery expressions - Add IN/NOT IN with subquery support - Add ANY/ALL subquery operators (= ANY, > ALL, etc.) - Add CASE expression parsing (simple and searched forms) - Add BETWEEN/NOT BETWEEN operator parsing - Add LIKE/NOT LIKE/ILIKE pattern matching - Add IS NULL/IS NOT NULL postfix operators - Add parenthesized expression handling - Add NULL literal support AST Changes: - Add SubqueryExpression for scalar subqueries - Add AnyExpression for expr op ANY (subquery) - Add AllExpression for expr op ALL (subquery) - Update InExpression to support both value lists and subqueries This significantly improves SQL-99 compliance and real-world SQL parsing. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent ca3f309 commit 9d7244b

4 files changed

Lines changed: 435 additions & 18 deletions

File tree

pkg/sql/ast/ast.go

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -309,21 +309,57 @@ func (e ExistsExpression) Children() []Node {
309309
return []Node{e.Subquery}
310310
}
311311

312-
// InExpression represents expr IN (values)
312+
// InExpression represents expr IN (values) or expr IN (subquery)
313313
type InExpression struct {
314-
Expr Expression
315-
List []Expression
316-
Not bool
314+
Expr Expression
315+
List []Expression // For value list: IN (1, 2, 3)
316+
Subquery Statement // For subquery: IN (SELECT ...)
317+
Not bool
317318
}
318319

319320
func (i *InExpression) expressionNode() {}
320321
func (i InExpression) TokenLiteral() string { return "IN" }
321322
func (i InExpression) Children() []Node {
322323
children := []Node{i.Expr}
323-
children = append(children, nodifyExpressions(i.List)...)
324+
if i.Subquery != nil {
325+
children = append(children, i.Subquery)
326+
} else {
327+
children = append(children, nodifyExpressions(i.List)...)
328+
}
324329
return children
325330
}
326331

332+
// SubqueryExpression represents a scalar subquery (SELECT ...)
333+
type SubqueryExpression struct {
334+
Subquery Statement
335+
}
336+
337+
func (s *SubqueryExpression) expressionNode() {}
338+
func (s SubqueryExpression) TokenLiteral() string { return "SUBQUERY" }
339+
func (s SubqueryExpression) Children() []Node { return []Node{s.Subquery} }
340+
341+
// AnyExpression represents expr op ANY (subquery)
342+
type AnyExpression struct {
343+
Expr Expression
344+
Operator string
345+
Subquery Statement
346+
}
347+
348+
func (a *AnyExpression) expressionNode() {}
349+
func (a AnyExpression) TokenLiteral() string { return "ANY" }
350+
func (a AnyExpression) Children() []Node { return []Node{a.Expr, a.Subquery} }
351+
352+
// AllExpression represents expr op ALL (subquery)
353+
type AllExpression struct {
354+
Expr Expression
355+
Operator string
356+
Subquery Statement
357+
}
358+
359+
func (al *AllExpression) expressionNode() {}
360+
func (al AllExpression) TokenLiteral() string { return "ALL" }
361+
func (al AllExpression) Children() []Node { return []Node{al.Expr, al.Subquery} }
362+
327363
// BetweenExpression represents expr BETWEEN lower AND upper
328364
type BetweenExpression struct {
329365
Expr Expression

0 commit comments

Comments
 (0)