@@ -60,6 +60,7 @@ module.exports = grammar({
6060 select_body : $ => prec . left ( repeat1 ( choice (
6161 $ . from_clause ,
6262 $ . window_function , // Window functions like ROW_NUMBER() OVER (...)
63+ $ . cast_expression , // CAST(expr AS type), TRY_CAST(expr AS type)
6364 $ . function_call , // Regular function calls like COUNT(), SUM()
6465 $ . sql_keyword ,
6566 $ . string ,
@@ -175,6 +176,7 @@ module.exports = grammar({
175176 // Token-by-token fallback for any other subquery content
176177 subquery_body : $ => repeat1 ( choice (
177178 $ . window_function ,
179+ $ . cast_expression ,
178180 $ . function_call ,
179181 $ . sql_keyword ,
180182 $ . string ,
@@ -185,6 +187,23 @@ module.exports = grammar({
185187 token ( / [ ^ \s ; ( ) , ' \" ] + / )
186188 ) ) ,
187189
190+ // CAST/TRY_CAST expression: CAST(expr AS type) or TRY_CAST(expr AS type)
191+ // Higher precedence than function_call to win over treating CAST as a regular function
192+ cast_expression : $ => prec ( 3 , seq (
193+ choice ( caseInsensitive ( 'CAST' ) , caseInsensitive ( 'TRY_CAST' ) ) ,
194+ '(' ,
195+ $ . positional_arg ,
196+ caseInsensitive ( 'AS' ) ,
197+ $ . type_name ,
198+ ')'
199+ ) ) ,
200+
201+ // Type name for CAST expressions: DATE, VARCHAR, DECIMAL(10,2), etc.
202+ type_name : $ => seq (
203+ $ . identifier ,
204+ optional ( seq ( '(' , $ . number , optional ( seq ( ',' , $ . number ) ) , ')' ) )
205+ ) ,
206+
188207 // Function call with parentheses (can be empty like ROW_NUMBER())
189208 // Used in window functions and general SQL
190209 function_call : $ => prec ( 2 , seq (
@@ -288,6 +307,8 @@ module.exports = grammar({
288307 $ . number ,
289308 $ . string ,
290309 '*' ,
310+ // CAST/TRY_CAST expression
311+ $ . cast_expression ,
291312 // Nested function call
292313 $ . function_call ,
293314 // Arithmetic/comparison expression (binary operators)
0 commit comments