Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 17 additions & 4 deletions tree-sitter-ggsql/grammar.js
Original file line number Diff line number Diff line change
Expand Up @@ -276,12 +276,25 @@ module.exports = grammar({
field('value', $.positional_arg)
),

positional_arg: $ => choice(
$.identifier,
// Positional argument: supports complex expressions including:
// - Simple values: identifier, number, string, *
// - Qualified names: table.column
// - Nested function calls: ROUND(AVG(x), 2)
// - Arithmetic expressions: quantity * price
// - Type casts: value::type
positional_arg: $ => prec.left(choice(
// Simple values
$.qualified_name, // Handles both simple identifiers and table.column
$.number,
$.string,
'*'
),
'*',
// Nested function call
$.function_call,
// Arithmetic/comparison expression (binary operators)
seq($.positional_arg, choice('+', '-', '*', '/', '%', '||', '::', '<', '>', '<=', '>=', '=', '!=', '<>'), $.positional_arg),
// Parenthesized expression
seq('(', $.positional_arg, ')')
)),

// Namespaced identifier: matches "namespace:name" pattern
// Examples: ggsql:penguins, ggsql:airquality
Expand Down
157 changes: 155 additions & 2 deletions tree-sitter-ggsql/test/corpus/basic.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1123,8 +1123,9 @@ DRAW line MAPPING x AS x, total AS y
(function_args
(function_arg
(positional_arg
(identifier
(bare_identifier)))))
(qualified_name
(identifier
(bare_identifier))))))
(window_specification
(window_order_clause
(order_item
Expand Down Expand Up @@ -2101,3 +2102,155 @@ SELECT * FROM "data.csv"
(qualified_name
(identifier
(quoted_identifier))))))))))

================================================================================
Qualified name in function argument
================================================================================

SELECT SUM(s.quantity) FROM sales s VISUALISE DRAW bar MAPPING x AS x

--------------------------------------------------------------------------------

(query
(sql_portion
(sql_statement
(select_statement
(select_body
(function_call
(identifier
(bare_identifier))
(function_args
(function_arg
(positional_arg
(qualified_name
(identifier
(bare_identifier))
(identifier
(bare_identifier)))))))
(from_clause
(table_ref
table: (qualified_name
(identifier
(bare_identifier)))
alias: (identifier
(bare_identifier))))))))
(visualise_statement
(visualise_keyword)
(viz_clause
(draw_clause
(geom_type)
(mapping_clause
(mapping_list
(mapping_element
(explicit_mapping
value: (mapping_value
(column_reference
(identifier
(bare_identifier))))
aesthetic: (aesthetic_name)))))))))

================================================================================
Nested function calls
================================================================================

SELECT ROUND(AVG(price), 2) as avg FROM data VISUALISE DRAW bar MAPPING x AS x

--------------------------------------------------------------------------------

(query
(sql_portion
(sql_statement
(select_statement
(select_body
(function_call
(identifier
(bare_identifier))
(function_args
(function_arg
(positional_arg
(function_call
(identifier
(bare_identifier))
(function_args
(function_arg
(positional_arg
(qualified_name
(identifier
(bare_identifier)))))))))
(function_arg
(positional_arg
(number)))))
(identifier
(bare_identifier))
(identifier
(bare_identifier))
(from_clause
(table_ref
table: (qualified_name
(identifier
(bare_identifier)))))))))
(visualise_statement
(visualise_keyword)
(viz_clause
(draw_clause
(geom_type)
(mapping_clause
(mapping_list
(mapping_element
(explicit_mapping
value: (mapping_value
(column_reference
(identifier
(bare_identifier))))
aesthetic: (aesthetic_name)))))))))

================================================================================
Arithmetic in function argument
================================================================================

SELECT SUM(quantity * price) as total FROM data VISUALISE DRAW bar MAPPING x AS x

--------------------------------------------------------------------------------

(query
(sql_portion
(sql_statement
(select_statement
(select_body
(function_call
(identifier
(bare_identifier))
(function_args
(function_arg
(positional_arg
(positional_arg
(qualified_name
(identifier
(bare_identifier))))
(positional_arg
(qualified_name
(identifier
(bare_identifier))))))))
(identifier
(bare_identifier))
(identifier
(bare_identifier))
(from_clause
(table_ref
table: (qualified_name
(identifier
(bare_identifier)))))))))
(visualise_statement
(visualise_keyword)
(viz_clause
(draw_clause
(geom_type)
(mapping_clause
(mapping_list
(mapping_element
(explicit_mapping
value: (mapping_value
(column_reference
(identifier
(bare_identifier))))
aesthetic: (aesthetic_name)))))))))