From 67af857631ee6059ea83e1bda048e5eb8925d7c1 Mon Sep 17 00:00:00 2001 From: Andrew Lazarus Date: Wed, 13 Jul 2016 11:08:08 -0700 Subject: [PATCH 1/2] large refactor - add UPDATE - add DELETE FROM - add LIMIT - add FOR UPDATE - add DISTINCT - add COALESCE function - fix selecting literals, e.g. (1 + 1) - refactor racc - fix escaped quotes (both \' and '') - better detection of invalid sql (e.g. SELECT1) --- Rakefile | 2 +- lib/sql-parser/parser.racc | 104 +- lib/sql-parser/parser.racc.rb | 1765 ++++++++++++++++++--------------- lib/sql-parser/parser.rex | 105 +- lib/sql-parser/parser.rex.rb | 109 +- lib/sql-parser/sql_visitor.rb | 80 +- lib/sql-parser/statement.rb | 97 +- sql-parser.gemspec | 2 +- test/test_parser.rb | 74 +- test/test_statement.rb | 67 +- 10 files changed, 1416 insertions(+), 989 deletions(-) diff --git a/Rakefile b/Rakefile index 9bfd577..ea020da 100644 --- a/Rakefile +++ b/Rakefile @@ -21,4 +21,4 @@ end task :parser => [GENERATED_LEXER, GENERATED_PARSER] # Make sure the parser's up-to-date when we test. -Rake::Task['test'].prerequisites << :parser \ No newline at end of file +Rake::Task['test'].prerequisites << :parser diff --git a/lib/sql-parser/parser.racc b/lib/sql-parser/parser.racc index e1079d2..bd6c3fa 100644 --- a/lib/sql-parser/parser.racc +++ b/lib/sql-parser/parser.racc @@ -9,30 +9,29 @@ rule direct_sql_data_statement : direct_select_statement_multiple_rows | insert_specification + | update_statement + | delete_statement - direct_select_statement_multiple_rows - : query_expression order_by_clause { result = SQLParser::Statement::DirectSelect.new(val[0], val[1]) } + update_statement + : UPDATE table_reference SET assignment_list where_clause order_by_clause limit_clause { result = SQLParser::Statement::Update.new(val[1], val[3], val[4], val[5], val[6]) } -# module contents - order_by_clause - : # no action - | ORDER BY sort_specification_list { result = SQLParser::Statement::OrderBy.new(val[2]) } + assignment_list + : assignment_list comma assignment { result = Array(val[0]) + Array(val[2]) } + | assignment { result = Array(val[0]) } - sort_specification_list - : sort_specification_list comma sort_specification { result = Array(val[0]) + Array(val[2]) } - | sort_specification + assignment + : column_reference equals_operator value_expression { result = SQLParser::Statement::Assignment.new(val[0], val[2]) } - sort_specification - : sort_key ordering_specification { result = val[1].new(val[0]) } +# MySQL seems to support deletes from multiple tables http://dev.mysql.com/doc/refman/5.7/en/delete.html + delete_statement + : DELETE FROM table_reference where_clause order_by_clause limit_clause { result = SQLParser::Statement::Delete.new(val[2], val[3], val[4], val[5]) } - sort_key - : column_name - | unsigned_integer { result = SQLParser::Statement::Integer.new(val[0]) } + direct_select_statement_multiple_rows + : query_expression maybe_for_update { result = SQLParser::Statement::DirectSelect.new(val[0], val[1]) } - ordering_specification - : { result = SQLParser::Statement::Ascending } # default - | ASC { result = SQLParser::Statement::Ascending } - | DESC { result = SQLParser::Statement::Descending } + maybe_for_update + : # no action + | FOR UPDATE # queries subquery @@ -40,25 +39,25 @@ rule : left_paren query_expression right_paren { result = SQLParser::Statement::Subquery.new(val[1]) } query_expression - : query_specification + : SELECT distinct select_list table_expression { result = SQLParser::Statement::Select.new(val[1], val[2], val[3]) } insert_specification - : INSERT INTO table_reference value_list { result = SQLParser::Statement::Insert.new(val[2], nil, val[3]) } - | INSERT INTO table_reference column_list value_list { result = SQLParser::Statement::Insert.new(val[2], val[3], val[4]) } + : INSERT INTO table_factor column_list value_list { result = SQLParser::Statement::Insert.new(val[2], val[3], val[4]) } column_list - : left_paren in_column_list right_paren { result = SQLParser::Statement::InColumnList.new(val[1]) } + : # no action + | left_paren in_column_list right_paren { result = SQLParser::Statement::InColumnList.new(val[1]) } in_column_list - : value_expression comma in_column_list { result = Array(val[0]) + Array(val[2]) } - | value_expression + : column_reference comma in_column_list { result = Array(val[0]) + Array(val[2]) } + | column_reference value_list : VALUES left_paren in_value_list right_paren { result = SQLParser::Statement::InValueList.new(val[2]) } - query_specification - : SELECT select_list table_expression { result = SQLParser::Statement::Select.new(val[1], val[2]) } - | SELECT select_list { result = SQLParser::Statement::Select.new(val[1]) } + distinct + : # no action + | DISTINCT select_list : asterisk { result = SQLParser::Statement::All.new } @@ -71,18 +70,23 @@ rule derived_column : value_expression AS column_name { result = SQLParser::Statement::As.new(val[0], val[2]) } | value_expression column_name { result = SQLParser::Statement::As.new(val[0], val[1]) } + | search_condition | value_expression table_expression - : from_clause where_clause group_by_clause having_clause { result = SQLParser::Statement::TableExpression.new(val[0], val[1], val[2], val[3]) } + : # no action + | from_clause where_clause group_by_clause having_clause order_by_clause limit_clause { result = SQLParser::Statement::TableExpression.new(val[0], val[1], val[2], val[3], val[4], val[5]) } from_clause : FROM table_reference { result = SQLParser::Statement::FromClause.new(val[1]) } - table_reference + table_factor : table_name AS column_name { result = SQLParser::Statement::As.new(val[0], val[2]) } | table_name column_name { result = SQLParser::Statement::As.new(val[0], val[1]) } | table_name + + table_reference + : table_factor | joined_table table_subquery @@ -140,6 +144,30 @@ rule : # no action | HAVING search_condition { result = SQLParser::Statement::HavingClause.new(val[1]) } + order_by_clause + : # no action + | ORDER BY sort_specification_list { result = SQLParser::Statement::OrderBy.new(val[2]) } + + sort_specification_list + : sort_specification_list comma sort_specification { result = Array(val[0]) + Array(val[2]) } + | sort_specification + + sort_specification + : sort_key ordering_specification { result = val[1].new(val[0]) } + + sort_key + : column_reference + | value_expression + + ordering_specification + : { result = SQLParser::Statement::Ascending } # default + | ASC { result = SQLParser::Statement::Ascending } + | DESC { result = SQLParser::Statement::Descending } + + limit_clause + : # no action + | LIMIT unsigned_integer { result = SQLParser::Statement::Limit.new(val[1]) } + # query expression components row_subquery : subquery @@ -196,9 +224,6 @@ rule | boolean_test boolean_test - : boolean_primary - - boolean_primary : predicate | left_paren search_condition right_paren { result = val[1] } @@ -209,6 +234,7 @@ rule | like_predicate | null_predicate | exists_predicate + | value_expression comparison_predicate : row_value_constructor equals_operator row_value_constructor { result = SQLParser::Statement::Equals.new(val[0], val[2]) } @@ -225,6 +251,10 @@ rule row_value_constructor_element : value_expression + value_expression_list + : value_expression_list comma value_expresson { result = Array(val[0]) + Array(val[2]) } + | value_expression + value_expression : numeric_value_expression | general_literal @@ -248,6 +278,7 @@ rule | column_reference | set_function_specification | left_paren value_expression right_paren { result = val[1] } + | NULL { result = SQLParser::Statement::Null.new } unsigned_value_specification : unsigned_literal @@ -261,14 +292,18 @@ rule : CURRENT_USER { result = SQLParser::Statement::CurrentUser.new } column_reference - : qualifier period column_name { result = SQLParser::Statement::QualifiedColumn.new(val[0], val[2]) } + : qualifier period column_or_star { result = SQLParser::Statement::QualifiedColumn.new(val[0], val[2]) } | column_name + column_or_star + : column_name + | asterisk { result = SQLParser::Statement::All.new } + qualifier : table_name set_function_specification - : COUNT left_paren asterisk right_paren { result = SQLParser::Statement::Count.new(SQLParser::Statement::All.new) } + : COUNT left_paren distinct asterisk right_paren { result = SQLParser::Statement::Count.new(SQLParser::Statement::All.new) } | general_set_function general_set_function @@ -277,6 +312,7 @@ rule | MAX left_paren value_expression right_paren { result = SQLParser::Statement::Maximum.new(val[2]) } | MIN left_paren value_expression right_paren { result = SQLParser::Statement::Minimum.new(val[2]) } | SUM left_paren value_expression right_paren { result = SQLParser::Statement::Sum.new(val[2]) } + | COALESCE left_paren value_expression_list right_paren { result = SQLParser::Statement::Coalesce.new(val[2]) } # literal numbers, strings, dates and times unsigned_numeric_literal diff --git a/lib/sql-parser/parser.racc.rb b/lib/sql-parser/parser.racc.rb index a14a43c..06381b5 100644 --- a/lib/sql-parser/parser.racc.rb +++ b/lib/sql-parser/parser.racc.rb @@ -11,7 +11,7 @@ module SQLParser class Parser < Racc::Parser -module_eval(<<'...end parser.racc/module_eval...', 'parser.racc', 329) +module_eval(<<'...end parser.racc/module_eval...', 'parser.racc', 365) def self.parse(sql) new.scan_str(sql) @@ -20,540 +20,656 @@ def self.parse(sql) ##### State transition tables begin ### racc_action_table = [ - 44, 70, 166, 145, 215, 91, 91, 65, 103, 226, - 7, 130, 131, 8, 126, 227, 138, 217, 44, 218, - 219, 220, 85, 84, 152, 68, 69, 139, 140, 67, - 67, 149, 18, 185, 71, 141, 44, 67, 67, 220, - 47, 48, 67, 32, 45, 36, 38, 39, 40, 41, - 18, 49, 144, 52, 47, 48, 60, 135, 47, 48, - 165, 32, 45, 36, 38, 39, 40, 41, 18, 49, - 44, 52, -123, 28, 137, 167, 47, 48, 8, 32, - 45, 36, 38, 39, 40, 41, 168, 49, 44, 52, - 169, 28, 170, 171, 95, 173, 174, 14, 128, 60, - 60, 180, 18, -123, -123, -123, 181, 127, 185, 122, - 47, 48, 197, 32, 45, 36, 38, 39, 40, 41, - 18, 49, 44, 52, 200, 28, 67, 114, 47, 48, - 8, 32, 45, 36, 38, 39, 40, 41, 203, 49, - 44, 52, 204, 220, 67, 60, 18, 214, 106, 114, - 86, 83, 82, 222, 18, 81, -142, 80, 44, 79, - 78, 220, 47, 48, 77, 32, 45, 36, 38, 39, - 40, 41, 18, 49, 76, 52, 75, 8, -79, 64, - 47, 48, 63, 32, 45, 36, 38, 39, 40, 41, - 18, 49, 44, 52, 237, 145, 185, 238, 47, 48, - 200, 32, 45, 36, 38, 39, 40, 41, 60, 49, - 44, 52, 222, 28, 54, 53, 152, 242, 12, 244, - 185, 67, 18, 149, 18, 249, 11, 251, 44, 252, - 253, 28, 47, 48, 9, 32, 45, 36, 38, 39, - 40, 41, 18, 49, 67, 52, nil, nil, nil, nil, - 47, 48, nil, 32, 45, 36, 38, 39, 40, 41, - 18, 49, 44, 52, nil, 145, nil, nil, 47, 48, - nil, 32, 45, 36, 38, 39, 40, 41, nil, 49, - 44, 52, 96, 28, nil, nil, 152, nil, nil, nil, - nil, nil, nil, 149, 18, 97, nil, 99, 100, nil, - 101, 102, 47, 48, nil, 32, 45, 36, 38, 39, - 40, 41, 18, 49, 44, 52, nil, 145, nil, nil, - 47, 48, 8, 32, 45, 36, 38, 39, 40, 41, - nil, 49, 44, 52, nil, 28, nil, nil, 152, nil, - nil, nil, nil, nil, nil, 149, 18, nil, nil, nil, - 44, nil, nil, 28, 47, 48, nil, 32, 45, 36, - 38, 39, 40, 41, 18, 49, nil, 52, 44, nil, - nil, 28, 47, 48, nil, 32, 45, 36, 38, 39, - 40, 41, 18, 49, nil, 52, 44, nil, nil, 220, - nil, nil, nil, 32, 45, 36, 38, 39, 40, 41, - 18, 49, nil, 52, 44, nil, nil, 220, 47, 48, - nil, 32, 45, 36, 38, 39, 40, 41, 18, 49, - nil, 52, 44, nil, nil, 220, 47, 48, nil, 32, - 45, 36, 38, 39, 40, 41, 18, 49, nil, 52, - 44, nil, nil, 220, 47, 48, nil, 32, 45, 36, - 38, 39, 40, 41, 18, 49, nil, 52, 44, nil, - nil, 220, 47, 48, nil, 32, 45, 36, 38, 39, - 40, 41, 18, 49, nil, 52, 44, nil, nil, 220, - 47, 48, nil, 32, 45, 36, 38, 39, 40, 41, - 18, 49, nil, 52, 44, nil, nil, 28, 47, 48, - nil, 32, 45, 36, 38, 39, 40, 41, 18, 49, - nil, 52, 44, nil, nil, 220, 47, 48, nil, 32, - 45, 36, 38, 39, 40, 41, 18, 49, nil, 52, - 44, nil, nil, 220, 47, 48, nil, 32, 45, 36, - 38, 39, 40, 41, 18, 49, nil, 52, 44, nil, - nil, 28, 47, 48, nil, 32, 45, 36, 38, 39, - 40, 41, 18, 49, nil, 52, 44, nil, nil, 28, - 47, 48, nil, 32, 45, 36, 38, 39, 40, 41, - 18, 49, nil, 52, 44, nil, nil, 28, 47, 48, - nil, 32, 45, 36, 38, 39, 40, 41, 18, 49, - nil, 52, nil, nil, nil, nil, 47, 48, nil, 32, - 45, 36, 38, 39, 40, 41, 18, 49, 44, 52, - nil, 145, nil, nil, 47, 48, nil, 32, 45, 36, - 38, 39, 40, 41, nil, 49, 44, 52, nil, 28, - nil, nil, nil, nil, nil, 116, nil, nil, nil, 149, - 18, nil, nil, nil, 44, nil, nil, 28, 47, 48, - nil, 32, 45, 36, 38, 39, 40, 41, 18, 49, - nil, 52, 44, nil, nil, 28, 47, 48, nil, 32, - 45, 36, 38, 39, 40, 41, 18, 49, nil, 52, - nil, nil, nil, nil, 47, 48, nil, 32, 45, 36, - 38, 39, 40, 41, 18, 49, 44, 52, nil, 145, - nil, nil, 47, 48, nil, 32, 45, 36, 38, 39, - 40, 41, nil, 49, 44, 52, nil, 28, nil, nil, - 152, nil, nil, nil, nil, nil, nil, 149, 18, nil, - nil, nil, 44, nil, nil, 28, 47, 48, nil, 32, - 45, 36, 38, 39, 40, 41, 18, 49, nil, 52, - 44, nil, nil, 28, 47, 48, nil, 32, 45, 36, - 38, 39, 40, 41, 18, 49, nil, 52, nil, nil, - nil, nil, 47, 48, nil, 32, 45, 36, 38, 39, - 40, 41, 18, 49, 44, 52, nil, 145, nil, nil, - 47, 48, nil, 32, 45, 36, 38, 39, 40, 41, - nil, 49, nil, 52, nil, nil, nil, nil, 152, nil, - nil, nil, nil, nil, nil, 149, 18, nil, nil, nil, - nil, nil, nil, 96, 47, 48, nil, 32, 45, 36, - 38, 39, 40, 41, nil, 49, 97, 52, 99, 100, - nil, 101, 102, 208, 209, 96, nil, nil, nil, 94, - nil, nil, nil, 95, nil, nil, nil, nil, 97, nil, - 99, 100, nil, 101, 102, 186, 187, nil, 188, 189, - 190, nil, nil, nil, nil, 191, 192, 193, 194, 195, - 196 ] + 144, -133, 141, 203, 28, 35, 171, 170, 248, 187, + 157, 156, 216, 162, 249, 188, 139, 140, 29, 242, + 31, 32, -140, 33, 34, 243, 90, 111, 144, 93, + 94, 37, 37, 73, -110, 50, 111, -133, -133, -133, + 142, -110, 121, 93, 94, 244, 77, 91, 81, 83, + 84, 85, 86, 87, 90, 95, 144, 98, -140, -140, + -140, 73, 177, 50, 178, 179, 279, 280, 245, 246, + 247, 93, 94, 250, 77, 91, 81, 83, 84, 85, + 86, 87, 90, 95, 144, 98, 7, 251, 252, 73, + 8, 50, 253, 231, 256, 10, 11, 257, 264, 93, + 94, 265, 77, 91, 81, 83, 84, 85, 86, 87, + 90, 95, 266, 98, 268, 269, 40, 73, 270, 50, + 271, 50, 121, 42, 37, 277, 167, 50, 288, 289, + 77, 91, 81, 83, 84, 85, 86, 87, 28, 95, + 290, 98, 90, 53, 144, 231, 121, 293, 37, 73, + 49, 50, 29, 50, 31, 32, 12, 33, 34, 93, + 94, 19, 77, 91, 81, 83, 84, 85, 86, 87, + 90, 95, 20, 98, 22, 24, 40, 73, 25, 50, + 26, 19, 39, 19, 50, 19, 104, 93, 94, 105, + 77, 91, 81, 83, 84, 85, 86, 87, 106, 95, + 107, 98, 90, 53, 108, 37, 117, 118, 121, 73, + 49, 50, 40, 133, 10, -93, 136, 146, 147, 93, + 94, 148, 77, 91, 81, 83, 84, 85, 86, 87, + 149, 95, 150, 98, 151, 152, -162, 153, 90, 53, + 144, 154, 155, 158, 160, 73, 49, 50, 163, 19, + 19, 167, 169, 111, 19, 93, 94, 37, 77, 91, + 81, 83, 84, 85, 86, 87, 90, 95, 144, 98, + 183, 10, 212, 73, 217, 50, 219, 50, 167, 50, + 231, 232, 121, 93, 94, 234, 77, 91, 81, 83, + 84, 85, 86, 87, 90, 95, 180, 98, 136, 183, + 238, 73, 241, 50, 171, nil, nil, nil, nil, nil, + nil, 93, 94, nil, 77, 91, 81, 83, 84, 85, + 86, 87, 90, 95, 144, 98, nil, nil, nil, 73, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 93, + 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, + 90, 95, 180, 98, nil, nil, nil, 73, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, + 77, 91, 81, 83, 84, 85, 86, 87, 90, 95, + 144, 98, 10, nil, nil, 73, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 93, 94, nil, 77, 91, + 81, 83, 84, 85, 86, 87, 90, 95, 180, 98, + nil, nil, nil, 73, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 93, 94, nil, 77, 91, 81, 83, + 84, 85, 86, 87, 90, 95, 144, 98, 10, nil, + nil, 73, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 93, 94, nil, 77, 91, 81, 83, 84, 85, + 86, 87, 90, 95, 40, 98, nil, nil, nil, 73, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 93, + 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, + 90, 95, nil, 98, nil, nil, 40, 73, 49, 50, + nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, + 77, 91, 81, 83, 84, 85, 86, 87, nil, 95, + nil, 98, 90, 53, 144, nil, nil, nil, nil, 73, + 49, 50, nil, nil, nil, nil, nil, nil, nil, 93, + 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, + 90, 95, nil, 98, nil, nil, 40, 73, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, + 77, 91, 81, 83, 84, 85, 86, 87, nil, 95, + nil, 98, 90, 53, nil, nil, nil, nil, 40, 73, + 49, 50, nil, nil, nil, nil, nil, nil, nil, 93, + 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, + nil, 95, nil, 98, 90, 53, 180, nil, nil, nil, + nil, 73, 49, 50, nil, nil, nil, nil, nil, nil, + nil, 93, 94, nil, 77, 91, 81, 83, 84, 85, + 86, 87, 90, 95, 144, 98, nil, nil, nil, 73, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 93, + 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, + 90, 95, 180, 98, nil, nil, nil, 73, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, + 77, 91, 81, 83, 84, 85, 86, 87, 90, 95, + 144, 98, nil, nil, nil, 73, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 93, 94, nil, 77, 91, + 81, 83, 84, 85, 86, 87, 90, 95, 144, 98, + nil, nil, nil, 73, 24, 50, nil, nil, nil, nil, + nil, nil, nil, 93, 94, nil, 77, 91, 81, 83, + 84, 85, 86, 87, 90, 95, 180, 98, nil, nil, + nil, 73, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 93, 94, nil, 77, 91, 81, 83, 84, 85, + 86, 87, 90, 95, 180, 98, nil, nil, nil, 73, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 93, + 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, + 90, 95, 180, 98, nil, nil, nil, 73, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, + 77, 91, 81, 83, 84, 85, 86, 87, 90, 95, + 180, 98, nil, nil, nil, 73, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 93, 94, nil, 77, 91, + 81, 83, 84, 85, 86, 87, 90, 95, nil, 98, + nil, nil, 40, 73, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 93, 94, nil, 77, 91, 81, 83, + 84, 85, 86, 87, nil, 95, nil, 98, 90, 53, + 180, nil, nil, nil, nil, 73, 49, 50, nil, nil, + nil, nil, nil, nil, nil, 93, 94, nil, 77, 91, + 81, 83, 84, 85, 86, 87, 90, 95, 180, 98, + nil, nil, nil, 73, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 93, 94, nil, 77, 91, 81, 83, + 84, 85, 86, 87, 90, 95, 144, 98, nil, nil, + nil, 73, nil, 50, nil, nil, nil, nil, nil, nil, + nil, 93, 94, nil, 77, 91, 81, 83, 84, 85, + 86, 87, 90, 95, 144, 98, nil, nil, nil, 73, + nil, 50, nil, nil, nil, nil, nil, nil, nil, 93, + 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, + 90, 95, nil, 98, nil, nil, 40, 73, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, + 77, 91, 81, 83, 84, 85, 86, 87, nil, 95, + nil, 98, 90, 53, 144, nil, nil, nil, nil, 73, + 49, 50, nil, nil, nil, nil, nil, nil, nil, 93, + 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, + 90, 95, 180, 98, nil, nil, nil, 73, nil, 50, + nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, + 77, 91, 81, 83, 84, 85, 86, 87, 90, 95, + 144, 98, nil, nil, nil, 73, nil, 50, nil, nil, + nil, nil, nil, nil, nil, 93, 94, nil, 77, 91, + 81, 83, 84, 85, 86, 87, 90, 95, 144, 98, + nil, nil, nil, 73, nil, 50, nil, nil, nil, nil, + nil, nil, nil, 93, 94, nil, 77, 91, 81, 83, + 84, 85, 86, 87, 90, 95, nil, 98, nil, nil, + nil, 73, 127, 50, nil, nil, nil, nil, nil, nil, + nil, 93, 94, nil, 77, 91, 81, 83, 84, 85, + 86, 87, -31, 95, nil, 98, -31, -119, nil, -31, + -31, nil, -31, 122, 123, 28, 124, 125, 126, 119, + nil, nil, nil, 128, 129, 130, 131, 132, nil, 29, + nil, 31, 32, nil, 33, 34, 228, 229, -119, -119, + -110, -119, -119, -119, 27, 28, 37, -110, -119, -119, + -119, -119, -119, nil, nil, nil, nil, nil, nil, 29, + nil, 31, 32, nil, 33, 34 ] racc_action_check = [ - 106, 22, 117, 106, 183, 54, 128, 17, 56, 190, - 0, 89, 89, 0, 83, 190, 98, 186, 249, 186, - 186, 249, 49, 49, 106, 21, 21, 100, 101, 17, - 56, 106, 106, 183, 22, 102, 242, 54, 128, 242, - 106, 106, 103, 106, 106, 106, 106, 106, 106, 106, - 249, 106, 105, 106, 83, 83, 96, 95, 249, 249, - 116, 249, 249, 249, 249, 249, 249, 249, 242, 249, - 222, 249, 20, 222, 97, 118, 242, 242, 222, 242, - 242, 242, 242, 242, 242, 242, 119, 242, 8, 242, - 120, 8, 121, 125, 93, 133, 134, 8, 87, 137, - 138, 143, 222, 20, 20, 20, 144, 84, 146, 81, - 222, 222, 149, 222, 222, 222, 222, 222, 222, 222, - 8, 222, 220, 222, 150, 220, 75, 74, 8, 8, - 220, 8, 8, 8, 8, 8, 8, 8, 175, 8, - 219, 8, 176, 219, 65, 63, 181, 182, 62, 184, - 52, 46, 45, 188, 220, 44, 42, 41, 217, 40, - 39, 217, 220, 220, 38, 220, 220, 220, 220, 220, - 220, 220, 219, 220, 36, 220, 33, 197, 18, 16, - 219, 219, 13, 219, 219, 219, 219, 219, 219, 219, - 217, 219, 208, 219, 209, 208, 210, 211, 217, 217, - 216, 217, 217, 217, 217, 217, 217, 217, 12, 217, - 204, 217, 218, 204, 11, 9, 208, 221, 7, 226, - 236, 237, 238, 208, 208, 239, 5, 243, 94, 245, - 246, 94, 208, 208, 1, 208, 208, 208, 208, 208, - 208, 208, 204, 208, 253, 208, nil, nil, nil, nil, - 204, 204, nil, 204, 204, 204, 204, 204, 204, 204, - 94, 204, 200, 204, nil, 200, nil, nil, 94, 94, - nil, 94, 94, 94, 94, 94, 94, 94, nil, 94, - 135, 94, 107, 135, nil, nil, 200, nil, nil, nil, - nil, nil, nil, 200, 200, 107, nil, 107, 107, nil, - 107, 107, 200, 200, nil, 200, 200, 200, 200, 200, - 200, 200, 135, 200, 145, 200, nil, 145, nil, nil, - 135, 135, 145, 135, 135, 135, 135, 135, 135, 135, - nil, 135, 80, 135, nil, 80, nil, nil, 145, nil, - nil, nil, nil, nil, nil, 145, 145, nil, nil, nil, - 23, nil, nil, 23, 145, 145, nil, 145, 145, 145, - 145, 145, 145, 145, 80, 145, nil, 145, 28, nil, - nil, 28, 80, 80, nil, 80, 80, 80, 80, 80, - 80, 80, 23, 80, nil, 80, 196, nil, nil, 196, - nil, nil, nil, 23, 23, 23, 23, 23, 23, 23, - 28, 23, nil, 23, 195, nil, nil, 195, 28, 28, - nil, 28, 28, 28, 28, 28, 28, 28, 196, 28, - nil, 28, 194, nil, nil, 194, 196, 196, nil, 196, - 196, 196, 196, 196, 196, 196, 195, 196, nil, 196, - 193, nil, nil, 193, 195, 195, nil, 195, 195, 195, - 195, 195, 195, 195, 194, 195, nil, 195, 192, nil, - nil, 192, 194, 194, nil, 194, 194, 194, 194, 194, - 194, 194, 193, 194, nil, 194, 191, nil, nil, 191, - 193, 193, nil, 193, 193, 193, 193, 193, 193, 193, - 192, 193, nil, 193, 79, nil, nil, 79, 192, 192, - nil, 192, 192, 192, 192, 192, 192, 192, 191, 192, - nil, 192, 189, nil, nil, 189, 191, 191, nil, 191, - 191, 191, 191, 191, 191, 191, 79, 191, nil, 191, - 187, nil, nil, 187, 79, 79, nil, 79, 79, 79, - 79, 79, 79, 79, 189, 79, nil, 79, 78, nil, - nil, 78, 189, 189, nil, 189, 189, 189, 189, 189, - 189, 189, 187, 189, nil, 189, 77, nil, nil, 77, - 187, 187, nil, 187, 187, 187, 187, 187, 187, 187, - 78, 187, nil, 187, 69, nil, nil, 69, 78, 78, - nil, 78, 78, 78, 78, 78, 78, 78, 77, 78, - nil, 78, nil, nil, nil, nil, 77, 77, nil, 77, - 77, 77, 77, 77, 77, 77, 69, 77, 152, 77, - nil, 152, nil, nil, 69, 69, nil, 69, 69, 69, - 69, 69, 69, 69, nil, 69, 76, 69, nil, 76, - nil, nil, nil, nil, nil, 76, nil, nil, nil, 152, - 152, nil, nil, nil, 174, nil, nil, 174, 152, 152, - nil, 152, 152, 152, 152, 152, 152, 152, 76, 152, - nil, 152, 71, nil, nil, 71, 76, 76, nil, 76, - 76, 76, 76, 76, 76, 76, 174, 76, nil, 76, - nil, nil, nil, nil, 174, 174, nil, 174, 174, 174, - 174, 174, 174, 174, 71, 174, 180, 174, nil, 180, - nil, nil, 71, 71, nil, 71, 71, 71, 71, 71, - 71, 71, nil, 71, 64, 71, nil, 64, nil, nil, - 180, nil, nil, nil, nil, nil, nil, 180, 180, nil, - nil, nil, 70, nil, nil, 70, 180, 180, nil, 180, - 180, 180, 180, 180, 180, 180, 64, 180, nil, 180, - 68, nil, nil, 68, 64, 64, nil, 64, 64, 64, - 64, 64, 64, 64, 70, 64, nil, 64, nil, nil, - nil, nil, 70, 70, nil, 70, 70, 70, 70, 70, - 70, 70, 68, 70, 185, 70, nil, 185, nil, nil, - 68, 68, nil, 68, 68, 68, 68, 68, 68, 68, - nil, 68, nil, 68, nil, nil, nil, nil, 185, nil, - nil, nil, nil, nil, nil, 185, 185, nil, nil, nil, - nil, nil, nil, 178, 185, 185, nil, 185, 185, 185, - 185, 185, 185, 185, nil, 185, 178, 185, 178, 178, - nil, 178, 178, 178, 178, 55, nil, nil, nil, 55, - nil, nil, nil, 55, nil, nil, nil, nil, 55, nil, - 55, 55, nil, 55, 55, 148, 148, nil, 148, 148, - 148, nil, nil, nil, nil, 148, 148, 148, 148, 148, - 148 ] + 140, 261, 67, 146, 38, 14, 114, 113, 210, 126, + 95, 95, 155, 100, 210, 126, 66, 66, 38, 204, + 38, 38, 65, 38, 38, 205, 140, 38, 142, 155, + 155, 146, 14, 140, 114, 140, 100, 261, 261, 261, + 67, 114, 113, 140, 140, 206, 140, 140, 140, 140, + 140, 140, 140, 140, 142, 140, 251, 140, 65, 65, + 65, 142, 122, 142, 122, 122, 260, 260, 207, 208, + 209, 142, 142, 215, 142, 142, 142, 142, 142, 142, + 142, 142, 251, 142, 68, 142, 0, 219, 220, 251, + 0, 251, 221, 222, 229, 0, 0, 231, 233, 251, + 251, 234, 251, 251, 251, 251, 251, 251, 251, 251, + 68, 251, 235, 251, 239, 240, 23, 68, 242, 68, + 248, 253, 255, 23, 256, 258, 263, 265, 272, 274, + 68, 68, 68, 68, 68, 68, 68, 68, 173, 68, + 275, 68, 23, 23, 277, 281, 282, 283, 290, 23, + 23, 23, 173, 293, 173, 173, 1, 173, 173, 23, + 23, 7, 23, 23, 23, 23, 23, 23, 23, 23, + 277, 23, 8, 23, 9, 10, 111, 277, 11, 277, + 12, 20, 22, 25, 27, 28, 29, 277, 277, 30, + 277, 277, 277, 277, 277, 277, 277, 277, 32, 277, + 33, 277, 111, 111, 34, 35, 41, 44, 46, 111, + 111, 111, 40, 49, 40, 50, 51, 78, 81, 111, + 111, 83, 111, 111, 111, 111, 111, 111, 111, 111, + 84, 111, 85, 111, 86, 87, 88, 90, 40, 40, + 152, 91, 92, 98, 99, 40, 40, 40, 102, 104, + 105, 110, 112, 116, 117, 40, 40, 119, 40, 40, + 40, 40, 40, 40, 40, 40, 152, 40, 151, 40, + 124, 133, 153, 152, 156, 152, 159, 160, 161, 162, + 166, 167, 168, 152, 152, 172, 152, 152, 152, 152, + 152, 152, 152, 152, 151, 152, 177, 152, 176, 178, + 181, 151, 187, 151, 200, nil, nil, nil, nil, nil, + nil, 151, 151, nil, 151, 151, 151, 151, 151, 151, + 151, 151, 177, 151, 269, 151, nil, nil, nil, 177, + nil, 177, nil, nil, nil, nil, nil, nil, nil, 177, + 177, nil, 177, 177, 177, 177, 177, 177, 177, 177, + 269, 177, 179, 177, nil, nil, nil, 269, nil, 269, + nil, nil, nil, nil, nil, nil, nil, 269, 269, nil, + 269, 269, 269, 269, 269, 269, 269, 269, 179, 269, + 180, 269, 180, nil, nil, 179, nil, 179, nil, nil, + nil, nil, nil, nil, nil, 179, 179, nil, 179, 179, + 179, 179, 179, 179, 179, 179, 180, 179, 266, 179, + nil, nil, nil, 180, nil, 180, nil, nil, nil, nil, + nil, nil, nil, 180, 180, nil, 180, 180, 180, 180, + 180, 180, 180, 180, 266, 180, 183, 180, 183, nil, + nil, 266, nil, 266, nil, nil, nil, nil, nil, nil, + nil, 266, 266, nil, 266, 266, 266, 266, 266, 266, + 266, 266, 183, 266, 53, 266, nil, nil, nil, 183, + nil, 183, nil, nil, nil, nil, nil, nil, nil, 183, + 183, nil, 183, 183, 183, 183, 183, 183, 183, 183, + 53, 183, nil, 183, nil, nil, 118, 53, 53, 53, + nil, nil, nil, nil, nil, nil, nil, 53, 53, nil, + 53, 53, 53, 53, 53, 53, 53, 53, nil, 53, + nil, 53, 118, 118, 150, nil, nil, nil, nil, 118, + 118, 118, nil, nil, nil, nil, nil, nil, nil, 118, + 118, nil, 118, 118, 118, 118, 118, 118, 118, 118, + 150, 118, nil, 118, nil, nil, 121, 150, nil, 150, + nil, nil, nil, nil, nil, nil, nil, 150, 150, nil, + 150, 150, 150, 150, 150, 150, 150, 150, nil, 150, + nil, 150, 121, 121, nil, nil, nil, nil, 264, 121, + 121, 121, nil, nil, nil, nil, nil, nil, nil, 121, + 121, nil, 121, 121, 121, 121, 121, 121, 121, 121, + nil, 121, nil, 121, 264, 264, 123, nil, nil, nil, + nil, 264, 264, 264, nil, nil, nil, nil, nil, nil, + nil, 264, 264, nil, 264, 264, 264, 264, 264, 264, + 264, 264, 123, 264, 149, 264, nil, nil, nil, 123, + nil, 123, nil, nil, nil, nil, nil, nil, nil, 123, + 123, nil, 123, 123, 123, 123, 123, 123, 123, 123, + 149, 123, 125, 123, nil, nil, nil, 149, nil, 149, + nil, nil, nil, nil, nil, nil, nil, 149, 149, nil, + 149, 149, 149, 149, 149, 149, 149, 149, 125, 149, + 148, 149, nil, nil, nil, 125, nil, 125, nil, nil, + nil, nil, nil, nil, nil, 125, 125, nil, 125, 125, + 125, 125, 125, 125, 125, 125, 148, 125, 147, 125, + nil, nil, nil, 148, 147, 148, nil, nil, nil, nil, + nil, nil, nil, 148, 148, nil, 148, 148, 148, 148, + 148, 148, 148, 148, 147, 148, 127, 148, nil, nil, + nil, 147, nil, 147, nil, nil, nil, nil, nil, nil, + nil, 147, 147, nil, 147, 147, 147, 147, 147, 147, + 147, 147, 127, 147, 128, 147, nil, nil, nil, 127, + nil, 127, nil, nil, nil, nil, nil, nil, nil, 127, + 127, nil, 127, 127, 127, 127, 127, 127, 127, 127, + 128, 127, 129, 127, nil, nil, nil, 128, nil, 128, + nil, nil, nil, nil, nil, nil, nil, 128, 128, nil, + 128, 128, 128, 128, 128, 128, 128, 128, 129, 128, + 130, 128, nil, nil, nil, 129, nil, 129, nil, nil, + nil, nil, nil, nil, nil, 129, 129, nil, 129, 129, + 129, 129, 129, 129, 129, 129, 130, 129, nil, 129, + nil, nil, 228, 130, nil, 130, nil, nil, nil, nil, + nil, nil, nil, 130, 130, nil, 130, 130, 130, 130, + 130, 130, 130, 130, nil, 130, nil, 130, 228, 228, + 131, nil, nil, nil, nil, 228, 228, 228, nil, nil, + nil, nil, nil, nil, nil, 228, 228, nil, 228, 228, + 228, 228, 228, 228, 228, 228, 131, 228, 132, 228, + nil, nil, nil, 131, nil, 131, nil, nil, nil, nil, + nil, nil, nil, 131, 131, nil, 131, 131, 131, 131, + 131, 131, 131, 131, 132, 131, 232, 131, nil, nil, + nil, 132, nil, 132, nil, nil, nil, nil, nil, nil, + nil, 132, 132, nil, 132, 132, 132, 132, 132, 132, + 132, 132, 232, 132, 144, 132, nil, nil, nil, 232, + nil, 232, nil, nil, nil, nil, nil, nil, nil, 232, + 232, nil, 232, 232, 232, 232, 232, 232, 232, 232, + 144, 232, nil, 232, nil, nil, 136, 144, nil, 144, + nil, nil, nil, nil, nil, nil, nil, 144, 144, nil, + 144, 144, 144, 144, 144, 144, 144, 144, nil, 144, + nil, 144, 136, 136, 163, nil, nil, nil, nil, 136, + 136, 136, nil, nil, nil, nil, nil, nil, nil, 136, + 136, nil, 136, 136, 136, 136, 136, 136, 136, 136, + 163, 136, 238, 136, nil, nil, nil, 163, nil, 163, + nil, nil, nil, nil, nil, nil, nil, 163, 163, nil, + 163, 163, 163, 163, 163, 163, 163, 163, 238, 163, + 139, 163, nil, nil, nil, 238, nil, 238, nil, nil, + nil, nil, nil, nil, nil, 238, 238, nil, 238, 238, + 238, 238, 238, 238, 238, 238, 139, 238, 141, 238, + nil, nil, nil, 139, nil, 139, nil, nil, nil, nil, + nil, nil, nil, 139, 139, nil, 139, 139, 139, 139, + 139, 139, 139, 139, 141, 139, nil, 139, nil, nil, + nil, 141, 48, 141, nil, nil, nil, nil, nil, nil, + nil, 141, 141, nil, 141, 141, 141, 141, 141, 141, + 141, 141, 45, 141, nil, 141, 45, 138, nil, 45, + 45, nil, 45, 48, 48, 165, 48, 48, 48, 45, + nil, nil, nil, 48, 48, 48, 48, 48, nil, 165, + nil, 165, 165, nil, 165, 165, 165, 165, 138, 138, + 45, 138, 138, 138, 13, 13, 45, 45, 138, 138, + 138, 138, 138, nil, nil, nil, nil, nil, nil, 13, + nil, 13, 13, nil, 13, 13 ] racc_action_pointer = [ - 0, 234, nil, nil, nil, 224, nil, 207, 83, 215, - nil, 211, 171, 166, nil, nil, 175, -8, 129, nil, - 58, -20, -13, 345, nil, nil, nil, nil, 363, nil, - nil, nil, nil, 127, nil, nil, 166, nil, 156, 152, - 151, 149, 101, nil, 106, 147, 96, nil, nil, -34, - nil, nil, 91, nil, 0, 851, -7, nil, nil, nil, - nil, nil, 122, 108, 719, 107, nil, nil, 755, 579, - 737, 667, nil, nil, 118, 89, 631, 561, 543, 489, - 327, 104, nil, 9, 51, nil, nil, 94, nil, 5, - nil, nil, nil, 82, 223, 49, 19, 56, -2, nil, - 6, 7, 14, 5, nil, 25, -5, 278, nil, nil, - nil, nil, nil, nil, nil, nil, 51, -7, 66, 77, - 81, 83, nil, nil, nil, 88, nil, nil, 1, nil, - nil, nil, nil, 86, 92, 275, nil, 62, 63, nil, - nil, nil, nil, 73, 103, 309, 70, nil, 846, 104, - 93, nil, 613, nil, nil, nil, nil, nil, nil, nil, + 84, 156, nil, nil, nil, nil, nil, 117, 165, 166, + 160, 165, 180, 1221, -12, nil, nil, nil, nil, nil, + 137, nil, 180, 107, nil, 139, nil, 140, 141, 167, + 170, nil, 176, 178, 182, 161, nil, nil, 0, nil, + 203, 199, nil, nil, 203, 1182, 163, nil, 1157, 204, + 159, 178, nil, 455, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, 6, -36, -14, 75, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 161, nil, + nil, 209, nil, 212, 221, 223, 225, 226, 173, nil, + 181, 206, 179, nil, nil, -54, nil, nil, 176, 235, + 9, nil, 243, nil, 205, 206, nil, nil, nil, nil, + 220, 167, 242, -3, -4, nil, 226, 210, 487, 213, + nil, 547, 25, 607, 261, 663, -27, 747, 775, 803, + 831, 891, 919, 260, nil, nil, 1007, nil, 1182, 1091, + -9, 1119, 19, nil, 975, nil, -13, 719, 691, 635, + 515, 259, 231, 237, nil, -23, 210, nil, nil, 262, + 233, 247, 235, 1035, nil, 1191, 246, 252, 237, nil, + nil, nil, 257, 134, nil, nil, 260, 287, 290, 343, + 371, 262, nil, 427, nil, nil, nil, 260, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, 649, 129, 138, nil, 829, nil, - 701, 109, 138, -5, 140, 789, -13, 525, 145, 507, - -20, 471, 453, 435, 417, 399, 381, 164, nil, nil, - 257, nil, nil, nil, 205, nil, nil, nil, 187, 186, - 158, 193, nil, nil, nil, nil, 169, 153, 204, 135, - 117, 186, 65, nil, nil, nil, 184, nil, nil, nil, - nil, nil, nil, nil, nil, nil, 182, 184, 185, 194, - nil, nil, 31, 218, nil, 220, 226, nil, nil, 13, - nil, nil, nil, 207, nil, nil ] + 294, nil, nil, nil, 3, 15, 35, 58, 59, 60, + 4, nil, nil, nil, nil, 38, nil, nil, nil, 78, + 78, 88, 59, nil, nil, nil, nil, nil, 863, 85, + nil, 62, 947, 68, 72, 74, nil, nil, 1063, 104, + 111, nil, 108, nil, nil, nil, nil, nil, 69, nil, + nil, 47, nil, 77, nil, 77, 80, nil, 121, nil, + 34, -15, nil, 95, 579, 83, 399, nil, nil, 315, + nil, nil, 118, nil, 119, 136, nil, 135, nil, nil, + nil, 111, 101, 143, nil, nil, nil, nil, nil, nil, + 104, nil, nil, 109, nil, nil ] racc_action_default = [ - -154, -154, -1, -2, -3, -5, -16, -154, -154, -154, - -4, -154, -154, -24, -25, -26, -28, -31, -148, -106, - -107, -110, -113, -154, -115, -116, -117, -118, -154, -120, - -121, -122, -124, -154, -126, -127, -154, -129, -154, -154, - -154, -154, -135, -136, -140, -154, -154, -146, -147, -154, - -151, -152, -154, 256, -154, -154, -36, -37, -39, -40, - -79, -23, -56, -154, -154, -154, -30, -148, -154, -154, - -154, -154, -114, -123, -154, -154, -154, -154, -154, -154, - -154, -138, -139, -154, -154, -150, -153, -6, -8, -12, - -10, -11, -17, -154, -154, -154, -154, -154, -154, -44, - -46, -48, -49, -154, -35, -58, -154, -33, -27, -29, - -108, -109, -111, -112, -119, -125, -154, -154, -154, -154, - -154, -154, -137, -141, -143, -154, -145, -149, -154, -9, - -13, -14, -18, -154, -21, -154, -41, -154, -154, -45, - -47, -50, -34, -63, -154, -154, -57, -65, -154, -154, - -82, -84, -154, -87, -88, -89, -91, -92, -93, -94, - -95, -96, -103, -104, -105, -128, -130, -131, -132, -133, - -134, -144, -7, -19, -154, -154, -73, -42, -154, -32, - -154, -154, -154, -154, -105, -154, -154, -154, -154, -154, - -154, -154, -154, -154, -154, -154, -154, -154, -38, -78, - -154, -86, -20, -22, -154, -43, -51, -52, -154, -154, - -64, -59, -61, -62, -15, -90, -83, -154, -154, -154, - -154, -154, -154, -69, -70, -75, -154, -77, -97, -98, - -99, -100, -101, -102, -85, -72, -53, -154, -154, -154, - -68, -74, -154, -154, -76, -154, -55, -81, -60, -154, - -67, -71, -54, -154, -66, -80 ] + -174, -174, -1, -2, -3, -4, -5, -174, -174, -12, + -22, -174, -174, -174, -37, -38, -39, -41, -42, -93, + -174, -11, -174, -174, -23, -174, 296, -174, -174, -174, + -174, -46, -48, -50, -51, -174, -36, -168, -58, -13, + -174, -32, -24, -25, -27, -119, -30, -79, -174, -174, + -168, -96, -98, -174, -101, -102, -104, -105, -106, -107, + -108, -109, -117, -118, -122, -123, -126, -129, -174, -131, + -132, -133, -134, -136, -137, -138, -139, -141, -174, -143, + -146, -174, -148, -174, -174, -174, -174, -174, -155, -156, + -160, -174, -174, -166, -167, -174, -171, -172, -174, -17, + -58, -8, -174, -43, -174, -174, -47, -49, -52, -35, + -67, -174, -174, -174, -119, -15, -58, -174, -174, -174, + -29, -174, -174, -174, -174, -174, -174, -174, -174, -174, + -174, -174, -174, -174, -40, -92, -174, -100, -110, -174, + -174, -174, -174, -130, -174, -140, -174, -22, -174, -174, + -174, -174, -174, -158, -159, -174, -174, -170, -173, -174, + -174, -67, -174, -174, -44, -174, -77, -174, -59, -14, + -103, -135, -60, -34, -26, -28, -97, -174, -174, -174, + -174, -174, -119, -174, -83, -84, -89, -174, -91, -111, + -112, -113, -114, -115, -116, -99, -124, -125, -127, -128, + -174, -142, -144, -145, -174, -174, -174, -174, -174, -174, + -174, -121, -157, -161, -163, -174, -165, -169, -16, -174, + -174, -20, -77, -7, -9, -45, -53, -54, -174, -174, + -10, -174, -174, -65, -174, -174, -82, -88, -174, -174, + -87, -90, -174, -149, -150, -151, -152, -153, -174, -154, + -164, -174, -18, -174, -6, -55, -174, -78, -68, -70, + -74, -72, -73, -67, -174, -174, -174, -81, -85, -174, + -147, -120, -174, -19, -174, -57, -95, -174, -71, -75, + -76, -77, -66, -61, -63, -64, -80, -86, -21, -56, + -174, -69, -33, -174, -94, -62 ] racc_goto_table = [ - 66, 17, 146, 55, 133, 56, 175, 88, 198, 212, - 213, 92, 15, 223, 73, 112, 113, 110, 111, 179, - 13, 74, 62, 221, 105, 225, 143, 228, 229, 230, - 231, 232, 233, 61, 93, 199, 205, 90, 206, 104, - 207, 183, 129, 240, 245, 246, 211, 198, 109, 132, - 1, 87, 10, 239, 107, 241, 56, 17, 115, 73, - 73, 73, 73, 5, 216, 234, 248, 213, 108, 117, - 118, 119, 120, 121, 201, 235, 210, 198, 250, 4, - 3, 172, 2, 125, 202, 254, 142, 134, 72, 136, - 123, 124, nil, 243, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, 236, nil, nil, nil, nil, nil, - nil, 90, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 176, 178, - 177, 56, nil, nil, nil, nil, nil, nil, 184, nil, + 36, 102, 45, 166, 113, 181, 23, 186, 134, 189, + 190, 191, 192, 193, 194, 101, 43, 220, 230, 114, + 239, 109, 145, 110, 184, 259, 198, 199, 284, 196, + 197, 120, 138, 275, 283, 258, 278, 13, 176, 195, + 137, 210, 14, 215, 143, 201, 213, 1, 214, 2, + 38, 3, 4, 5, 222, 14, 295, 6, 100, 235, + 14, 237, 9, 103, 21, 41, 115, 99, 159, 218, + 291, 116, 233, 263, 254, 168, 135, 225, 236, 226, + 227, 274, nil, 134, nil, 161, nil, nil, 272, nil, + 138, nil, nil, 145, 145, 145, 145, 45, nil, nil, + 138, 172, nil, nil, nil, 175, 287, nil, nil, nil, + 273, 174, nil, nil, nil, 138, nil, nil, nil, nil, + 267, nil, nil, 200, nil, nil, 205, 206, 207, 208, + 209, 211, 202, 292, 221, 165, 102, 134, nil, 164, + 14, nil, 224, 204, nil, nil, nil, 173, 286, nil, + 223, nil, 14, nil, nil, nil, 281, nil, nil, 200, + nil, nil, 240, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 134, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 176, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, 74, nil, 176, nil, nil, nil, nil, - 247, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, 255 ] + nil, nil, 255, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 261, 138, nil, nil, + nil, 262, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 221, 282, nil, + 240, nil, nil, nil, nil, nil, nil, nil, nil, 285, + nil, nil, 276, 138, nil, nil, nil, nil, 240, nil, + nil, 261, nil, nil, nil, nil, 262, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 285, nil, nil, + nil, nil, nil, nil, nil, nil, 294 ] racc_goto_check = [ - 11, 18, 37, 14, 17, 28, 19, 8, 12, 41, - 42, 15, 22, 47, 59, 60, 60, 58, 58, 27, - 20, 18, 24, 45, 25, 45, 26, 45, 45, 45, - 45, 45, 45, 21, 16, 30, 34, 11, 35, 11, - 36, 37, 10, 47, 38, 39, 40, 12, 11, 15, - 1, 7, 6, 45, 14, 45, 28, 18, 11, 59, - 59, 59, 59, 5, 51, 52, 41, 42, 22, 18, - 18, 18, 18, 18, 53, 19, 37, 12, 45, 4, - 3, 8, 2, 62, 17, 45, 11, 18, 63, 28, - 74, 75, nil, 19, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, 37, nil, nil, nil, nil, nil, - nil, 11, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 18, 14, - 28, 28, nil, nil, nil, nil, nil, nil, 18, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 18, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + 28, 13, 14, 10, 29, 52, 18, 52, 17, 52, + 52, 52, 52, 52, 52, 12, 26, 24, 11, 14, + 25, 28, 66, 9, 54, 47, 67, 67, 45, 65, + 65, 28, 14, 43, 44, 46, 49, 7, 58, 59, + 60, 64, 33, 69, 70, 77, 82, 1, 83, 2, + 7, 3, 4, 5, 10, 33, 45, 6, 8, 52, + 33, 52, 15, 33, 16, 19, 20, 21, 22, 23, + 47, 30, 31, 32, 11, 29, 35, 39, 54, 40, + 41, 42, nil, 17, nil, 9, nil, nil, 25, nil, + 14, nil, nil, 66, 66, 66, 66, 14, nil, nil, + 14, 9, nil, nil, nil, 28, 25, nil, nil, nil, + 24, 26, nil, nil, nil, 14, nil, nil, nil, nil, + 52, nil, nil, 14, nil, nil, 14, 14, 14, 14, + 14, 14, 28, 11, 13, 7, 13, 17, nil, 33, + 33, nil, 14, 18, nil, nil, nil, 7, 52, nil, + 12, nil, 33, nil, nil, nil, 10, nil, nil, 14, + nil, nil, 14, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 18, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, 18, nil, 18, nil, nil, nil, nil, - 11, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, 11 ] + nil, nil, 29, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 13, 14, nil, nil, + nil, 14, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 13, 29, nil, + 14, nil, nil, nil, nil, nil, nil, nil, nil, 13, + nil, nil, 28, 14, nil, nil, nil, nil, 14, nil, + nil, 13, nil, nil, nil, nil, 14, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, 13, nil, nil, + nil, nil, nil, nil, nil, nil, 28 ] racc_goto_pointer = [ - nil, 50, 82, 80, 79, 63, 47, -3, -47, nil, - -47, -17, -141, nil, -9, -44, -21, -90, -7, -129, - 12, 20, 4, nil, 9, -38, -79, -124, -7, nil, - -114, nil, nil, nil, -142, -140, -138, -104, -193, -192, - -135, -172, -171, nil, nil, -164, nil, -175, nil, nil, - nil, -121, -135, -78, nil, nil, nil, nil, -51, -9, - -55, nil, 0, 65, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, 7, 8, nil, nil ] + nil, 47, 49, 51, 52, 53, 57, 30, 31, -15, + -107, -148, -12, -26, -21, 62, 55, -41, -4, 42, + 25, 42, -31, -90, -143, -163, -7, nil, -14, -36, + 30, -100, -160, 35, nil, 27, nil, nil, nil, -88, + -86, -85, -175, -223, -231, -237, -197, -207, nil, -224, + nil, nil, -118, nil, -100, nil, nil, nil, -83, -97, + -13, nil, nil, nil, -111, -110, -46, -115, nil, -112, + -24, nil, nil, nil, nil, nil, nil, -101, nil, nil, + nil, nil, -109, -107, nil, nil ] racc_goto_default = [ - nil, nil, nil, nil, nil, 182, nil, nil, nil, 89, - nil, 34, 147, 6, nil, nil, nil, nil, 164, nil, - nil, nil, nil, 16, nil, nil, nil, nil, 35, 57, - 224, 58, 59, 98, nil, nil, nil, nil, nil, nil, - nil, nil, 26, 163, 157, 148, 158, nil, 159, 160, - 161, 150, 151, 153, 154, 155, 156, 162, 19, 20, - 21, 22, 23, 24, 25, 27, 29, 30, 31, 33, - 37, 42, 43, 46, nil, nil, 50, 51 ] + nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, 71, 182, 112, nil, 47, nil, nil, + nil, 15, nil, nil, nil, nil, nil, 44, 79, 46, + nil, nil, nil, 80, 16, 185, 17, 18, 30, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 260, nil, + 63, 57, 48, 58, nil, 59, 60, 61, 51, 52, + 54, 55, 56, 62, nil, 64, 65, 66, 67, 68, + 69, 70, 72, 74, 75, 76, 78, nil, 82, 88, + 89, 92, nil, nil, 96, 97 ] racc_reduce_table = [ 0, 0, :racc_error, - 1, 61, :_reduce_none, - 1, 62, :_reduce_none, - 1, 62, :_reduce_none, - 2, 63, :_reduce_4, - 0, 66, :_reduce_none, - 3, 66, :_reduce_6, - 3, 67, :_reduce_7, - 1, 67, :_reduce_none, - 2, 68, :_reduce_9, 1, 69, :_reduce_none, - 1, 69, :_reduce_11, - 0, 70, :_reduce_12, - 1, 70, :_reduce_13, - 1, 70, :_reduce_14, - 3, 72, :_reduce_15, - 1, 65, :_reduce_none, - 4, 64, :_reduce_17, - 5, 64, :_reduce_18, - 3, 76, :_reduce_19, - 3, 77, :_reduce_20, - 1, 77, :_reduce_none, - 4, 75, :_reduce_22, - 3, 73, :_reduce_23, - 2, 73, :_reduce_24, - 1, 80, :_reduce_25, - 1, 80, :_reduce_26, - 3, 82, :_reduce_27, - 1, 82, :_reduce_none, - 3, 83, :_reduce_29, - 2, 83, :_reduce_30, - 1, 83, :_reduce_none, - 4, 81, :_reduce_32, - 2, 84, :_reduce_33, - 3, 74, :_reduce_34, - 2, 74, :_reduce_35, - 1, 74, :_reduce_none, - 1, 74, :_reduce_none, - 1, 90, :_reduce_none, - 1, 89, :_reduce_none, - 1, 89, :_reduce_none, - 3, 91, :_reduce_41, - 4, 91, :_reduce_42, - 5, 92, :_reduce_43, - 1, 93, :_reduce_44, - 2, 93, :_reduce_45, - 1, 93, :_reduce_46, - 2, 93, :_reduce_47, - 1, 93, :_reduce_48, - 1, 93, :_reduce_49, - 2, 93, :_reduce_50, - 1, 94, :_reduce_none, - 1, 94, :_reduce_none, - 2, 95, :_reduce_53, - 4, 96, :_reduce_54, - 1, 98, :_reduce_none, - 0, 85, :_reduce_none, - 2, 85, :_reduce_57, + 1, 70, :_reduce_none, + 1, 70, :_reduce_none, + 1, 70, :_reduce_none, + 1, 70, :_reduce_none, + 7, 73, :_reduce_6, + 3, 76, :_reduce_7, + 1, 76, :_reduce_8, + 3, 80, :_reduce_9, + 6, 74, :_reduce_10, + 2, 71, :_reduce_11, + 0, 84, :_reduce_none, + 2, 84, :_reduce_none, + 3, 85, :_reduce_14, + 4, 83, :_reduce_15, + 5, 72, :_reduce_16, + 0, 90, :_reduce_none, + 3, 90, :_reduce_18, + 3, 92, :_reduce_19, + 1, 92, :_reduce_none, + 4, 91, :_reduce_21, 0, 86, :_reduce_none, - 3, 86, :_reduce_59, - 3, 100, :_reduce_60, - 1, 100, :_reduce_none, - 1, 101, :_reduce_none, - 0, 87, :_reduce_none, - 2, 87, :_reduce_64, + 1, 86, :_reduce_none, + 1, 87, :_reduce_24, + 1, 87, :_reduce_25, + 3, 94, :_reduce_26, + 1, 94, :_reduce_none, + 3, 95, :_reduce_28, + 2, 95, :_reduce_29, + 1, 95, :_reduce_none, + 1, 95, :_reduce_none, + 0, 88, :_reduce_none, + 6, 88, :_reduce_33, + 2, 98, :_reduce_34, + 3, 89, :_reduce_35, + 2, 89, :_reduce_36, + 1, 89, :_reduce_none, + 1, 75, :_reduce_none, + 1, 75, :_reduce_none, 1, 103, :_reduce_none, - 6, 104, :_reduce_66, - 5, 104, :_reduce_67, - 4, 106, :_reduce_68, - 3, 106, :_reduce_69, + 1, 102, :_reduce_none, + 1, 102, :_reduce_none, + 3, 104, :_reduce_43, + 4, 104, :_reduce_44, + 5, 105, :_reduce_45, + 1, 106, :_reduce_46, + 2, 106, :_reduce_47, + 1, 106, :_reduce_48, + 2, 106, :_reduce_49, + 1, 106, :_reduce_50, + 1, 106, :_reduce_51, + 2, 106, :_reduce_52, 1, 107, :_reduce_none, - 3, 107, :_reduce_71, - 3, 79, :_reduce_72, - 1, 79, :_reduce_none, - 4, 108, :_reduce_74, - 3, 108, :_reduce_75, - 4, 109, :_reduce_76, - 3, 109, :_reduce_77, - 2, 110, :_reduce_78, - 1, 88, :_reduce_79, - 3, 99, :_reduce_80, - 1, 99, :_reduce_none, - 1, 97, :_reduce_none, - 3, 97, :_reduce_83, - 1, 111, :_reduce_none, - 3, 111, :_reduce_85, - 2, 112, :_reduce_86, + 1, 107, :_reduce_none, + 2, 108, :_reduce_55, + 4, 109, :_reduce_56, + 1, 110, :_reduce_none, + 0, 77, :_reduce_none, + 2, 77, :_reduce_59, + 0, 99, :_reduce_none, + 3, 99, :_reduce_61, + 3, 112, :_reduce_62, 1, 112, :_reduce_none, 1, 113, :_reduce_none, + 0, 100, :_reduce_none, + 2, 100, :_reduce_66, + 0, 78, :_reduce_none, + 3, 78, :_reduce_68, + 3, 114, :_reduce_69, 1, 114, :_reduce_none, - 3, 114, :_reduce_90, - 1, 115, :_reduce_none, - 1, 115, :_reduce_none, - 1, 115, :_reduce_none, - 1, 115, :_reduce_none, - 1, 115, :_reduce_none, - 1, 115, :_reduce_none, - 3, 116, :_reduce_97, - 3, 116, :_reduce_98, - 3, 116, :_reduce_99, - 3, 116, :_reduce_100, - 3, 116, :_reduce_101, - 3, 116, :_reduce_102, - 1, 105, :_reduce_none, - 1, 105, :_reduce_none, - 1, 117, :_reduce_none, - 1, 78, :_reduce_none, - 1, 78, :_reduce_none, - 3, 118, :_reduce_108, - 3, 118, :_reduce_109, + 2, 115, :_reduce_71, + 1, 116, :_reduce_none, + 1, 116, :_reduce_none, + 0, 117, :_reduce_74, + 1, 117, :_reduce_75, + 1, 117, :_reduce_76, + 0, 79, :_reduce_none, + 2, 79, :_reduce_78, 1, 118, :_reduce_none, - 3, 120, :_reduce_111, - 3, 120, :_reduce_112, - 1, 120, :_reduce_none, - 2, 121, :_reduce_114, - 1, 121, :_reduce_none, - 1, 123, :_reduce_none, - 1, 123, :_reduce_none, - 1, 123, :_reduce_none, - 3, 123, :_reduce_119, - 1, 124, :_reduce_none, - 1, 124, :_reduce_none, - 1, 126, :_reduce_none, + 6, 119, :_reduce_80, + 5, 119, :_reduce_81, + 4, 121, :_reduce_82, + 3, 121, :_reduce_83, + 1, 122, :_reduce_none, + 3, 122, :_reduce_85, + 3, 93, :_reduce_86, + 1, 93, :_reduce_none, + 4, 123, :_reduce_88, + 3, 123, :_reduce_89, + 4, 124, :_reduce_90, + 3, 124, :_reduce_91, + 2, 125, :_reduce_92, + 1, 101, :_reduce_93, + 3, 111, :_reduce_94, + 1, 111, :_reduce_none, + 1, 97, :_reduce_none, + 3, 97, :_reduce_97, 1, 126, :_reduce_none, - 1, 127, :_reduce_124, - 3, 102, :_reduce_125, - 1, 102, :_reduce_none, - 1, 129, :_reduce_none, - 4, 125, :_reduce_128, - 1, 125, :_reduce_none, - 4, 130, :_reduce_130, - 4, 130, :_reduce_131, - 4, 130, :_reduce_132, - 4, 130, :_reduce_133, - 4, 130, :_reduce_134, - 1, 128, :_reduce_none, + 3, 126, :_reduce_99, + 2, 127, :_reduce_100, + 1, 127, :_reduce_none, 1, 128, :_reduce_none, - 3, 131, :_reduce_137, - 2, 131, :_reduce_138, - 2, 131, :_reduce_139, - 1, 131, :_reduce_140, - 3, 132, :_reduce_141, + 3, 128, :_reduce_103, + 1, 129, :_reduce_none, + 1, 129, :_reduce_none, + 1, 129, :_reduce_none, + 1, 129, :_reduce_none, + 1, 129, :_reduce_none, + 1, 129, :_reduce_none, + 1, 129, :_reduce_none, + 3, 130, :_reduce_111, + 3, 130, :_reduce_112, + 3, 130, :_reduce_113, + 3, 130, :_reduce_114, + 3, 130, :_reduce_115, + 3, 130, :_reduce_116, + 1, 120, :_reduce_none, + 1, 120, :_reduce_none, + 1, 131, :_reduce_none, + 3, 132, :_reduce_120, + 1, 132, :_reduce_none, + 1, 82, :_reduce_none, + 1, 82, :_reduce_none, + 3, 133, :_reduce_124, + 3, 133, :_reduce_125, 1, 133, :_reduce_none, - 1, 134, :_reduce_none, - 2, 135, :_reduce_144, - 1, 135, :_reduce_145, - 1, 122, :_reduce_146, - 1, 122, :_reduce_147, - 1, 71, :_reduce_148, - 3, 119, :_reduce_149, - 2, 119, :_reduce_150, - 1, 119, :_reduce_none, + 3, 135, :_reduce_127, + 3, 135, :_reduce_128, + 1, 135, :_reduce_none, + 2, 136, :_reduce_130, 1, 136, :_reduce_none, - 2, 137, :_reduce_153 ] + 1, 138, :_reduce_none, + 1, 138, :_reduce_none, + 1, 138, :_reduce_none, + 3, 138, :_reduce_135, + 1, 138, :_reduce_136, + 1, 139, :_reduce_none, + 1, 139, :_reduce_none, + 1, 141, :_reduce_none, + 1, 141, :_reduce_none, + 1, 142, :_reduce_141, + 3, 81, :_reduce_142, + 1, 81, :_reduce_none, + 1, 145, :_reduce_none, + 1, 145, :_reduce_145, + 1, 144, :_reduce_none, + 5, 140, :_reduce_147, + 1, 140, :_reduce_none, + 4, 146, :_reduce_149, + 4, 146, :_reduce_150, + 4, 146, :_reduce_151, + 4, 146, :_reduce_152, + 4, 146, :_reduce_153, + 4, 146, :_reduce_154, + 1, 143, :_reduce_none, + 1, 143, :_reduce_none, + 3, 147, :_reduce_157, + 2, 147, :_reduce_158, + 2, 147, :_reduce_159, + 1, 147, :_reduce_160, + 3, 148, :_reduce_161, + 1, 149, :_reduce_none, + 1, 150, :_reduce_none, + 2, 151, :_reduce_164, + 1, 151, :_reduce_165, + 1, 137, :_reduce_166, + 1, 137, :_reduce_167, + 1, 96, :_reduce_168, + 3, 134, :_reduce_169, + 2, 134, :_reduce_170, + 1, 134, :_reduce_none, + 1, 152, :_reduce_none, + 2, 153, :_reduce_173 ] -racc_reduce_n = 154 +racc_reduce_n = 174 -racc_shift_n = 256 +racc_shift_n = 296 racc_token_table = { false => 0, :error => 1, - :ORDER => 2, - :BY => 3, + :UPDATE => 2, + :SET => 3, :comma => 4, - :unsigned_integer => 5, - :ASC => 6, - :DESC => 7, - :left_paren => 8, - :right_paren => 9, - :INSERT => 10, - :INTO => 11, - :VALUES => 12, - :SELECT => 13, - :asterisk => 14, - :AS => 15, - :FROM => 16, - :CROSS => 17, - :JOIN => 18, - :INNER => 19, - :LEFT => 20, - :OUTER => 21, - :RIGHT => 22, - :FULL => 23, - :ON => 24, - :USING => 25, - :WHERE => 26, - :GROUP => 27, - :HAVING => 28, - :NOT => 29, - :BETWEEN => 30, - :AND => 31, - :IN => 32, - :LIKE => 33, - :IS => 34, - :NULL => 35, - :EXISTS => 36, - :identifier => 37, - :OR => 38, - :equals_operator => 39, - :not_equals_operator => 40, - :less_than_operator => 41, - :greater_than_operator => 42, - :less_than_or_equals_operator => 43, - :greater_than_or_equals_operator => 44, - :plus_sign => 45, - :minus_sign => 46, - :solidus => 47, - :CURRENT_USER => 48, - :period => 49, - :COUNT => 50, - :AVG => 51, - :MAX => 52, - :MIN => 53, - :SUM => 54, - :E => 55, - :quote => 56, - :character_string_literal => 57, - :DATE => 58, - :date_string => 59 } - -racc_nt_base = 60 + :equals_operator => 5, + :DELETE => 6, + :FROM => 7, + :FOR => 8, + :left_paren => 9, + :right_paren => 10, + :SELECT => 11, + :INSERT => 12, + :INTO => 13, + :VALUES => 14, + :DISTINCT => 15, + :asterisk => 16, + :AS => 17, + :CROSS => 18, + :JOIN => 19, + :INNER => 20, + :LEFT => 21, + :OUTER => 22, + :RIGHT => 23, + :FULL => 24, + :ON => 25, + :USING => 26, + :WHERE => 27, + :GROUP => 28, + :BY => 29, + :HAVING => 30, + :ORDER => 31, + :ASC => 32, + :DESC => 33, + :LIMIT => 34, + :unsigned_integer => 35, + :NOT => 36, + :BETWEEN => 37, + :AND => 38, + :IN => 39, + :LIKE => 40, + :IS => 41, + :NULL => 42, + :EXISTS => 43, + :identifier => 44, + :OR => 45, + :not_equals_operator => 46, + :less_than_operator => 47, + :greater_than_operator => 48, + :less_than_or_equals_operator => 49, + :greater_than_or_equals_operator => 50, + :value_expresson => 51, + :plus_sign => 52, + :minus_sign => 53, + :solidus => 54, + :CURRENT_USER => 55, + :period => 56, + :COUNT => 57, + :AVG => 58, + :MAX => 59, + :MIN => 60, + :SUM => 61, + :COALESCE => 62, + :E => 63, + :quote => 64, + :character_string_literal => 65, + :DATE => 66, + :date_string => 67 } + +racc_nt_base = 68 racc_use_result_var = true @@ -576,21 +692,22 @@ def self.parse(sql) Racc_token_to_s_table = [ "$end", "error", - "ORDER", - "BY", + "UPDATE", + "SET", "comma", - "unsigned_integer", - "ASC", - "DESC", + "equals_operator", + "DELETE", + "FROM", + "FOR", "left_paren", "right_paren", + "SELECT", "INSERT", "INTO", "VALUES", - "SELECT", + "DISTINCT", "asterisk", "AS", - "FROM", "CROSS", "JOIN", "INNER", @@ -602,7 +719,13 @@ def self.parse(sql) "USING", "WHERE", "GROUP", + "BY", "HAVING", + "ORDER", + "ASC", + "DESC", + "LIMIT", + "unsigned_integer", "NOT", "BETWEEN", "AND", @@ -613,12 +736,12 @@ def self.parse(sql) "EXISTS", "identifier", "OR", - "equals_operator", "not_equals_operator", "less_than_operator", "greater_than_operator", "less_than_or_equals_operator", "greater_than_or_equals_operator", + "value_expresson", "plus_sign", "minus_sign", "solidus", @@ -629,6 +752,7 @@ def self.parse(sql) "MAX", "MIN", "SUM", + "COALESCE", "E", "quote", "character_string_literal", @@ -639,27 +763,32 @@ def self.parse(sql) "direct_sql_data_statement", "direct_select_statement_multiple_rows", "insert_specification", - "query_expression", + "update_statement", + "delete_statement", + "table_reference", + "assignment_list", + "where_clause", "order_by_clause", - "sort_specification_list", - "sort_specification", - "sort_key", - "ordering_specification", - "column_name", + "limit_clause", + "assignment", + "column_reference", + "value_expression", + "query_expression", + "maybe_for_update", "subquery", - "query_specification", - "table_reference", - "value_list", + "distinct", + "select_list", + "table_expression", + "table_factor", "column_list", + "value_list", "in_column_list", - "value_expression", "in_value_list", - "select_list", - "table_expression", "select_sublist", "derived_column", + "column_name", + "search_condition", "from_clause", - "where_clause", "group_by_clause", "having_clause", "table_name", @@ -671,12 +800,14 @@ def self.parse(sql) "join_specification", "join_condition", "named_columns_join", - "search_condition", "join_column_list", "column_name_list", "grouping_column_reference_list", "grouping_column_reference", - "column_reference", + "sort_specification_list", + "sort_specification", + "sort_key", + "ordering_specification", "row_subquery", "between_predicate", "row_value_constructor", @@ -688,10 +819,10 @@ def self.parse(sql) "boolean_term", "boolean_factor", "boolean_test", - "boolean_primary", "predicate", "comparison_predicate", "row_value_constructor_element", + "value_expression_list", "numeric_value_expression", "general_literal", "term", @@ -704,6 +835,7 @@ def self.parse(sql) "general_value_specification", "unsigned_numeric_literal", "qualifier", + "column_or_star", "general_set_function", "exact_numeric_literal", "approximate_numeric_literal", @@ -713,7 +845,7 @@ def self.parse(sql) "datetime_literal", "date_literal" ] -Racc_debug_parser = false +Racc_debug_parser = true ##### State transition tables end ##### @@ -725,197 +857,177 @@ def self.parse(sql) # reduce 3 omitted -module_eval(<<'.,.,', 'parser.racc', 13) - def _reduce_4(val, _values, result) - result = SQLParser::Statement::DirectSelect.new(val[0], val[1]) - result - end -.,., +# reduce 4 omitted # reduce 5 omitted -module_eval(<<'.,.,', 'parser.racc', 18) +module_eval(<<'.,.,', 'parser.racc', 15) def _reduce_6(val, _values, result) - result = SQLParser::Statement::OrderBy.new(val[2]) + result = SQLParser::Statement::Update.new(val[1], val[3], val[4], val[5], val[6]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 21) +module_eval(<<'.,.,', 'parser.racc', 18) def _reduce_7(val, _values, result) result = Array(val[0]) + Array(val[2]) result end .,., -# reduce 8 omitted - -module_eval(<<'.,.,', 'parser.racc', 25) - def _reduce_9(val, _values, result) - result = val[1].new(val[0]) +module_eval(<<'.,.,', 'parser.racc', 19) + def _reduce_8(val, _values, result) + result = Array(val[0]) result end .,., -# reduce 10 omitted - -module_eval(<<'.,.,', 'parser.racc', 29) - def _reduce_11(val, _values, result) - result = SQLParser::Statement::Integer.new(val[0]) +module_eval(<<'.,.,', 'parser.racc', 22) + def _reduce_9(val, _values, result) + result = SQLParser::Statement::Assignment.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 32) - def _reduce_12(val, _values, result) - result = SQLParser::Statement::Ascending +module_eval(<<'.,.,', 'parser.racc', 26) + def _reduce_10(val, _values, result) + result = SQLParser::Statement::Delete.new(val[2], val[3], val[4], val[5]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 33) - def _reduce_13(val, _values, result) - result = SQLParser::Statement::Ascending +module_eval(<<'.,.,', 'parser.racc', 29) + def _reduce_11(val, _values, result) + result = SQLParser::Statement::DirectSelect.new(val[0], val[1]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 34) - def _reduce_14(val, _values, result) - result = SQLParser::Statement::Descending - result - end -.,., +# reduce 12 omitted -module_eval(<<'.,.,', 'parser.racc', 39) - def _reduce_15(val, _values, result) +# reduce 13 omitted + +module_eval(<<'.,.,', 'parser.racc', 38) + def _reduce_14(val, _values, result) result = SQLParser::Statement::Subquery.new(val[1]) result end .,., -# reduce 16 omitted - -module_eval(<<'.,.,', 'parser.racc', 45) - def _reduce_17(val, _values, result) - result = SQLParser::Statement::Insert.new(val[2], nil, val[3]) +module_eval(<<'.,.,', 'parser.racc', 41) + def _reduce_15(val, _values, result) + result = SQLParser::Statement::Select.new(val[1], val[2], val[3]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 46) - def _reduce_18(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 44) + def _reduce_16(val, _values, result) result = SQLParser::Statement::Insert.new(val[2], val[3], val[4]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 49) - def _reduce_19(val, _values, result) +# reduce 17 omitted + +module_eval(<<'.,.,', 'parser.racc', 48) + def _reduce_18(val, _values, result) result = SQLParser::Statement::InColumnList.new(val[1]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 52) - def _reduce_20(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 51) + def _reduce_19(val, _values, result) result = Array(val[0]) + Array(val[2]) result end .,., -# reduce 21 omitted +# reduce 20 omitted -module_eval(<<'.,.,', 'parser.racc', 56) - def _reduce_22(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 55) + def _reduce_21(val, _values, result) result = SQLParser::Statement::InValueList.new(val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 59) - def _reduce_23(val, _values, result) - result = SQLParser::Statement::Select.new(val[1], val[2]) - result - end -.,., +# reduce 22 omitted + +# reduce 23 omitted -module_eval(<<'.,.,', 'parser.racc', 60) +module_eval(<<'.,.,', 'parser.racc', 62) def _reduce_24(val, _values, result) - result = SQLParser::Statement::Select.new(val[1]) + result = SQLParser::Statement::All.new result end .,., module_eval(<<'.,.,', 'parser.racc', 63) def _reduce_25(val, _values, result) - result = SQLParser::Statement::All.new - result - end -.,., - -module_eval(<<'.,.,', 'parser.racc', 64) - def _reduce_26(val, _values, result) result = SQLParser::Statement::SelectList.new(val[0]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 67) - def _reduce_27(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 66) + def _reduce_26(val, _values, result) result = Array(val[0]) + Array(val[2]) result end .,., -# reduce 28 omitted +# reduce 27 omitted -module_eval(<<'.,.,', 'parser.racc', 71) - def _reduce_29(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 70) + def _reduce_28(val, _values, result) result = SQLParser::Statement::As.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 72) - def _reduce_30(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 71) + def _reduce_29(val, _values, result) result = SQLParser::Statement::As.new(val[0], val[1]) result end .,., +# reduce 30 omitted + # reduce 31 omitted -module_eval(<<'.,.,', 'parser.racc', 76) - def _reduce_32(val, _values, result) - result = SQLParser::Statement::TableExpression.new(val[0], val[1], val[2], val[3]) +# reduce 32 omitted + +module_eval(<<'.,.,', 'parser.racc', 77) + def _reduce_33(val, _values, result) + result = SQLParser::Statement::TableExpression.new(val[0], val[1], val[2], val[3], val[4], val[5]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 79) - def _reduce_33(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 80) + def _reduce_34(val, _values, result) result = SQLParser::Statement::FromClause.new(val[1]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 82) - def _reduce_34(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 83) + def _reduce_35(val, _values, result) result = SQLParser::Statement::As.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 83) - def _reduce_35(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 84) + def _reduce_36(val, _values, result) result = SQLParser::Statement::As.new(val[0], val[1]) result end .,., -# reduce 36 omitted - # reduce 37 omitted # reduce 38 omitted @@ -924,557 +1036,652 @@ def _reduce_35(val, _values, result) # reduce 40 omitted -module_eval(<<'.,.,', 'parser.racc', 95) - def _reduce_41(val, _values, result) +# reduce 41 omitted + +# reduce 42 omitted + +module_eval(<<'.,.,', 'parser.racc', 99) + def _reduce_43(val, _values, result) result = SQLParser::Statement::CrossJoin.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 96) - def _reduce_42(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 100) + def _reduce_44(val, _values, result) result = SQLParser::Statement::CrossJoin.new(val[0], val[3]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 99) - def _reduce_43(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 103) + def _reduce_45(val, _values, result) result = val[1].new(val[0], val[3], val[4]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 102) - def _reduce_44(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 106) + def _reduce_46(val, _values, result) result = SQLParser::Statement::InnerJoin result end .,., -module_eval(<<'.,.,', 'parser.racc', 103) - def _reduce_45(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 107) + def _reduce_47(val, _values, result) result = SQLParser::Statement::LeftOuterJoin result end .,., -module_eval(<<'.,.,', 'parser.racc', 104) - def _reduce_46(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 108) + def _reduce_48(val, _values, result) result = SQLParser::Statement::LeftJoin result end .,., -module_eval(<<'.,.,', 'parser.racc', 105) - def _reduce_47(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 109) + def _reduce_49(val, _values, result) result = SQLParser::Statement::RightOuterJoin result end .,., -module_eval(<<'.,.,', 'parser.racc', 106) - def _reduce_48(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 110) + def _reduce_50(val, _values, result) result = SQLParser::Statement::RightJoin result end .,., -module_eval(<<'.,.,', 'parser.racc', 107) - def _reduce_49(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 111) + def _reduce_51(val, _values, result) result = SQLParser::Statement::FullJoin result end .,., -module_eval(<<'.,.,', 'parser.racc', 108) - def _reduce_50(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 112) + def _reduce_52(val, _values, result) result = SQLParser::Statement::FullOuterJoin result end .,., -# reduce 51 omitted +# reduce 53 omitted -# reduce 52 omitted +# reduce 54 omitted -module_eval(<<'.,.,', 'parser.racc', 115) - def _reduce_53(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 119) + def _reduce_55(val, _values, result) result = SQLParser::Statement::On.new(val[1]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 118) - def _reduce_54(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 122) + def _reduce_56(val, _values, result) result = SQLParser::Statement::Using.new(val[2]) result end .,., -# reduce 55 omitted +# reduce 57 omitted -# reduce 56 omitted +# reduce 58 omitted -module_eval(<<'.,.,', 'parser.racc', 125) - def _reduce_57(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 129) + def _reduce_59(val, _values, result) result = SQLParser::Statement::WhereClause.new(val[1]) result end .,., -# reduce 58 omitted +# reduce 60 omitted -module_eval(<<'.,.,', 'parser.racc', 129) - def _reduce_59(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 133) + def _reduce_61(val, _values, result) result = SQLParser::Statement::GroupByClause.new(val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 132) - def _reduce_60(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 136) + def _reduce_62(val, _values, result) result = Array(val[0]) + Array(val[2]) result end .,., -# reduce 61 omitted +# reduce 63 omitted -# reduce 62 omitted +# reduce 64 omitted -# reduce 63 omitted +# reduce 65 omitted -module_eval(<<'.,.,', 'parser.racc', 140) - def _reduce_64(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 144) + def _reduce_66(val, _values, result) result = SQLParser::Statement::HavingClause.new(val[1]) result end .,., -# reduce 65 omitted +# reduce 67 omitted -module_eval(<<'.,.,', 'parser.racc', 147) - def _reduce_66(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 148) + def _reduce_68(val, _values, result) + result = SQLParser::Statement::OrderBy.new(val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'parser.racc', 151) + def _reduce_69(val, _values, result) + result = Array(val[0]) + Array(val[2]) + result + end +.,., + +# reduce 70 omitted + +module_eval(<<'.,.,', 'parser.racc', 155) + def _reduce_71(val, _values, result) + result = val[1].new(val[0]) + result + end +.,., + +# reduce 72 omitted + +# reduce 73 omitted + +module_eval(<<'.,.,', 'parser.racc', 162) + def _reduce_74(val, _values, result) + result = SQLParser::Statement::Ascending + result + end +.,., + +module_eval(<<'.,.,', 'parser.racc', 163) + def _reduce_75(val, _values, result) + result = SQLParser::Statement::Ascending + result + end +.,., + +module_eval(<<'.,.,', 'parser.racc', 164) + def _reduce_76(val, _values, result) + result = SQLParser::Statement::Descending + result + end +.,., + +# reduce 77 omitted + +module_eval(<<'.,.,', 'parser.racc', 168) + def _reduce_78(val, _values, result) + result = SQLParser::Statement::Limit.new(val[1]) + result + end +.,., + +# reduce 79 omitted + +module_eval(<<'.,.,', 'parser.racc', 175) + def _reduce_80(val, _values, result) result = SQLParser::Statement::Not.new(SQLParser::Statement::Between.new(val[0], val[3], val[5])) result end .,., -module_eval(<<'.,.,', 'parser.racc', 148) - def _reduce_67(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 176) + def _reduce_81(val, _values, result) result = SQLParser::Statement::Between.new(val[0], val[2], val[4]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 151) - def _reduce_68(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 179) + def _reduce_82(val, _values, result) result = SQLParser::Statement::Not.new(SQLParser::Statement::In.new(val[0], val[3])) result end .,., -module_eval(<<'.,.,', 'parser.racc', 152) - def _reduce_69(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 180) + def _reduce_83(val, _values, result) result = SQLParser::Statement::In.new(val[0], val[2]) result end .,., -# reduce 70 omitted +# reduce 84 omitted -module_eval(<<'.,.,', 'parser.racc', 156) - def _reduce_71(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 184) + def _reduce_85(val, _values, result) result = SQLParser::Statement::InValueList.new(val[1]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 159) - def _reduce_72(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 187) + def _reduce_86(val, _values, result) result = Array(val[0]) + Array(val[2]) result end .,., -# reduce 73 omitted +# reduce 87 omitted -module_eval(<<'.,.,', 'parser.racc', 166) - def _reduce_74(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 194) + def _reduce_88(val, _values, result) result = SQLParser::Statement::Not.new(SQLParser::Statement::Like.new(val[0], val[3])) result end .,., -module_eval(<<'.,.,', 'parser.racc', 167) - def _reduce_75(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 195) + def _reduce_89(val, _values, result) result = SQLParser::Statement::Like.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 170) - def _reduce_76(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 198) + def _reduce_90(val, _values, result) result = SQLParser::Statement::Not.new(SQLParser::Statement::Is.new(val[0], SQLParser::Statement::Null.new)) result end .,., -module_eval(<<'.,.,', 'parser.racc', 171) - def _reduce_77(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 199) + def _reduce_91(val, _values, result) result = SQLParser::Statement::Is.new(val[0], SQLParser::Statement::Null.new) result end .,., -module_eval(<<'.,.,', 'parser.racc', 174) - def _reduce_78(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 202) + def _reduce_92(val, _values, result) result = SQLParser::Statement::Exists.new(val[1]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 178) - def _reduce_79(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 206) + def _reduce_93(val, _values, result) result = SQLParser::Statement::Table.new(val[0]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 181) - def _reduce_80(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 209) + def _reduce_94(val, _values, result) result = Array(val[0]) + Array(val[2]) result end .,., -# reduce 81 omitted +# reduce 95 omitted -# reduce 82 omitted +# reduce 96 omitted -module_eval(<<'.,.,', 'parser.racc', 187) - def _reduce_83(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 215) + def _reduce_97(val, _values, result) result = SQLParser::Statement::Or.new(val[0], val[2]) result end .,., -# reduce 84 omitted +# reduce 98 omitted -module_eval(<<'.,.,', 'parser.racc', 191) - def _reduce_85(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 219) + def _reduce_99(val, _values, result) result = SQLParser::Statement::And.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 194) - def _reduce_86(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 222) + def _reduce_100(val, _values, result) result = SQLParser::Statement::Not.new(val[1]) result end .,., -# reduce 87 omitted - -# reduce 88 omitted +# reduce 101 omitted -# reduce 89 omitted +# reduce 102 omitted -module_eval(<<'.,.,', 'parser.racc', 202) - def _reduce_90(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 227) + def _reduce_103(val, _values, result) result = val[1] result end .,., -# reduce 91 omitted +# reduce 104 omitted -# reduce 92 omitted +# reduce 105 omitted -# reduce 93 omitted +# reduce 106 omitted -# reduce 94 omitted +# reduce 107 omitted -# reduce 95 omitted +# reduce 108 omitted -# reduce 96 omitted +# reduce 109 omitted -module_eval(<<'.,.,', 'parser.racc', 213) - def _reduce_97(val, _values, result) +# reduce 110 omitted + +module_eval(<<'.,.,', 'parser.racc', 239) + def _reduce_111(val, _values, result) result = SQLParser::Statement::Equals.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 214) - def _reduce_98(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 240) + def _reduce_112(val, _values, result) result = SQLParser::Statement::Not.new(SQLParser::Statement::Equals.new(val[0], val[2])) result end .,., -module_eval(<<'.,.,', 'parser.racc', 215) - def _reduce_99(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 241) + def _reduce_113(val, _values, result) result = SQLParser::Statement::Less.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 216) - def _reduce_100(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 242) + def _reduce_114(val, _values, result) result = SQLParser::Statement::Greater.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 217) - def _reduce_101(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 243) + def _reduce_115(val, _values, result) result = SQLParser::Statement::LessOrEquals.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 218) - def _reduce_102(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 244) + def _reduce_116(val, _values, result) result = SQLParser::Statement::GreaterOrEquals.new(val[0], val[2]) result end .,., -# reduce 103 omitted +# reduce 117 omitted -# reduce 104 omitted +# reduce 118 omitted -# reduce 105 omitted +# reduce 119 omitted -# reduce 106 omitted +module_eval(<<'.,.,', 'parser.racc', 254) + def _reduce_120(val, _values, result) + result = Array(val[0]) + Array(val[2]) + result + end +.,., -# reduce 107 omitted +# reduce 121 omitted + +# reduce 122 omitted -module_eval(<<'.,.,', 'parser.racc', 232) - def _reduce_108(val, _values, result) +# reduce 123 omitted + +module_eval(<<'.,.,', 'parser.racc', 262) + def _reduce_124(val, _values, result) result = SQLParser::Statement::Add.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 233) - def _reduce_109(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 263) + def _reduce_125(val, _values, result) result = SQLParser::Statement::Subtract.new(val[0], val[2]) result end .,., -# reduce 110 omitted +# reduce 126 omitted -module_eval(<<'.,.,', 'parser.racc', 237) - def _reduce_111(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 267) + def _reduce_127(val, _values, result) result = SQLParser::Statement::Multiply.new(val[0], val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 238) - def _reduce_112(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 268) + def _reduce_128(val, _values, result) result = SQLParser::Statement::Divide.new(val[0], val[2]) result end .,., -# reduce 113 omitted +# reduce 129 omitted -module_eval(<<'.,.,', 'parser.racc', 242) - def _reduce_114(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 272) + def _reduce_130(val, _values, result) result = val[0].new(val[1]) result end .,., -# reduce 115 omitted +# reduce 131 omitted -# reduce 116 omitted +# reduce 132 omitted -# reduce 117 omitted +# reduce 133 omitted -# reduce 118 omitted +# reduce 134 omitted -module_eval(<<'.,.,', 'parser.racc', 249) - def _reduce_119(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 279) + def _reduce_135(val, _values, result) result = val[1] result end .,., -# reduce 120 omitted +module_eval(<<'.,.,', 'parser.racc', 280) + def _reduce_136(val, _values, result) + result = SQLParser::Statement::Null.new + result + end +.,., -# reduce 121 omitted +# reduce 137 omitted -# reduce 122 omitted +# reduce 138 omitted -# reduce 123 omitted +# reduce 139 omitted -module_eval(<<'.,.,', 'parser.racc', 260) - def _reduce_124(val, _values, result) +# reduce 140 omitted + +module_eval(<<'.,.,', 'parser.racc', 291) + def _reduce_141(val, _values, result) result = SQLParser::Statement::CurrentUser.new result end .,., -module_eval(<<'.,.,', 'parser.racc', 263) - def _reduce_125(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 294) + def _reduce_142(val, _values, result) result = SQLParser::Statement::QualifiedColumn.new(val[0], val[2]) result end .,., -# reduce 126 omitted +# reduce 143 omitted -# reduce 127 omitted +# reduce 144 omitted -module_eval(<<'.,.,', 'parser.racc', 270) - def _reduce_128(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 299) + def _reduce_145(val, _values, result) + result = SQLParser::Statement::All.new + result + end +.,., + +# reduce 146 omitted + +module_eval(<<'.,.,', 'parser.racc', 305) + def _reduce_147(val, _values, result) result = SQLParser::Statement::Count.new(SQLParser::Statement::All.new) result end .,., -# reduce 129 omitted +# reduce 148 omitted -module_eval(<<'.,.,', 'parser.racc', 274) - def _reduce_130(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 309) + def _reduce_149(val, _values, result) result = SQLParser::Statement::Count.new(val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 275) - def _reduce_131(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 310) + def _reduce_150(val, _values, result) result = SQLParser::Statement::Average.new(val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 276) - def _reduce_132(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 311) + def _reduce_151(val, _values, result) result = SQLParser::Statement::Maximum.new(val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 277) - def _reduce_133(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 312) + def _reduce_152(val, _values, result) result = SQLParser::Statement::Minimum.new(val[2]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 278) - def _reduce_134(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 313) + def _reduce_153(val, _values, result) result = SQLParser::Statement::Sum.new(val[2]) result end .,., -# reduce 135 omitted +module_eval(<<'.,.,', 'parser.racc', 314) + def _reduce_154(val, _values, result) + result = SQLParser::Statement::Coalesce.new(val[2]) + result + end +.,., -# reduce 136 omitted +# reduce 155 omitted -module_eval(<<'.,.,', 'parser.racc', 286) - def _reduce_137(val, _values, result) +# reduce 156 omitted + +module_eval(<<'.,.,', 'parser.racc', 322) + def _reduce_157(val, _values, result) result = SQLParser::Statement::Float.new("#{val[0]}.#{val[2]}".to_f) result end .,., -module_eval(<<'.,.,', 'parser.racc', 287) - def _reduce_138(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 323) + def _reduce_158(val, _values, result) result = SQLParser::Statement::Float.new(val[0]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 288) - def _reduce_139(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 324) + def _reduce_159(val, _values, result) result = SQLParser::Statement::Float.new("0.#{val[1]}".to_f) result end .,., -module_eval(<<'.,.,', 'parser.racc', 289) - def _reduce_140(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 325) + def _reduce_160(val, _values, result) result = SQLParser::Statement::Integer.new(val[0]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 292) - def _reduce_141(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 328) + def _reduce_161(val, _values, result) result = SQLParser::Statement::ApproximateFloat.new(val[0], val[2]) result end .,., -# reduce 142 omitted +# reduce 162 omitted -# reduce 143 omitted +# reduce 163 omitted -module_eval(<<'.,.,', 'parser.racc', 301) - def _reduce_144(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 337) + def _reduce_164(val, _values, result) result = val[0].new(SQLParser::Statement::Integer.new(val[1])) result end .,., -module_eval(<<'.,.,', 'parser.racc', 302) - def _reduce_145(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 338) + def _reduce_165(val, _values, result) result = SQLParser::Statement::Integer.new(val[0]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 305) - def _reduce_146(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 341) + def _reduce_166(val, _values, result) result = SQLParser::Statement::UnaryPlus result end .,., -module_eval(<<'.,.,', 'parser.racc', 306) - def _reduce_147(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 342) + def _reduce_167(val, _values, result) result = SQLParser::Statement::UnaryMinus result end .,., -module_eval(<<'.,.,', 'parser.racc', 310) - def _reduce_148(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 346) + def _reduce_168(val, _values, result) result = SQLParser::Statement::Column.new(val[0]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 314) - def _reduce_149(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 350) + def _reduce_169(val, _values, result) result = SQLParser::Statement::String.new(val[1]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 315) - def _reduce_150(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 351) + def _reduce_170(val, _values, result) result = SQLParser::Statement::String.new('') result end .,., -# reduce 151 omitted +# reduce 171 omitted -# reduce 152 omitted +# reduce 172 omitted -module_eval(<<'.,.,', 'parser.racc', 322) - def _reduce_153(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 358) + def _reduce_173(val, _values, result) result = SQLParser::Statement::Date.new(val[1]) result end diff --git a/lib/sql-parser/parser.rex b/lib/sql-parser/parser.rex index 2ab6b95..d1d5f14 100644 --- a/lib/sql-parser/parser.rex +++ b/lib/sql-parser/parser.rex @@ -16,64 +16,71 @@ macro IDENT \w+ rule -# [:state] pattern [actions] +# [:state] pattern [actions] # literals - \"{DATE}\" { [:date_string, Date.parse(text)] } - \'{DATE}\' { [:date_string, Date.parse(text)] } + \"{DATE}\" { [:date_string, Date.parse(text)] } + \'{DATE}\' { [:date_string, Date.parse(text)] } - \' { @state = :STRS; [:quote, text] } - :STRS \' { @state = nil; [:quote, text] } - :STRS .*(?=\') { [:character_string_literal, text.gsub("''", "'")] } + \' { @state = :STRS; [:quote, text] } + :STRS ([^\\']|\\.|'')+ { [:character_string_literal, text.gsub(/''|\\'/, "'").gsub(/""|\\"/, '"')] } + :STRS \' { @state = nil; [:quote, text] } - \" { @state = :STRD; [:quote, text] } - :STRD \" { @state = nil; [:quote, text] } - :STRD .*(?=\") { [:character_string_literal, text.gsub('""', '"')] } + \" { @state = :STRD; [:quote, text] } + :STRD \" { @state = nil; [:quote, text] } + :STRD ([^\\"]|\\.|"")+ { [:character_string_literal, text.gsub(/''|\\'/, "'").gsub(/""|\\"/, '"')] } - {UINT} { [:unsigned_integer, text.to_i] } + {UINT} { [:unsigned_integer, text.to_i] } # skip - {BLANK} # no action + {BLANK} # no action # keywords - SELECT { [:SELECT, text] } - DATE { [:DATE, text] } - ASC { [:ASC, text] } - AS { [:AS, text] } - FROM { [:FROM, text] } - WHERE { [:WHERE, text] } - BETWEEN { [:BETWEEN, text] } - AND { [:AND, text] } - NOT { [:NOT, text] } - INNER { [:INNER, text] } - INSERT { [:INSERT, text] } - INTO { [:INTO, text] } - IN { [:IN, text] } - ORDER { [:ORDER, text] } - OR { [:OR, text] } - LIKE { [:LIKE, text] } - IS { [:IS, text] } - NULL { [:NULL, text] } - COUNT { [:COUNT, text] } - AVG { [:AVG, text] } - MAX { [:MAX, text] } - MIN { [:MIN, text] } - SUM { [:SUM, text] } - GROUP { [:GROUP, text] } - BY { [:BY, text] } - HAVING { [:HAVING, text] } - CROSS { [:CROSS, text] } - JOIN { [:JOIN, text] } - ON { [:ON, text] } - LEFT { [:LEFT, text] } - OUTER { [:OUTER, text] } - RIGHT { [:RIGHT, text] } - FULL { [:FULL, text] } - USING { [:USING, text] } - EXISTS { [:EXISTS, text] } - DESC { [:DESC, text] } - CURRENT_USER { [:CURRENT_USER, text] } - VALUES { [:VALUES, text] } + SELECT(?!\w) { [:SELECT, text] } + DATE(?!\w) { [:DATE, text] } + ASC(?!\w) { [:ASC, text] } + AS(?!\w) { [:AS, text] } + FROM(?!\w) { [:FROM, text] } + WHERE(?!\w) { [:WHERE, text] } + BETWEEN(?!\w) { [:BETWEEN, text] } + AND(?!\w) { [:AND, text] } + NOT(?!\w) { [:NOT, text] } + INNER(?!\w) { [:INNER, text] } + INSERT(?!\w) { [:INSERT, text] } + INTO(?!\w) { [:INTO, text] } + IN(?!\w) { [:IN, text] } + ORDER(?!\w) { [:ORDER, text] } + LIMIT(?!\w) { [:LIMIT, text] } + OR(?!\w) { [:OR, text] } + LIKE(?!\w) { [:LIKE, text] } + IS(?!\w) { [:IS, text] } + NULL(?!\w) { [:NULL, text] } + COUNT(?!\w) { [:COUNT, text] } + AVG(?!\w) { [:AVG, text] } + MAX(?!\w) { [:MAX, text] } + MIN(?!\w) { [:MIN, text] } + SUM(?!\w) { [:SUM, text] } + GROUP(?!\w) { [:GROUP, text] } + BY(?!\w) { [:BY, text] } + HAVING(?!\w) { [:HAVING, text] } + CROSS(?!\w) { [:CROSS, text] } + JOIN(?!\w) { [:JOIN, text] } + ON(?!\w) { [:ON, text] } + LEFT(?!\w) { [:LEFT, text] } + OUTER(?!\w) { [:OUTER, text] } + RIGHT(?!\w) { [:RIGHT, text] } + FULL(?!\w) { [:FULL, text] } + USING(?!\w) { [:USING, text] } + EXISTS(?!\w) { [:EXISTS, text] } + DESC(?!\w) { [:DESC, text] } + CURRENT_USER(?!\w) { [:CURRENT_USER, text] } + VALUES(?!\w) { [:VALUES, text] } + FOR(?!\w) { [:FOR, text] } + UPDATE(?!\w) { [:UPDATE, text] } + DELETE(?!\w) { [:DELETE, text] } + SET(?!\w) { [:SET, text] } + DISTINCT(?!\w) { [:DISTINCT, text] } + COALESCE(?!\w) { [:COALESCE, text] } # tokens E { [:E, text] } diff --git a/lib/sql-parser/parser.rex.rb b/lib/sql-parser/parser.rex.rb index a9e002a..4db4a93 100644 --- a/lib/sql-parser/parser.rex.rb +++ b/lib/sql-parser/parser.rex.rb @@ -45,7 +45,7 @@ def scan_file( filename ) def next_token return if @ss.eos? - + # skips empty actions until token = _next_token or @ss.eos?; end token @@ -75,120 +75,141 @@ def _next_token when (text = @ss.scan(/\s+/i)) ; - when (text = @ss.scan(/SELECT/i)) + when (text = @ss.scan(/SELECT(?!\w)/i)) action { [:SELECT, text] } - when (text = @ss.scan(/DATE/i)) + when (text = @ss.scan(/DATE(?!\w)/i)) action { [:DATE, text] } - when (text = @ss.scan(/ASC/i)) + when (text = @ss.scan(/ASC(?!\w)/i)) action { [:ASC, text] } - when (text = @ss.scan(/AS/i)) + when (text = @ss.scan(/AS(?!\w)/i)) action { [:AS, text] } - when (text = @ss.scan(/FROM/i)) + when (text = @ss.scan(/FROM(?!\w)/i)) action { [:FROM, text] } - when (text = @ss.scan(/WHERE/i)) + when (text = @ss.scan(/WHERE(?!\w)/i)) action { [:WHERE, text] } - when (text = @ss.scan(/BETWEEN/i)) + when (text = @ss.scan(/BETWEEN(?!\w)/i)) action { [:BETWEEN, text] } - when (text = @ss.scan(/AND/i)) + when (text = @ss.scan(/AND(?!\w)/i)) action { [:AND, text] } - when (text = @ss.scan(/NOT/i)) + when (text = @ss.scan(/NOT(?!\w)/i)) action { [:NOT, text] } - when (text = @ss.scan(/INNER/i)) + when (text = @ss.scan(/INNER(?!\w)/i)) action { [:INNER, text] } - when (text = @ss.scan(/INSERT/i)) + when (text = @ss.scan(/INSERT(?!\w)/i)) action { [:INSERT, text] } - when (text = @ss.scan(/INTO/i)) + when (text = @ss.scan(/INTO(?!\w)/i)) action { [:INTO, text] } - when (text = @ss.scan(/IN/i)) + when (text = @ss.scan(/IN(?!\w)/i)) action { [:IN, text] } - when (text = @ss.scan(/ORDER/i)) + when (text = @ss.scan(/ORDER(?!\w)/i)) action { [:ORDER, text] } - when (text = @ss.scan(/OR/i)) + when (text = @ss.scan(/LIMIT(?!\w)/i)) + action { [:LIMIT, text] } + + when (text = @ss.scan(/OR(?!\w)/i)) action { [:OR, text] } - when (text = @ss.scan(/LIKE/i)) + when (text = @ss.scan(/LIKE(?!\w)/i)) action { [:LIKE, text] } - when (text = @ss.scan(/IS/i)) + when (text = @ss.scan(/IS(?!\w)/i)) action { [:IS, text] } - when (text = @ss.scan(/NULL/i)) + when (text = @ss.scan(/NULL(?!\w)/i)) action { [:NULL, text] } - when (text = @ss.scan(/COUNT/i)) + when (text = @ss.scan(/COUNT(?!\w)/i)) action { [:COUNT, text] } - when (text = @ss.scan(/AVG/i)) + when (text = @ss.scan(/AVG(?!\w)/i)) action { [:AVG, text] } - when (text = @ss.scan(/MAX/i)) + when (text = @ss.scan(/MAX(?!\w)/i)) action { [:MAX, text] } - when (text = @ss.scan(/MIN/i)) + when (text = @ss.scan(/MIN(?!\w)/i)) action { [:MIN, text] } - when (text = @ss.scan(/SUM/i)) + when (text = @ss.scan(/SUM(?!\w)/i)) action { [:SUM, text] } - when (text = @ss.scan(/GROUP/i)) + when (text = @ss.scan(/GROUP(?!\w)/i)) action { [:GROUP, text] } - when (text = @ss.scan(/BY/i)) + when (text = @ss.scan(/BY(?!\w)/i)) action { [:BY, text] } - when (text = @ss.scan(/HAVING/i)) + when (text = @ss.scan(/HAVING(?!\w)/i)) action { [:HAVING, text] } - when (text = @ss.scan(/CROSS/i)) + when (text = @ss.scan(/CROSS(?!\w)/i)) action { [:CROSS, text] } - when (text = @ss.scan(/JOIN/i)) + when (text = @ss.scan(/JOIN(?!\w)/i)) action { [:JOIN, text] } - when (text = @ss.scan(/ON/i)) + when (text = @ss.scan(/ON(?!\w)/i)) action { [:ON, text] } - when (text = @ss.scan(/LEFT/i)) + when (text = @ss.scan(/LEFT(?!\w)/i)) action { [:LEFT, text] } - when (text = @ss.scan(/OUTER/i)) + when (text = @ss.scan(/OUTER(?!\w)/i)) action { [:OUTER, text] } - when (text = @ss.scan(/RIGHT/i)) + when (text = @ss.scan(/RIGHT(?!\w)/i)) action { [:RIGHT, text] } - when (text = @ss.scan(/FULL/i)) + when (text = @ss.scan(/FULL(?!\w)/i)) action { [:FULL, text] } - when (text = @ss.scan(/USING/i)) + when (text = @ss.scan(/USING(?!\w)/i)) action { [:USING, text] } - when (text = @ss.scan(/EXISTS/i)) + when (text = @ss.scan(/EXISTS(?!\w)/i)) action { [:EXISTS, text] } - when (text = @ss.scan(/DESC/i)) + when (text = @ss.scan(/DESC(?!\w)/i)) action { [:DESC, text] } - when (text = @ss.scan(/CURRENT_USER/i)) + when (text = @ss.scan(/CURRENT_USER(?!\w)/i)) action { [:CURRENT_USER, text] } - when (text = @ss.scan(/VALUES/i)) + when (text = @ss.scan(/VALUES(?!\w)/i)) action { [:VALUES, text] } + when (text = @ss.scan(/FOR(?!\w)/i)) + action { [:FOR, text] } + + when (text = @ss.scan(/UPDATE(?!\w)/i)) + action { [:UPDATE, text] } + + when (text = @ss.scan(/DELETE(?!\w)/i)) + action { [:DELETE, text] } + + when (text = @ss.scan(/SET(?!\w)/i)) + action { [:SET, text] } + + when (text = @ss.scan(/DISTINCT(?!\w)/i)) + action { [:DISTINCT, text] } + + when (text = @ss.scan(/COALESCE(?!\w)/i)) + action { [:COALESCE, text] } + when (text = @ss.scan(/E/i)) action { [:E, text] } @@ -256,12 +277,12 @@ def _next_token when :STRS case + when (text = @ss.scan(/([^\\']|\\.|'')+/i)) + action { [:character_string_literal, text.gsub(/''|\\'/, "'").gsub(/""|\\"/, '"')] } + when (text = @ss.scan(/\'/i)) action { @state = nil; [:quote, text] } - when (text = @ss.scan(/.*(?=\')/i)) - action { [:character_string_literal, text.gsub("''", "'")] } - else text = @ss.string[@ss.pos .. -1] raise ScanError, "can not match: '" + text + "'" @@ -272,8 +293,8 @@ def _next_token when (text = @ss.scan(/\"/i)) action { @state = nil; [:quote, text] } - when (text = @ss.scan(/.*(?=\")/i)) - action { [:character_string_literal, text.gsub('""', '"')] } + when (text = @ss.scan(/([^\\"]|\\.|"")+/i)) + action { [:character_string_literal, text.gsub(/''|\\'/, "'").gsub(/""|\\"/, '"')] } else text = @ss.string[@ss.pos .. -1] diff --git a/lib/sql-parser/sql_visitor.rb b/lib/sql-parser/sql_visitor.rb index e1478c7..62eb9d3 100644 --- a/lib/sql-parser/sql_visitor.rb +++ b/lib/sql-parser/sql_visitor.rb @@ -16,18 +16,40 @@ def visit_Insert(o) values = ' VALUES ' + visit(o.in_value_list) "INSERT INTO #{name}#{columns}#{values}" end - + + def visit_Update(o) + name = visit(o.table_reference) + assignments = o.assignments.map do |assignment| + "#{visit(assignment.left)} = #{visit(assignment.right)}" + end.join(", ") + where = " " + visit(o.where_clause) if o.where_clause + order_by = " " + visit(o.order_by) if o.order_by + limit = " " + visit(o.limit) if o.limit + "UPDATE #{name} SET #{assignments}#{where}#{order_by}#{limit}" + end + + def visit_Delete(o) + name = visit(o.table_reference) + where = " " + visit(o.where_clause) if o.where_clause + order_by = " " + visit(o.order_by) if o.order_by + limit = " " + visit(o.limit) if o.limit + "DELETE FROM #{name}#{where}#{order_by}#{limit}" + end + def visit_DirectSelect(o) - [ - o.query_expression, - o.order_by - ].compact.collect { |e| visit(e) }.join(' ') + s = visit(o.query_expression) + s +=" FOR UPDATE" if o.for_update + s end def visit_OrderBy(o) "ORDER BY #{arrayize(o.sort_specification)}" end + def visit_Limit(o) + "LIMIT #{o.limit}" + end + def visit_Subquery(o) "(#{visit(o.query_specification)})" end @@ -56,7 +78,9 @@ def visit_TableExpression(o) o.from_clause, o.where_clause, o.group_by_clause, - o.having_clause + o.having_clause, + o.order_by, + o.limit, ].compact.collect { |e| visit(e) }.join(' ') end @@ -64,10 +88,6 @@ def visit_FromClause(o) "FROM #{arrayize(o.tables)}" end - def visit_OrderClause(o) - "ORDER BY #{arrayize(o.columns)}" - end - def visit_Ascending(o) "#{visit(o.column)} ASC" end @@ -106,7 +126,7 @@ def visit_And(o) def visit_Exists(o) if @negated - "NOT EXISTS #{visit(o.table_subquery)}" + unnegate { "NOT EXISTS #{visit(o.table_subquery)}" } else "EXISTS #{visit(o.table_subquery)}" end @@ -114,7 +134,7 @@ def visit_Exists(o) def visit_Is(o) if @negated - comparison('IS NOT', o) + unnegate { comparison('IS NOT', o) } else comparison('IS', o) end @@ -122,7 +142,7 @@ def visit_Is(o) def visit_Like(o) if @negated - comparison('NOT LIKE', o) + unnegate { comparison('NOT LIKE', o) } else comparison('LIKE', o) end @@ -130,7 +150,7 @@ def visit_Like(o) def visit_In(o) if @negated - comparison('NOT IN', o) + unnegate { comparison('NOT IN', o) } else comparison('IN', o) end @@ -146,7 +166,9 @@ def visit_InValueList(o) def visit_Between(o) if @negated - "#{visit(o.left)} NOT BETWEEN #{visit(o.min)} AND #{visit(o.max)}" + unnegate do + "#{visit(o.left)} NOT BETWEEN #{visit(o.min)} AND #{visit(o.max)}" + end else "#{visit(o.left)} BETWEEN #{visit(o.min)} AND #{visit(o.max)}" end @@ -170,7 +192,7 @@ def visit_Less(o) def visit_Equals(o) if @negated - comparison('<>', o) + unnegate { comparison('<>', o) } else comparison('=', o) end @@ -297,19 +319,19 @@ def visit_Date(o) end def visit_String(o) - "'%s'" % escape(o.value) + check_negated("'%s'" % escape(o.value)) end def visit_ApproximateFloat(o) - "#{visit(o.mantissa)}E#{visit(o.exponent)}" + check_negated("#{visit(o.mantissa)}E#{visit(o.exponent)}") end def visit_Float(o) - o.value.to_s + check_negated(o.value.to_s) end def visit_Integer(o) - o.value.to_s + check_negated(o.value.to_s) end private @@ -321,6 +343,22 @@ def negate @negated = false end + def unnegate + old = @negated + @negated = false + yield + ensure + @negated = old + end + + def check_negated(s) + if @negated + "NOT #{unnegate { s }}" + else + s + end + end + def quote(str) "`#{str}`" end @@ -359,4 +397,4 @@ def qualified_join(join_type, o) end -end \ No newline at end of file +end diff --git a/lib/sql-parser/statement.rb b/lib/sql-parser/statement.rb index cc878a6..6d957e2 100644 --- a/lib/sql-parser/statement.rb +++ b/lib/sql-parser/statement.rb @@ -39,19 +39,41 @@ def initialize(table_reference, column_list, in_value_list) attr_reader :table_reference attr_reader :column_list attr_reader :in_value_list - + end - + + class Update < Node + def initialize(table_reference, assignments, where_clause, order_by = nil, limit = nil) + @table_reference = table_reference + @assignments = assignments + @where_clause = where_clause + @order_by = order_by + @limit = limit + end + + attr_reader :table_reference, :assignments, :where_clause, :order_by, :limit + end + + class Delete < Node + def initialize(table_reference, where_clause, order_by = nil, limit = nil) + @table_reference = table_reference + @where_clause = where_clause + @order_by = order_by + @limit = limit + end + + attr_reader :table_reference, :where_clause, :order_by, :limit + end + class DirectSelect < Node - - def initialize(query_expression, order_by) + + def initialize(query_expression, for_update = nil) @query_expression = query_expression - @order_by = order_by + @for_update = for_update end - attr_reader :query_expression - attr_reader :order_by - + attr_reader :query_expression, :for_update + end class OrderBy < Node @@ -64,6 +86,16 @@ def initialize(sort_specification) end + class Limit < Node + + def initialize(limit) + @limit = limit + end + + attr_reader :limit + + end + class Subquery < Node def initialize(query_specification) @@ -75,11 +107,13 @@ def initialize(query_specification) end class Select < Node - def initialize(list, table_expression = nil) + def initialize(distinct, list, table_expression = nil) + @distinct = distinct @list = list @table_expression = table_expression end + attr_reader :distinct attr_reader :list attr_reader :table_expression @@ -110,17 +144,16 @@ class All < Node class TableExpression < Node - def initialize(from_clause, where_clause = nil, group_by_clause = nil, having_clause = nil) + def initialize(from_clause, where_clause = nil, group_by_clause = nil, having_clause = nil, order_by = nil, limit = nil) @from_clause = from_clause @where_clause = where_clause @group_by_clause = group_by_clause @having_clause = having_clause + @order_by = order_by + @limit = limit end - attr_reader :from_clause - attr_reader :where_clause - attr_reader :group_by_clause - attr_reader :having_clause + attr_reader :from_clause, :where_clause, :group_by_clause, :having_clause, :order_by, :limit end @@ -134,16 +167,6 @@ def initialize(tables) end - class OrderClause < Node - - def initialize(columns) - @columns = Array(columns) - end - - attr_reader :columns - - end - class OrderSpecification < Node def initialize(column) @@ -262,7 +285,7 @@ class In < ComparisonPredicate class InValueList < Node def initialize(values) - @values = values + @values = Array(values) end attr_reader :values @@ -272,7 +295,7 @@ def initialize(values) class InColumnList < Node def initialize(columns) - @columns = columns + @columns = Array(columns) end attr_reader :columns @@ -315,7 +338,10 @@ def initialize(column) end attr_reader :column - + + end + + class Coalesce < Aggregate end class Sum < Aggregate @@ -420,8 +446,8 @@ def initialize(value, column) end - class Arithmetic < Node - + class Binary < Node + def initialize(left, right) @left = left @right = right @@ -432,16 +458,19 @@ def initialize(left, right) end - class Multiply < Arithmetic + class Multiply < Binary + end + + class Divide < Binary end - class Divide < Arithmetic + class Add < Binary end - class Add < Arithmetic + class Subtract < Binary end - class Subtract < Arithmetic + class Assignment < Binary end class Unary < Node @@ -513,4 +542,4 @@ class Integer < Literal end end -end \ No newline at end of file +end diff --git a/sql-parser.gemspec b/sql-parser.gemspec index 569db16..5381ccd 100644 --- a/sql-parser.gemspec +++ b/sql-parser.gemspec @@ -19,5 +19,5 @@ Gem::Specification.new do |s| s.add_development_dependency 'rexical', '1.0.5' s.add_development_dependency 'rake' s.add_development_dependency 'pry-byebug' - + s.add_development_dependency 'test-unit' end diff --git a/test/test_parser.rb b/test/test_parser.rb index 7f956a4..03c50eb 100644 --- a/test/test_parser.rb +++ b/test/test_parser.rb @@ -10,21 +10,28 @@ def test_current_user assert_understands 'SELECT `CURRENT_USER`' assert_understands 'SELECT `current_user`' end - - def test_insert_into_clause - assert_understands 'INSERT INTO `users` VALUES (1, 2)' + + def test_insert + assert_sql "INSERT INTO `users` VALUES ('a')", "INSERT INTO users VALUES ('a')" + assert_sql "INSERT INTO `users` (`first`) VALUES (1)", "INSERT INTO users (first) VALUES (1)" + assert_understands "INSERT INTO `users` VALUES (1, 2)" + assert_understands "INSERT INTO `users` (`first`, `last`) VALUES ('a', 'b')" + assert_raise(Racc::ParseError) { SQLParser::Parser.parse("INSERT INTO `users`, `foo` VALUES (1)") } + assert_raise(Racc::ParseError) { SQLParser::Parser.parse("INSERT INTO `users` (1) VALUES (1)") } end - - def test_insert_into_clause - assert_understands 'INSERT INTO `users` VALUES (`a`, `b`)' + + def test_update + assert_understands "UPDATE `users` SET `first` = 'boom' WHERE `last` = 'foo' ORDER BY `last` ASC LIMIT 1" + assert_understands "UPDATE `users` SET `first` = 'boom', `last` = 'bam' WHERE `last` = 'foo' ORDER BY `last` ASC" + assert_understands "UPDATE `users` INNER JOIN `animals` ON `animals`.`user_id` = `users`.`id` SET `users`.`first` = 'boom', `users`.`last` = 'bam' WHERE `animals`.`name` = 'foo'" end - - def test_insert_with_quotes - q = 'INSERT INTO "users" ("active", "created_on", "email", "last_login", "password", "salt", "username") VALUES ("a", "b", "c", "c", "e")' - q.gsub!(/([^\\])"/) { $1 + '`' } - puts q.inspect - assert_understands q - + + def test_delete + assert_understands "DELETE FROM `users`" + assert_understands "DELETE FROM `users` WHERE `last` = 'foo'" + assert_understands "DELETE FROM `users` WHERE `last` = 'foo' ORDER BY `last` ASC LIMIT 1" + assert_understands "DELETE FROM `users` WHERE (`first` = 'boom' AND `last` = 'foo') ORDER BY `last` DESC LIMIT 1" + assert_understands "DELETE FROM `users` ORDER BY `last` ASC LIMIT 1" end def test_case_insensitivity @@ -39,12 +46,26 @@ def test_order_by_constant assert_sql 'SELECT * FROM `users` ORDER BY 1 ASC', 'SELECT * FROM users ORDER BY 1' assert_understands 'SELECT * FROM `users` ORDER BY 1 ASC' assert_understands 'SELECT * FROM `users` ORDER BY 1 DESC' + assert_understands 'SELECT * FROM `users` ORDER BY (1 + 1) ASC' + assert_understands "SELECT * FROM `users` ORDER BY 'a' ASC" end def test_order assert_sql 'SELECT * FROM `users` ORDER BY `name` ASC', 'SELECT * FROM users ORDER BY name' + assert_sql 'SELECT * FROM `users` ORDER BY `users`.`name` ASC', 'SELECT * FROM users ORDER BY users.name' assert_understands 'SELECT * FROM `users` ORDER BY `name` ASC' + assert_understands 'SELECT * FROM `users` ORDER BY `users`.`name` ASC' assert_understands 'SELECT * FROM `users` ORDER BY `name` DESC' + assert_understands 'SELECT * FROM `users` ORDER BY `users`.`name` DESC' + end + + def test_limit + assert_sql 'SELECT * FROM `users` LIMIT 10', 'SELECT * FROM users LIMIT 10' + end + + def test_select_where_order_limit + assert_understands "SELECT * FROM `users` WHERE `first` = 'boom' ORDER BY `first` ASC, `last` DESC LIMIT 10" + assert_understands "SELECT * FROM `users` WHERE `first` = 'boom' ORDER BY `first` DESC LIMIT 10" end def test_full_outer_join @@ -175,10 +196,16 @@ def test_in def test_not_between assert_understands 'SELECT * FROM `users` WHERE `id` NOT BETWEEN 1 AND 3' + assert_understands "SELECT * FROM `users` WHERE `id` NOT BETWEEN '1' AND '3'" + assert_understands "SELECT 0 NOT BETWEEN 1 AND 3" + assert_understands "SELECT '0' NOT BETWEEN '1' AND '3'" end def test_between assert_understands 'SELECT * FROM `users` WHERE `id` BETWEEN 1 AND 3' + assert_understands "SELECT * FROM `users` WHERE `id` BETWEEN 'a' AND 'c'" + assert_understands "SELECT 0 BETWEEN 1 AND 3" + assert_understands "SELECT '0' BETWEEN '1' AND '3'" end def test_gte @@ -243,6 +270,7 @@ def test_select_list assert_understands 'SELECT (1 + 1) AS `x`, (2 + 2) AS `y`' assert_understands 'SELECT `id`, `name`' assert_understands 'SELECT (`age` * 2) AS `double_age`, `first_name` AS `name`' + assert_understands "SELECT `first`, 1, NOT 0, 'a', 1 > 2, NULL, (1 AND 0), (1 <> 2 OR 'a' > 'b')" end def test_as @@ -280,16 +308,20 @@ def test_date assert_understands "SELECT DATE '2008-07-11'" end - def test_quoting + def test_empty_string assert_sql %{SELECT ''}, %{SELECT ""} assert_understands %{SELECT ''} + end - assert_sql %{SELECT 'Quote "this"'}, %{SELECT "Quote ""this"""} + def test_escaped_quotes + assert_sql %{SELECT 'Quote "this""', 'boom"\\\\ bam'}, %{SELECT "Quote ""this""\\"", "boom\\"\\\\ bam"} + assert_sql %{SELECT 'Quote "this""', 'boom" bam'}, %{SELECT "Quote ""this""\\"", "boom\\" bam"} + assert_sql %{SELECT 'Quote ''this'''}, %{SELECT 'Quote ''this'''} + assert_sql %{SELECT 'Quote ''this'''''}, %{SELECT 'Quote \\'this\\''''} + assert_sql %{SELECT 'Quote "this"'}, %{SELECT "Quote \\"this\\""} + assert_sql %{SELECT '"'}, %{SELECT "\\""} assert_understands %{SELECT 'Quote ''this!'''} - - # # FIXME - # assert_sql %{SELECT '"'}, %{SELECT """"} - # assert_understands %{SELECT ''''} + assert_understands %{SELECT ''''} end def test_string @@ -363,6 +395,10 @@ def test_unsigned_integer assert_understands 'SELECT 10' end + def test_invalid + assert_raise(Racc::ParseError) { SQLParser::Parser.parse('SELECT1') } + end + private def assert_sql(expected, given) diff --git a/test/test_statement.rb b/test/test_statement.rb index 70a71df..5ab18e4 100644 --- a/test/test_statement.rb +++ b/test/test_statement.rb @@ -3,11 +3,15 @@ class TestStatement < Test::Unit::TestCase def test_direct_select - assert_sql 'SELECT * FROM `users` ORDER BY `name`', SQLParser::Statement::DirectSelect.new(select(all, tblx(from(tbl('users')))), SQLParser::Statement::OrderBy.new(col('name'))) + assert_sql 'SELECT * FROM `users`', SQLParser::Statement::DirectSelect.new(select(all, tblx(from(tbl('users'))))) end def test_order_by - assert_sql 'ORDER BY `name`', SQLParser::Statement::OrderBy.new(col('name')) + assert_sql 'ORDER BY `name` ASC', order_by(asc(col('name'))) + end + + def test_limit + assert_sql 'LIMIT 10', limit(10) end def test_subquery @@ -24,6 +28,35 @@ def test_select_list assert_sql '`id`, `name`', slist([col('id'), col('name')]) end + def test_insert + assert_sql "INSERT INTO `users` VALUES ('Mr', 'President')", + SQLParser::Statement::Insert.new(tbl("users"), nil, SQLParser::Statement::InValueList.new([str("Mr"), str("President")])) + end + + def test_insert_with_column_list + assert_sql "INSERT INTO `users` (`first`, `last`) VALUES ('Mr', 'President')", + SQLParser::Statement::Insert.new( + tbl("users"), + SQLParser::Statement::InColumnList.new([col("first"), col("last")]), + SQLParser::Statement::InValueList.new([str("Mr"), str("President")])) + end + + def test_update + assert_sql "UPDATE `users` SET `first` = 'boom' WHERE `last` = 'bam' ORDER BY `first` ASC", + SQLParser::Statement::Update.new( + tbl("users"), + [SQLParser::Statement::Assignment.new(col("first"), str("boom"))], + where(equals(col("last"), str("bam"))), + order_by(asc(col('first')))) + end + + def test_delete + assert_sql "DELETE FROM `users` WHERE `first` = 'boom'", + SQLParser::Statement::Delete.new( + tbl("users"), + where(equals(col("first"), str("boom")))) + end + def test_distinct assert_sql 'DISTINCT(`username`)', distinct(col('username')) end @@ -75,8 +108,8 @@ def test_cross_join end def test_order_clause - assert_sql 'ORDER BY `name` DESC', SQLParser::Statement::OrderClause.new(SQLParser::Statement::Descending.new(col('name'))) - assert_sql 'ORDER BY `id` ASC, `name` DESC', SQLParser::Statement::OrderClause.new([SQLParser::Statement::Ascending.new(col('id')), SQLParser::Statement::Descending.new(col('name'))]) + assert_sql 'ORDER BY `name` DESC', order_by(desc(col('name'))) + assert_sql 'ORDER BY `id` ASC, `name` DESC', order_by([asc(col('id')), desc(col('name'))]) end def test_having_clause @@ -132,6 +165,10 @@ def test_between assert_sql '2 BETWEEN 1 AND 3', SQLParser::Statement::Between.new(int(2), int(1), int(3)) end + def test_between_strings + assert_sql "'2' BETWEEN '1' AND '3'", SQLParser::Statement::Between.new(str('2'), str('1'), str('3')) + end + def test_gte assert_sql '1 >= 1', SQLParser::Statement::GreaterOrEquals.new(int(1), int(1)) end @@ -302,11 +339,11 @@ def slist(ary) end def select(list, table_expression = nil) - SQLParser::Statement::Select.new(list, table_expression) + SQLParser::Statement::Select.new(nil, list, table_expression) end - def tblx(from_clause, where_clause = nil, group_by_clause = nil, having_clause = nil) - SQLParser::Statement::TableExpression.new(from_clause, where_clause, group_by_clause, having_clause) + def tblx(from_clause, where_clause = nil, group_by_clause = nil, having_clause = nil, order_by = nil, limit = nil) + SQLParser::Statement::TableExpression.new(from_clause, where_clause, group_by_clause, having_clause, order_by, limit) end def from(tables) @@ -320,4 +357,20 @@ def where(search_condition) def group_by(columns) SQLParser::Statement::GroupByClause.new(columns) end + + def order_by(sort_spec) + SQLParser::Statement::OrderBy.new(sort_spec) + end + + def asc(column) + SQLParser::Statement::Ascending.new(column) + end + + def desc(column) + SQLParser::Statement::Descending.new(column) + end + + def limit(n) + SQLParser::Statement::Limit.new(n) + end end From beefbeac517a5f62a5d54b8047724d54976d72fa Mon Sep 17 00:00:00 2001 From: Andrew Lazarus Date: Fri, 14 Oct 2016 17:00:59 -0700 Subject: [PATCH 2/2] COALESCE, sql functions, 1E1 - fix COALESCE with multiple arguments - add support for sql functions - fix 1e1, 1E1 literals: don't match identifiers that start with "e" --- Rakefile | 4 +- lib/sql-parser/parser.racc | 6 +- lib/sql-parser/parser.racc.rb | 898 ++++++++++++++++++---------------- lib/sql-parser/parser.rex | 3 +- lib/sql-parser/parser.rex.rb | 5 +- lib/sql-parser/sql_visitor.rb | 8 + lib/sql-parser/statement.rb | 25 +- test/test_parser.rb | 14 + 8 files changed, 524 insertions(+), 439 deletions(-) diff --git a/Rakefile b/Rakefile index ea020da..6a94841 100644 --- a/Rakefile +++ b/Rakefile @@ -11,11 +11,11 @@ GENERATED_PARSER = 'lib/sql-parser/parser.racc.rb' GENERATED_LEXER = 'lib/sql-parser/parser.rex.rb' file GENERATED_LEXER => 'lib/sql-parser/parser.rex' do |t| - sh "rex -o #{t.name} #{t.prerequisites.first}" + sh "bundle exec rex -o #{t.name} #{t.prerequisites.first}" end file GENERATED_PARSER => 'lib/sql-parser/parser.racc' do |t| - sh "racc -o #{t.name} #{t.prerequisites.first}" + sh "bundle exec racc -o #{t.name} #{t.prerequisites.first}" end task :parser => [GENERATED_LEXER, GENERATED_PARSER] diff --git a/lib/sql-parser/parser.racc b/lib/sql-parser/parser.racc index bd6c3fa..057e2a4 100644 --- a/lib/sql-parser/parser.racc +++ b/lib/sql-parser/parser.racc @@ -252,7 +252,7 @@ rule : value_expression value_expression_list - : value_expression_list comma value_expresson { result = Array(val[0]) + Array(val[2]) } + : value_expression comma value_expression_list { result = Array(val[0]) + Array(val[2]) } | value_expression value_expression @@ -312,7 +312,9 @@ rule | MAX left_paren value_expression right_paren { result = SQLParser::Statement::Maximum.new(val[2]) } | MIN left_paren value_expression right_paren { result = SQLParser::Statement::Minimum.new(val[2]) } | SUM left_paren value_expression right_paren { result = SQLParser::Statement::Sum.new(val[2]) } - | COALESCE left_paren value_expression_list right_paren { result = SQLParser::Statement::Coalesce.new(val[2]) } + | COALESCE left_paren value_expression_list right_paren { result = SQLParser::Statement::Coalesce.new(*val[2]) } + | sql_function left_paren value_expression_list right_paren { result = SQLParser::Statement::SQLFunction.new(val[0], *val[2]) } + | sql_function left_paren right_paren { result = SQLParser::Statement::SQLFunction.new(val[0]) } # literal numbers, strings, dates and times unsigned_numeric_literal diff --git a/lib/sql-parser/parser.racc.rb b/lib/sql-parser/parser.racc.rb index 06381b5..f0d89fa 100644 --- a/lib/sql-parser/parser.racc.rb +++ b/lib/sql-parser/parser.racc.rb @@ -11,7 +11,7 @@ module SQLParser class Parser < Racc::Parser -module_eval(<<'...end parser.racc/module_eval...', 'parser.racc', 365) +module_eval(<<'...end parser.racc/module_eval...', 'parser.racc', 367) def self.parse(sql) new.scan_str(sql) @@ -20,404 +20,426 @@ def self.parse(sql) ##### State transition tables begin ### racc_action_table = [ - 144, -133, 141, 203, 28, 35, 171, 170, 248, 187, - 157, 156, 216, 162, 249, 188, 139, 140, 29, 242, - 31, 32, -140, 33, 34, 243, 90, 111, 144, 93, - 94, 37, 37, 73, -110, 50, 111, -133, -133, -133, - 142, -110, 121, 93, 94, 244, 77, 91, 81, 83, - 84, 85, 86, 87, 90, 95, 144, 98, -140, -140, - -140, 73, 177, 50, 178, 179, 279, 280, 245, 246, - 247, 93, 94, 250, 77, 91, 81, 83, 84, 85, - 86, 87, 90, 95, 144, 98, 7, 251, 252, 73, - 8, 50, 253, 231, 256, 10, 11, 257, 264, 93, - 94, 265, 77, 91, 81, 83, 84, 85, 86, 87, - 90, 95, 266, 98, 268, 269, 40, 73, 270, 50, - 271, 50, 121, 42, 37, 277, 167, 50, 288, 289, - 77, 91, 81, 83, 84, 85, 86, 87, 28, 95, - 290, 98, 90, 53, 144, 231, 121, 293, 37, 73, - 49, 50, 29, 50, 31, 32, 12, 33, 34, 93, - 94, 19, 77, 91, 81, 83, 84, 85, 86, 87, - 90, 95, 20, 98, 22, 24, 40, 73, 25, 50, - 26, 19, 39, 19, 50, 19, 104, 93, 94, 105, - 77, 91, 81, 83, 84, 85, 86, 87, 106, 95, - 107, 98, 90, 53, 108, 37, 117, 118, 121, 73, - 49, 50, 40, 133, 10, -93, 136, 146, 147, 93, - 94, 148, 77, 91, 81, 83, 84, 85, 86, 87, - 149, 95, 150, 98, 151, 152, -162, 153, 90, 53, - 144, 154, 155, 158, 160, 73, 49, 50, 163, 19, - 19, 167, 169, 111, 19, 93, 94, 37, 77, 91, - 81, 83, 84, 85, 86, 87, 90, 95, 144, 98, - 183, 10, 212, 73, 217, 50, 219, 50, 167, 50, - 231, 232, 121, 93, 94, 234, 77, 91, 81, 83, - 84, 85, 86, 87, 90, 95, 180, 98, 136, 183, - 238, 73, 241, 50, 171, nil, nil, nil, nil, nil, - nil, 93, 94, nil, 77, 91, 81, 83, 84, 85, - 86, 87, 90, 95, 144, 98, nil, nil, nil, 73, - nil, 50, nil, nil, nil, nil, nil, nil, nil, 93, - 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, - 90, 95, 180, 98, nil, nil, nil, 73, nil, 50, - nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, - 77, 91, 81, 83, 84, 85, 86, 87, 90, 95, - 144, 98, 10, nil, nil, 73, nil, 50, nil, nil, - nil, nil, nil, nil, nil, 93, 94, nil, 77, 91, - 81, 83, 84, 85, 86, 87, 90, 95, 180, 98, + 145, 142, 173, 205, -140, 35, 220, 189, 7, 172, + 246, 164, 8, 190, 140, 141, 247, 10, 11, 159, + 158, 248, 94, 95, 284, 285, 91, 249, 145, -133, + -110, 37, 37, 73, 112, 50, 250, -110, 143, -140, + -140, -140, 94, 95, 122, 77, 92, 81, 83, 84, + 85, 86, 87, 88, 91, 96, 179, 99, 180, 181, + 40, 73, 251, 50, -133, -133, -133, 252, 253, 254, + 94, 95, 255, 77, 92, 81, 83, 84, 85, 86, + 87, 88, 256, 96, 257, 99, 91, 53, 258, 235, + 261, 262, 40, 73, 49, 50, 269, 270, 271, 273, + 274, 275, 94, 95, 50, 77, 92, 81, 83, 84, + 85, 86, 87, 88, 122, 96, 37, 99, 91, 53, + 145, 282, 169, 50, 293, 73, 49, 50, 294, 295, + 235, 122, 298, 37, 94, 95, 50, 77, 92, 81, + 83, 84, 85, 86, 87, 88, 91, 96, 145, 99, + 12, 19, 20, 73, 22, 50, 24, 25, 26, 19, + 39, 19, 94, 95, 50, 77, 92, 81, 83, 84, + 85, 86, 87, 88, 91, 96, 145, 99, 19, 105, + 106, 73, 107, 50, 108, 109, 37, 118, 119, 122, + 94, 95, 134, 77, 92, 81, 83, 84, 85, 86, + 87, 88, 91, 96, 145, 99, -93, 137, 147, 73, + 148, 50, 149, 150, 151, 152, 153, 154, 94, 95, + -164, 77, 92, 81, 83, 84, 85, 86, 87, 88, + 91, 96, 182, 99, 155, 156, 157, 73, 160, 50, + 162, 165, 19, 19, 169, 171, 94, 95, 112, 77, + 92, 81, 83, 84, 85, 86, 87, 88, 91, 96, + 145, 99, 19, 37, 185, 73, 10, 50, 216, 221, + 223, 50, 169, 50, 94, 95, 235, 77, 92, 81, + 83, 84, 85, 86, 87, 88, 91, 96, 145, 99, + 236, 122, 238, 73, 137, 50, 185, 242, 245, 173, + nil, nil, 94, 95, nil, 77, 92, 81, 83, 84, + 85, 86, 87, 88, 91, 96, 145, 99, nil, nil, + nil, 73, nil, 50, nil, nil, nil, nil, nil, nil, + 94, 95, nil, 77, 92, 81, 83, 84, 85, 86, + 87, 88, 91, 96, 145, 99, nil, nil, nil, 73, + nil, 50, nil, nil, nil, nil, nil, nil, 94, 95, + nil, 77, 92, 81, 83, 84, 85, 86, 87, 88, + 91, 96, 145, 99, nil, nil, nil, 73, 24, 50, + nil, nil, nil, nil, nil, nil, 94, 95, nil, 77, + 92, 81, 83, 84, 85, 86, 87, 88, 91, 96, + 145, 99, nil, nil, nil, 73, nil, 50, nil, nil, + nil, nil, nil, nil, 94, 95, nil, 77, 92, 81, + 83, 84, 85, 86, 87, 88, 91, 96, 145, 99, nil, nil, nil, 73, nil, 50, nil, nil, nil, nil, - nil, nil, nil, 93, 94, nil, 77, 91, 81, 83, - 84, 85, 86, 87, 90, 95, 144, 98, 10, nil, + nil, nil, 94, 95, nil, 77, 92, 81, 83, 84, + 85, 86, 87, 88, 91, 96, 145, 99, nil, nil, nil, 73, nil, 50, nil, nil, nil, nil, nil, nil, - nil, 93, 94, nil, 77, 91, 81, 83, 84, 85, - 86, 87, 90, 95, 40, 98, nil, nil, nil, 73, - nil, 50, nil, nil, nil, nil, nil, nil, nil, 93, - 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, - 90, 95, nil, 98, nil, nil, 40, 73, 49, 50, - nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, - 77, 91, 81, 83, 84, 85, 86, 87, nil, 95, - nil, 98, 90, 53, 144, nil, nil, nil, nil, 73, - 49, 50, nil, nil, nil, nil, nil, nil, nil, 93, - 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, - 90, 95, nil, 98, nil, nil, 40, 73, nil, 50, - nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, - 77, 91, 81, 83, 84, 85, 86, 87, nil, 95, - nil, 98, 90, 53, nil, nil, nil, nil, 40, 73, - 49, 50, nil, nil, nil, nil, nil, nil, nil, 93, - 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, - nil, 95, nil, 98, 90, 53, 180, nil, nil, nil, + 94, 95, nil, 77, 92, 81, 83, 84, 85, 86, + 87, 88, 91, 96, nil, 99, nil, nil, 40, 73, + nil, 50, nil, nil, nil, nil, nil, nil, 94, 95, + nil, 77, 92, 81, 83, 84, 85, 86, 87, 88, + nil, 96, nil, 99, 91, 53, 145, nil, nil, nil, nil, 73, 49, 50, nil, nil, nil, nil, nil, nil, - nil, 93, 94, nil, 77, 91, 81, 83, 84, 85, - 86, 87, 90, 95, 144, 98, nil, nil, nil, 73, - nil, 50, nil, nil, nil, nil, nil, nil, nil, 93, - 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, - 90, 95, 180, 98, nil, nil, nil, 73, nil, 50, - nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, - 77, 91, 81, 83, 84, 85, 86, 87, 90, 95, - 144, 98, nil, nil, nil, 73, nil, 50, nil, nil, - nil, nil, nil, nil, nil, 93, 94, nil, 77, 91, - 81, 83, 84, 85, 86, 87, 90, 95, 144, 98, - nil, nil, nil, 73, 24, 50, nil, nil, nil, nil, - nil, nil, nil, 93, 94, nil, 77, 91, 81, 83, - 84, 85, 86, 87, 90, 95, 180, 98, nil, nil, + 94, 95, nil, 77, 92, 81, 83, 84, 85, 86, + 87, 88, 91, 96, 182, 99, nil, nil, nil, 73, + nil, 50, nil, nil, nil, nil, nil, nil, 94, 95, + nil, 77, 92, 81, 83, 84, 85, 86, 87, 88, + 91, 96, 145, 99, nil, nil, nil, 73, nil, 50, + nil, nil, nil, nil, nil, nil, 94, 95, nil, 77, + 92, 81, 83, 84, 85, 86, 87, 88, 91, 96, + nil, 99, 145, 215, nil, 73, nil, 50, nil, nil, + nil, nil, nil, nil, 94, 95, nil, 77, 92, 81, + 83, 84, 85, 86, 87, 88, nil, 96, 91, 99, + 145, nil, nil, nil, nil, 73, nil, 50, nil, nil, + nil, nil, nil, nil, 94, 95, nil, 77, 92, 81, + 83, 84, 85, 86, 87, 88, 91, 96, nil, 99, + nil, nil, 40, 73, nil, 50, nil, nil, nil, 42, + nil, nil, 94, 95, nil, 77, 92, 81, 83, 84, + 85, 86, 87, 88, nil, 96, nil, 99, 91, 53, + nil, nil, nil, nil, nil, 73, 49, 50, 40, nil, + 10, nil, nil, nil, 94, 95, nil, 77, 92, 81, + 83, 84, 85, 86, 87, 88, nil, 96, nil, 99, + nil, nil, nil, nil, 91, 53, nil, nil, nil, nil, + 40, 73, 49, 50, nil, nil, nil, nil, nil, nil, + 94, 95, nil, 77, 92, 81, 83, 84, 85, 86, + 87, 88, nil, 96, nil, 99, 91, 53, 182, nil, + nil, nil, nil, 73, 49, 50, nil, nil, nil, nil, + nil, nil, 94, 95, nil, 77, 92, 81, 83, 84, + 85, 86, 87, 88, 91, 96, 182, 99, nil, nil, nil, 73, nil, 50, nil, nil, nil, nil, nil, nil, - nil, 93, 94, nil, 77, 91, 81, 83, 84, 85, - 86, 87, 90, 95, 180, 98, nil, nil, nil, 73, - nil, 50, nil, nil, nil, nil, nil, nil, nil, 93, - 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, - 90, 95, 180, 98, nil, nil, nil, 73, nil, 50, - nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, - 77, 91, 81, 83, 84, 85, 86, 87, 90, 95, - 180, 98, nil, nil, nil, 73, nil, 50, nil, nil, - nil, nil, nil, nil, nil, 93, 94, nil, 77, 91, - 81, 83, 84, 85, 86, 87, 90, 95, nil, 98, + 94, 95, nil, 77, 92, 81, 83, 84, 85, 86, + 87, 88, 91, 96, 145, 99, 10, nil, nil, 73, + nil, 50, nil, nil, nil, nil, nil, nil, 94, 95, + nil, 77, 92, 81, 83, 84, 85, 86, 87, 88, + 91, 96, 40, 99, nil, nil, nil, 73, nil, 50, + nil, nil, nil, nil, nil, nil, 94, 95, nil, 77, + 92, 81, 83, 84, 85, 86, 87, 88, 91, 96, + 145, 99, 10, nil, nil, 73, 49, 50, nil, nil, + nil, nil, nil, nil, 94, 95, nil, 77, 92, 81, + 83, 84, 85, 86, 87, 88, 91, 96, nil, 99, nil, nil, 40, 73, nil, 50, nil, nil, nil, nil, - nil, nil, nil, 93, 94, nil, 77, 91, 81, 83, - 84, 85, 86, 87, nil, 95, nil, 98, 90, 53, - 180, nil, nil, nil, nil, 73, 49, 50, nil, nil, - nil, nil, nil, nil, nil, 93, 94, nil, 77, 91, - 81, 83, 84, 85, 86, 87, 90, 95, 180, 98, + nil, nil, 94, 95, nil, 77, 92, 81, 83, 84, + 85, 86, 87, 88, nil, 96, nil, 99, 91, 53, + nil, nil, nil, nil, 40, 73, 49, 50, nil, nil, + nil, nil, nil, nil, 94, 95, nil, 77, 92, 81, + 83, 84, 85, 86, 87, 88, nil, 96, nil, 99, + 91, 53, 182, nil, nil, nil, nil, 73, 49, 50, + nil, nil, nil, nil, nil, nil, 94, 95, nil, 77, + 92, 81, 83, 84, 85, 86, 87, 88, 91, 96, + 182, 99, nil, nil, nil, 73, nil, 50, nil, nil, + nil, nil, nil, nil, 94, 95, nil, 77, 92, 81, + 83, 84, 85, 86, 87, 88, 91, 96, 182, 99, nil, nil, nil, 73, nil, 50, nil, nil, nil, nil, - nil, nil, nil, 93, 94, nil, 77, 91, 81, 83, - 84, 85, 86, 87, 90, 95, 144, 98, nil, nil, + nil, nil, 94, 95, nil, 77, 92, 81, 83, 84, + 85, 86, 87, 88, 91, 96, 182, 99, nil, nil, nil, 73, nil, 50, nil, nil, nil, nil, nil, nil, - nil, 93, 94, nil, 77, 91, 81, 83, 84, 85, - 86, 87, 90, 95, 144, 98, nil, nil, nil, 73, - nil, 50, nil, nil, nil, nil, nil, nil, nil, 93, - 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, - 90, 95, nil, 98, nil, nil, 40, 73, nil, 50, - nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, - 77, 91, 81, 83, 84, 85, 86, 87, nil, 95, - nil, 98, 90, 53, 144, nil, nil, nil, nil, 73, - 49, 50, nil, nil, nil, nil, nil, nil, nil, 93, - 94, nil, 77, 91, 81, 83, 84, 85, 86, 87, - 90, 95, 180, 98, nil, nil, nil, 73, nil, 50, - nil, nil, nil, nil, nil, nil, nil, 93, 94, nil, - 77, 91, 81, 83, 84, 85, 86, 87, 90, 95, - 144, 98, nil, nil, nil, 73, nil, 50, nil, nil, - nil, nil, nil, nil, nil, 93, 94, nil, 77, 91, - 81, 83, 84, 85, 86, 87, 90, 95, 144, 98, + 94, 95, nil, 77, 92, 81, 83, 84, 85, 86, + 87, 88, 91, 96, 182, 99, nil, nil, nil, 73, + nil, 50, nil, nil, nil, nil, nil, nil, 94, 95, + nil, 77, 92, 81, 83, 84, 85, 86, 87, 88, + 91, 96, 182, 99, nil, nil, nil, 73, nil, 50, + nil, nil, nil, nil, nil, nil, 94, 95, nil, 77, + 92, 81, 83, 84, 85, 86, 87, 88, 91, 96, + 182, 99, nil, nil, nil, 73, nil, 50, nil, nil, + nil, nil, nil, nil, 94, 95, nil, 77, 92, 81, + 83, 84, 85, 86, 87, 88, 91, 96, 182, 99, nil, nil, nil, 73, nil, 50, nil, nil, nil, nil, - nil, nil, nil, 93, 94, nil, 77, 91, 81, 83, - 84, 85, 86, 87, 90, 95, nil, 98, nil, nil, - nil, 73, 127, 50, nil, nil, nil, nil, nil, nil, - nil, 93, 94, nil, 77, 91, 81, 83, 84, 85, - 86, 87, -31, 95, nil, 98, -31, -119, nil, -31, - -31, nil, -31, 122, 123, 28, 124, 125, 126, 119, - nil, nil, nil, 128, 129, 130, 131, 132, nil, 29, - nil, 31, 32, nil, 33, 34, 228, 229, -119, -119, - -110, -119, -119, -119, 27, 28, 37, -110, -119, -119, - -119, -119, -119, nil, nil, nil, nil, nil, nil, 29, - nil, 31, 32, nil, 33, 34 ] + nil, nil, 94, 95, nil, 77, 92, 81, 83, 84, + 85, 86, 87, 88, 91, 96, 145, 99, nil, nil, + nil, 73, nil, 50, nil, nil, nil, nil, nil, nil, + 94, 95, nil, 77, 92, 81, 83, 84, 85, 86, + 87, 88, 91, 96, 128, 99, nil, nil, nil, 73, + nil, 50, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 77, 92, 81, 83, 84, 85, 86, 87, 88, + -119, 96, nil, 99, nil, 123, 124, nil, 125, 126, + 127, nil, nil, nil, nil, 129, 130, 131, 132, 133, + -31, nil, nil, nil, -31, nil, nil, -31, -31, nil, + -31, -119, -119, 28, -119, -119, -119, 120, nil, nil, + nil, -119, -119, -119, -119, -119, nil, 29, nil, 31, + 32, nil, 33, 34, 28, nil, 112, nil, -110, nil, + nil, nil, 27, 28, 37, -110, nil, nil, 29, nil, + 31, 32, 28, 33, 34, 232, 233, 29, nil, 31, + 32, nil, 33, 34, nil, nil, 29, nil, 31, 32, + nil, 33, 34 ] racc_action_check = [ - 140, 261, 67, 146, 38, 14, 114, 113, 210, 126, - 95, 95, 155, 100, 210, 126, 66, 66, 38, 204, - 38, 38, 65, 38, 38, 205, 140, 38, 142, 155, - 155, 146, 14, 140, 114, 140, 100, 261, 261, 261, - 67, 114, 113, 140, 140, 206, 140, 140, 140, 140, - 140, 140, 140, 140, 142, 140, 251, 140, 65, 65, - 65, 142, 122, 142, 122, 122, 260, 260, 207, 208, - 209, 142, 142, 215, 142, 142, 142, 142, 142, 142, - 142, 142, 251, 142, 68, 142, 0, 219, 220, 251, - 0, 251, 221, 222, 229, 0, 0, 231, 233, 251, - 251, 234, 251, 251, 251, 251, 251, 251, 251, 251, - 68, 251, 235, 251, 239, 240, 23, 68, 242, 68, - 248, 253, 255, 23, 256, 258, 263, 265, 272, 274, - 68, 68, 68, 68, 68, 68, 68, 68, 173, 68, - 275, 68, 23, 23, 277, 281, 282, 283, 290, 23, - 23, 23, 173, 293, 173, 173, 1, 173, 173, 23, - 23, 7, 23, 23, 23, 23, 23, 23, 23, 23, - 277, 23, 8, 23, 9, 10, 111, 277, 11, 277, - 12, 20, 22, 25, 27, 28, 29, 277, 277, 30, - 277, 277, 277, 277, 277, 277, 277, 277, 32, 277, - 33, 277, 111, 111, 34, 35, 41, 44, 46, 111, - 111, 111, 40, 49, 40, 50, 51, 78, 81, 111, - 111, 83, 111, 111, 111, 111, 111, 111, 111, 111, - 84, 111, 85, 111, 86, 87, 88, 90, 40, 40, - 152, 91, 92, 98, 99, 40, 40, 40, 102, 104, - 105, 110, 112, 116, 117, 40, 40, 119, 40, 40, - 40, 40, 40, 40, 40, 40, 152, 40, 151, 40, - 124, 133, 153, 152, 156, 152, 159, 160, 161, 162, - 166, 167, 168, 152, 152, 172, 152, 152, 152, 152, - 152, 152, 152, 152, 151, 152, 177, 152, 176, 178, - 181, 151, 187, 151, 200, nil, nil, nil, nil, nil, - nil, 151, 151, nil, 151, 151, 151, 151, 151, 151, - 151, 151, 177, 151, 269, 151, nil, nil, nil, 177, - nil, 177, nil, nil, nil, nil, nil, nil, nil, 177, - 177, nil, 177, 177, 177, 177, 177, 177, 177, 177, - 269, 177, 179, 177, nil, nil, nil, 269, nil, 269, - nil, nil, nil, nil, nil, nil, nil, 269, 269, nil, - 269, 269, 269, 269, 269, 269, 269, 269, 179, 269, - 180, 269, 180, nil, nil, 179, nil, 179, nil, nil, - nil, nil, nil, nil, nil, 179, 179, nil, 179, 179, - 179, 179, 179, 179, 179, 179, 180, 179, 266, 179, - nil, nil, nil, 180, nil, 180, nil, nil, nil, nil, - nil, nil, nil, 180, 180, nil, 180, 180, 180, 180, - 180, 180, 180, 180, 266, 180, 183, 180, 183, nil, - nil, 266, nil, 266, nil, nil, nil, nil, nil, nil, - nil, 266, 266, nil, 266, 266, 266, 266, 266, 266, - 266, 266, 183, 266, 53, 266, nil, nil, nil, 183, - nil, 183, nil, nil, nil, nil, nil, nil, nil, 183, - 183, nil, 183, 183, 183, 183, 183, 183, 183, 183, - 53, 183, nil, 183, nil, nil, 118, 53, 53, 53, - nil, nil, nil, nil, nil, nil, nil, 53, 53, nil, - 53, 53, 53, 53, 53, 53, 53, 53, nil, 53, - nil, 53, 118, 118, 150, nil, nil, nil, nil, 118, - 118, 118, nil, nil, nil, nil, nil, nil, nil, 118, - 118, nil, 118, 118, 118, 118, 118, 118, 118, 118, - 150, 118, nil, 118, nil, nil, 121, 150, nil, 150, - nil, nil, nil, nil, nil, nil, nil, 150, 150, nil, - 150, 150, 150, 150, 150, 150, 150, 150, nil, 150, - nil, 150, 121, 121, nil, nil, nil, nil, 264, 121, - 121, 121, nil, nil, nil, nil, nil, nil, nil, 121, - 121, nil, 121, 121, 121, 121, 121, 121, 121, 121, - nil, 121, nil, 121, 264, 264, 123, nil, nil, nil, - nil, 264, 264, 264, nil, nil, nil, nil, nil, nil, - nil, 264, 264, nil, 264, 264, 264, 264, 264, 264, - 264, 264, 123, 264, 149, 264, nil, nil, nil, 123, - nil, 123, nil, nil, nil, nil, nil, nil, nil, 123, - 123, nil, 123, 123, 123, 123, 123, 123, 123, 123, - 149, 123, 125, 123, nil, nil, nil, 149, nil, 149, - nil, nil, nil, nil, nil, nil, nil, 149, 149, nil, - 149, 149, 149, 149, 149, 149, 149, 149, 125, 149, - 148, 149, nil, nil, nil, 125, nil, 125, nil, nil, - nil, nil, nil, nil, nil, 125, 125, nil, 125, 125, - 125, 125, 125, 125, 125, 125, 148, 125, 147, 125, - nil, nil, nil, 148, 147, 148, nil, nil, nil, nil, - nil, nil, nil, 148, 148, nil, 148, 148, 148, 148, - 148, 148, 148, 148, 147, 148, 127, 148, nil, nil, - nil, 147, nil, 147, nil, nil, nil, nil, nil, nil, - nil, 147, 147, nil, 147, 147, 147, 147, 147, 147, - 147, 147, 127, 147, 128, 147, nil, nil, nil, 127, - nil, 127, nil, nil, nil, nil, nil, nil, nil, 127, - 127, nil, 127, 127, 127, 127, 127, 127, 127, 127, - 128, 127, 129, 127, nil, nil, nil, 128, nil, 128, - nil, nil, nil, nil, nil, nil, nil, 128, 128, nil, - 128, 128, 128, 128, 128, 128, 128, 128, 129, 128, - 130, 128, nil, nil, nil, 129, nil, 129, nil, nil, - nil, nil, nil, nil, nil, 129, 129, nil, 129, 129, - 129, 129, 129, 129, 129, 129, 130, 129, nil, 129, - nil, nil, 228, 130, nil, 130, nil, nil, nil, nil, - nil, nil, nil, 130, 130, nil, 130, 130, 130, 130, - 130, 130, 130, 130, nil, 130, nil, 130, 228, 228, - 131, nil, nil, nil, nil, 228, 228, 228, nil, nil, - nil, nil, nil, nil, nil, 228, 228, nil, 228, 228, - 228, 228, 228, 228, 228, 228, 131, 228, 132, 228, - nil, nil, nil, 131, nil, 131, nil, nil, nil, nil, - nil, nil, nil, 131, 131, nil, 131, 131, 131, 131, - 131, 131, 131, 131, 132, 131, 232, 131, nil, nil, - nil, 132, nil, 132, nil, nil, nil, nil, nil, nil, - nil, 132, 132, nil, 132, 132, 132, 132, 132, 132, - 132, 132, 232, 132, 144, 132, nil, nil, nil, 232, - nil, 232, nil, nil, nil, nil, nil, nil, nil, 232, - 232, nil, 232, 232, 232, 232, 232, 232, 232, 232, - 144, 232, nil, 232, nil, nil, 136, 144, nil, 144, - nil, nil, nil, nil, nil, nil, nil, 144, 144, nil, - 144, 144, 144, 144, 144, 144, 144, 144, nil, 144, - nil, 144, 136, 136, 163, nil, nil, nil, nil, 136, - 136, 136, nil, nil, nil, nil, nil, nil, nil, 136, - 136, nil, 136, 136, 136, 136, 136, 136, 136, 136, - 163, 136, 238, 136, nil, nil, nil, 163, nil, 163, - nil, nil, nil, nil, nil, nil, nil, 163, 163, nil, - 163, 163, 163, 163, 163, 163, 163, 163, 238, 163, - 139, 163, nil, nil, nil, 238, nil, 238, nil, nil, - nil, nil, nil, nil, nil, 238, 238, nil, 238, 238, - 238, 238, 238, 238, 238, 238, 139, 238, 141, 238, - nil, nil, nil, 139, nil, 139, nil, nil, nil, nil, - nil, nil, nil, 139, 139, nil, 139, 139, 139, 139, - 139, 139, 139, 139, 141, 139, nil, 139, nil, nil, - nil, 141, 48, 141, nil, nil, nil, nil, nil, nil, - nil, 141, 141, nil, 141, 141, 141, 141, 141, 141, - 141, 141, 45, 141, nil, 141, 45, 138, nil, 45, - 45, nil, 45, 48, 48, 165, 48, 48, 48, 45, - nil, nil, nil, 48, 48, 48, 48, 48, nil, 165, - nil, 165, 165, nil, 165, 165, 165, 165, 138, 138, - 45, 138, 138, 138, 13, 13, 45, 45, 138, 138, - 138, 138, 138, nil, nil, nil, nil, nil, nil, 13, - nil, 13, 13, nil, 13, 13 ] + 151, 67, 115, 147, 65, 14, 157, 127, 0, 114, + 206, 101, 0, 127, 66, 66, 207, 0, 0, 96, + 96, 208, 157, 157, 265, 265, 151, 209, 165, 266, + 115, 147, 14, 151, 101, 151, 210, 115, 67, 65, + 65, 65, 151, 151, 114, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 165, 151, 123, 151, 123, 123, + 232, 165, 211, 165, 266, 266, 266, 212, 213, 214, + 165, 165, 219, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 223, 165, 224, 165, 232, 232, 225, 226, + 233, 235, 137, 232, 232, 232, 237, 238, 239, 243, + 244, 246, 232, 232, 258, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 260, 232, 261, 232, 137, 137, + 236, 263, 268, 270, 277, 137, 137, 137, 279, 280, + 286, 287, 288, 295, 137, 137, 298, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 236, 137, 140, 137, + 1, 7, 8, 236, 9, 236, 10, 11, 12, 20, + 22, 25, 236, 236, 27, 236, 236, 236, 236, 236, + 236, 236, 236, 236, 140, 236, 141, 236, 28, 29, + 30, 140, 32, 140, 33, 34, 35, 41, 44, 46, + 140, 140, 49, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 141, 140, 142, 140, 50, 51, 78, 141, + 81, 141, 83, 84, 85, 86, 87, 88, 141, 141, + 89, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 142, 141, 242, 141, 91, 92, 93, 142, 99, 142, + 100, 103, 105, 106, 111, 113, 142, 142, 117, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 242, 142, + 143, 142, 118, 120, 125, 242, 134, 242, 155, 158, + 161, 162, 163, 164, 242, 242, 168, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 143, 242, 145, 242, + 169, 170, 174, 143, 178, 143, 180, 183, 189, 202, + nil, nil, 143, 143, nil, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 145, 143, 252, 143, nil, nil, + nil, 145, nil, 145, nil, nil, nil, nil, nil, nil, + 145, 145, nil, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 252, 145, 256, 145, nil, nil, nil, 252, + nil, 252, nil, nil, nil, nil, nil, nil, 252, 252, + nil, 252, 252, 252, 252, 252, 252, 252, 252, 252, + 256, 252, 148, 252, nil, nil, nil, 256, 148, 256, + nil, nil, nil, nil, nil, nil, 256, 256, nil, 256, + 256, 256, 256, 256, 256, 256, 256, 256, 148, 256, + 149, 256, nil, nil, nil, 148, nil, 148, nil, nil, + nil, nil, nil, nil, 148, 148, nil, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 149, 148, 150, 148, + nil, nil, nil, 149, nil, 149, nil, nil, nil, nil, + nil, nil, 149, 149, nil, 149, 149, 149, 149, 149, + 149, 149, 149, 149, 150, 149, 152, 149, nil, nil, + nil, 150, nil, 150, nil, nil, nil, nil, nil, nil, + 150, 150, nil, 150, 150, 150, 150, 150, 150, 150, + 150, 150, 152, 150, nil, 150, nil, nil, 269, 152, + nil, 152, nil, nil, nil, nil, nil, nil, 152, 152, + nil, 152, 152, 152, 152, 152, 152, 152, 152, 152, + nil, 152, nil, 152, 269, 269, 153, nil, nil, nil, + nil, 269, 269, 269, nil, nil, nil, nil, nil, nil, + 269, 269, nil, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 153, 269, 271, 269, nil, nil, nil, 153, + nil, 153, nil, nil, nil, nil, nil, nil, 153, 153, + nil, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 271, 153, 274, 153, nil, nil, nil, 271, nil, 271, + nil, nil, nil, nil, nil, nil, 271, 271, nil, 271, + 271, 271, 271, 271, 271, 271, 271, 271, 274, 271, + nil, 271, 154, 154, nil, 274, nil, 274, nil, nil, + nil, nil, nil, nil, 274, 274, nil, 274, 274, 274, + 274, 274, 274, 274, 274, 274, nil, 274, 154, 274, + 282, nil, nil, nil, nil, 154, nil, 154, nil, nil, + nil, nil, nil, nil, 154, 154, nil, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 282, 154, nil, 154, + nil, nil, 23, 282, nil, 282, nil, nil, nil, 23, + nil, nil, 282, 282, nil, 282, 282, 282, 282, 282, + 282, 282, 282, 282, nil, 282, nil, 282, 23, 23, + nil, nil, nil, nil, nil, 23, 23, 23, 40, nil, + 40, nil, nil, nil, 23, 23, nil, 23, 23, 23, + 23, 23, 23, 23, 23, 23, nil, 23, nil, 23, + nil, nil, nil, nil, 40, 40, nil, nil, nil, nil, + 112, 40, 40, 40, nil, nil, nil, nil, nil, nil, + 40, 40, nil, 40, 40, 40, 40, 40, 40, 40, + 40, 40, nil, 40, nil, 40, 112, 112, 179, nil, + nil, nil, nil, 112, 112, 112, nil, nil, nil, nil, + nil, nil, 112, 112, nil, 112, 112, 112, 112, 112, + 112, 112, 112, 112, 179, 112, 181, 112, nil, nil, + nil, 179, nil, 179, nil, nil, nil, nil, nil, nil, + 179, 179, nil, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 181, 179, 182, 179, 182, nil, nil, 181, + nil, 181, nil, nil, nil, nil, nil, nil, 181, 181, + nil, 181, 181, 181, 181, 181, 181, 181, 181, 181, + 182, 181, 53, 181, nil, nil, nil, 182, nil, 182, + nil, nil, nil, nil, nil, nil, 182, 182, nil, 182, + 182, 182, 182, 182, 182, 182, 182, 182, 53, 182, + 185, 182, 185, nil, nil, 53, 53, 53, nil, nil, + nil, nil, nil, nil, 53, 53, nil, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 185, 53, nil, 53, + nil, nil, 119, 185, nil, 185, nil, nil, nil, nil, + nil, nil, 185, 185, nil, 185, 185, 185, 185, 185, + 185, 185, 185, 185, nil, 185, nil, 185, 119, 119, + nil, nil, nil, nil, 122, 119, 119, 119, nil, nil, + nil, nil, nil, nil, 119, 119, nil, 119, 119, 119, + 119, 119, 119, 119, 119, 119, nil, 119, nil, 119, + 122, 122, 124, nil, nil, nil, nil, 122, 122, 122, + nil, nil, nil, nil, nil, nil, 122, 122, nil, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 124, 122, + 126, 122, nil, nil, nil, 124, nil, 124, nil, nil, + nil, nil, nil, nil, 124, 124, nil, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 126, 124, 128, 124, + nil, nil, nil, 126, nil, 126, nil, nil, nil, nil, + nil, nil, 126, 126, nil, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 128, 126, 129, 126, nil, nil, + nil, 128, nil, 128, nil, nil, nil, nil, nil, nil, + 128, 128, nil, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 129, 128, 130, 128, nil, nil, nil, 129, + nil, 129, nil, nil, nil, nil, nil, nil, 129, 129, + nil, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 130, 129, 131, 129, nil, nil, nil, 130, nil, 130, + nil, nil, nil, nil, nil, nil, 130, 130, nil, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 131, 130, + 132, 130, nil, nil, nil, 131, nil, 131, nil, nil, + nil, nil, nil, nil, 131, 131, nil, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 132, 131, 133, 131, + nil, nil, nil, 132, nil, 132, nil, nil, nil, nil, + nil, nil, 132, 132, nil, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 133, 132, 68, 132, nil, nil, + nil, 133, nil, 133, nil, nil, nil, nil, nil, nil, + 133, 133, nil, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 68, 133, 48, 133, nil, nil, nil, 68, + nil, 68, nil, nil, nil, nil, nil, nil, nil, nil, + nil, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 139, 68, nil, 68, nil, 48, 48, nil, 48, 48, + 48, nil, nil, nil, nil, 48, 48, 48, 48, 48, + 45, nil, nil, nil, 45, nil, nil, 45, 45, nil, + 45, 139, 139, 38, 139, 139, 139, 45, nil, nil, + nil, 139, 139, 139, 139, 139, nil, 38, nil, 38, + 38, nil, 38, 38, 167, nil, 38, nil, 45, nil, + nil, nil, 13, 13, 45, 45, nil, nil, 167, nil, + 167, 167, 175, 167, 167, 167, 167, 13, nil, 13, + 13, nil, 13, 13, nil, nil, 175, nil, 175, 175, + nil, 175, 175 ] racc_action_pointer = [ - 84, 156, nil, nil, nil, nil, nil, 117, 165, 166, - 160, 165, 180, 1221, -12, nil, nil, nil, nil, nil, - 137, nil, 180, 107, nil, 139, nil, 140, 141, 167, - 170, nil, 176, 178, 182, 161, nil, nil, 0, nil, - 203, 199, nil, nil, 203, 1182, 163, nil, 1157, 204, - 159, 178, nil, 455, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, 6, -36, -14, 75, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 161, nil, - nil, 209, nil, 212, 221, 223, 225, 226, 173, nil, - 181, 206, 179, nil, nil, -54, nil, nil, 176, 235, - 9, nil, 243, nil, 205, 206, nil, nil, nil, nil, - 220, 167, 242, -3, -4, nil, 226, 210, 487, 213, - nil, 547, 25, 607, 261, 663, -27, 747, 775, 803, - 831, 891, 919, 260, nil, nil, 1007, nil, 1182, 1091, - -9, 1119, 19, nil, 975, nil, -13, 719, 691, 635, - 515, 259, 231, 237, nil, -23, 210, nil, nil, 262, - 233, 247, 235, 1035, nil, 1191, 246, 252, 237, nil, - nil, nil, 257, 134, nil, nil, 260, 287, 290, 343, - 371, 262, nil, 427, nil, nil, nil, 260, nil, nil, + 6, 150, nil, nil, nil, nil, nil, 107, 145, 146, + 141, 144, 158, 1299, -12, nil, nil, nil, nil, nil, + 115, nil, 158, 653, nil, 117, nil, 120, 134, 160, + 161, nil, 160, 162, 163, 142, nil, nil, 1269, nil, + 689, 180, nil, nil, 184, 1260, 144, nil, 1209, 183, + 151, 169, nil, 833, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, -12, -37, -15, 1177, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 153, nil, + nil, 201, nil, 203, 204, 205, 206, 207, 208, 157, + nil, 179, 200, 173, nil, nil, -45, nil, nil, 171, + 231, 7, nil, 236, nil, 198, 199, nil, nil, nil, + nil, 213, 721, 235, -1, -8, nil, 221, 218, 893, + 219, nil, 925, 19, 953, 255, 981, -29, 1009, 1037, + 1065, 1093, 1121, 1149, 255, nil, nil, 83, nil, 1235, + 139, 167, 195, 251, nil, 279, nil, -13, 363, 391, + 419, -9, 447, 507, 593, 233, nil, -29, 205, nil, + nil, 256, 227, 241, 229, 19, nil, 1290, 242, 261, + 246, nil, nil, nil, 264, 1308, nil, nil, 256, 749, + 287, 777, 805, 259, nil, 861, nil, nil, nil, 256, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - 294, nil, nil, nil, 3, 15, 35, 58, 59, 60, - 4, nil, nil, nil, nil, 38, nil, nil, nil, 78, - 78, 88, 59, nil, nil, nil, nil, nil, 863, 85, - nil, 62, 947, 68, 72, 74, nil, nil, 1063, 104, - 111, nil, 108, nil, nil, nil, nil, nil, 69, nil, - nil, 47, nil, 77, nil, 77, 80, nil, 121, nil, - 34, -15, nil, 95, 579, 83, 399, nil, nil, 315, - nil, nil, 118, nil, 119, 136, nil, 135, nil, nil, - nil, 111, 101, 143, nil, nil, nil, nil, nil, nil, - 104, nil, nil, 109, nil, nil ] + nil, nil, 289, nil, nil, nil, -6, 6, 11, 17, + 26, 52, 63, 58, 59, nil, nil, nil, nil, 37, + nil, nil, nil, 73, 74, 84, 55, nil, nil, nil, + nil, nil, 51, 81, nil, 56, 111, 66, 68, 60, + nil, nil, 223, 89, 96, nil, 91, nil, nil, nil, + nil, nil, 307, nil, nil, nil, 335, nil, 60, nil, + 69, 72, nil, 117, nil, -8, 13, nil, 91, 479, + 79, 535, nil, nil, 563, nil, nil, 114, nil, 118, + 125, nil, 621, nil, nil, nil, 96, 86, 128, nil, + nil, nil, nil, nil, nil, 89, nil, nil, 92, nil, + nil ] racc_action_default = [ - -174, -174, -1, -2, -3, -4, -5, -174, -174, -12, - -22, -174, -174, -174, -37, -38, -39, -41, -42, -93, - -174, -11, -174, -174, -23, -174, 296, -174, -174, -174, - -174, -46, -48, -50, -51, -174, -36, -168, -58, -13, - -174, -32, -24, -25, -27, -119, -30, -79, -174, -174, - -168, -96, -98, -174, -101, -102, -104, -105, -106, -107, - -108, -109, -117, -118, -122, -123, -126, -129, -174, -131, - -132, -133, -134, -136, -137, -138, -139, -141, -174, -143, - -146, -174, -148, -174, -174, -174, -174, -174, -155, -156, - -160, -174, -174, -166, -167, -174, -171, -172, -174, -17, - -58, -8, -174, -43, -174, -174, -47, -49, -52, -35, - -67, -174, -174, -174, -119, -15, -58, -174, -174, -174, - -29, -174, -174, -174, -174, -174, -174, -174, -174, -174, - -174, -174, -174, -174, -40, -92, -174, -100, -110, -174, - -174, -174, -174, -130, -174, -140, -174, -22, -174, -174, - -174, -174, -174, -158, -159, -174, -174, -170, -173, -174, - -174, -67, -174, -174, -44, -174, -77, -174, -59, -14, - -103, -135, -60, -34, -26, -28, -97, -174, -174, -174, - -174, -174, -119, -174, -83, -84, -89, -174, -91, -111, - -112, -113, -114, -115, -116, -99, -124, -125, -127, -128, - -174, -142, -144, -145, -174, -174, -174, -174, -174, -174, - -174, -121, -157, -161, -163, -174, -165, -169, -16, -174, - -174, -20, -77, -7, -9, -45, -53, -54, -174, -174, - -10, -174, -174, -65, -174, -174, -82, -88, -174, -174, - -87, -90, -174, -149, -150, -151, -152, -153, -174, -154, - -164, -174, -18, -174, -6, -55, -174, -78, -68, -70, - -74, -72, -73, -67, -174, -174, -174, -81, -85, -174, - -147, -120, -174, -19, -174, -57, -95, -174, -71, -75, - -76, -77, -66, -61, -63, -64, -80, -86, -21, -56, - -174, -69, -33, -174, -94, -62 ] + -176, -176, -1, -2, -3, -4, -5, -176, -176, -12, + -22, -176, -176, -176, -37, -38, -39, -41, -42, -93, + -176, -11, -176, -176, -23, -176, 301, -176, -176, -176, + -176, -46, -48, -50, -51, -176, -36, -170, -58, -13, + -176, -32, -24, -25, -27, -119, -30, -79, -176, -176, + -170, -96, -98, -176, -101, -102, -104, -105, -106, -107, + -108, -109, -117, -118, -122, -123, -126, -129, -176, -131, + -132, -133, -134, -136, -137, -138, -139, -141, -176, -143, + -146, -176, -148, -176, -176, -176, -176, -176, -176, -157, + -158, -162, -176, -176, -168, -169, -176, -173, -174, -176, + -17, -58, -8, -176, -43, -176, -176, -47, -49, -52, + -35, -67, -176, -176, -176, -119, -15, -58, -176, -176, + -176, -29, -176, -176, -176, -176, -176, -176, -176, -176, + -176, -176, -176, -176, -176, -40, -92, -176, -100, -110, + -176, -176, -176, -176, -130, -176, -140, -176, -22, -176, + -176, -176, -176, -176, -176, -160, -161, -176, -176, -172, + -175, -176, -176, -67, -176, -176, -44, -176, -77, -176, + -59, -14, -103, -135, -60, -34, -26, -28, -97, -176, + -176, -176, -176, -176, -119, -176, -83, -84, -89, -176, + -91, -111, -112, -113, -114, -115, -116, -99, -124, -125, + -127, -128, -176, -142, -144, -145, -176, -176, -176, -176, + -176, -176, -121, -176, -176, -156, -159, -163, -165, -176, + -167, -171, -16, -176, -176, -20, -77, -7, -9, -45, + -53, -54, -176, -176, -10, -176, -176, -65, -176, -176, + -82, -88, -176, -176, -87, -90, -176, -149, -150, -151, + -152, -153, -176, -154, -155, -166, -176, -18, -176, -6, + -55, -176, -78, -68, -70, -74, -72, -73, -67, -176, + -176, -176, -81, -85, -176, -147, -120, -176, -19, -176, + -57, -95, -176, -71, -75, -76, -77, -66, -61, -63, + -64, -80, -86, -21, -56, -176, -69, -33, -176, -94, + -62 ] racc_goto_table = [ - 36, 102, 45, 166, 113, 181, 23, 186, 134, 189, - 190, 191, 192, 193, 194, 101, 43, 220, 230, 114, - 239, 109, 145, 110, 184, 259, 198, 199, 284, 196, - 197, 120, 138, 275, 283, 258, 278, 13, 176, 195, - 137, 210, 14, 215, 143, 201, 213, 1, 214, 2, - 38, 3, 4, 5, 222, 14, 295, 6, 100, 235, - 14, 237, 9, 103, 21, 41, 115, 99, 159, 218, - 291, 116, 233, 263, 254, 168, 135, 225, 236, 226, - 227, 274, nil, 134, nil, 161, nil, nil, 272, nil, - 138, nil, nil, 145, 145, 145, 145, 45, nil, nil, - 138, 172, nil, nil, nil, 175, 287, nil, nil, nil, - 273, 174, nil, nil, nil, 138, nil, nil, nil, nil, - 267, nil, nil, 200, nil, nil, 205, 206, 207, 208, - 209, 211, 202, 292, 221, 165, 102, 134, nil, 164, - 14, nil, 224, 204, nil, nil, nil, 173, 286, nil, - 223, nil, 14, nil, nil, nil, 281, nil, nil, 200, - nil, nil, 240, nil, nil, nil, nil, nil, nil, nil, + 36, 103, 114, 168, 102, 183, 23, 188, 135, 191, + 192, 193, 194, 195, 196, 14, 13, 234, 213, 214, + 45, 110, 43, 243, 224, 111, 146, 186, 14, 38, + 264, 121, 288, 14, 263, 289, 104, 115, 200, 201, + 198, 199, 283, 178, 197, 138, 219, 144, 203, 217, + 139, 1, 218, 2, 3, 226, 4, 5, 6, 101, + 239, 9, 241, 300, 21, 41, 116, 100, 161, 222, + 117, 237, 268, 136, 170, 259, 296, 229, 230, 231, + 279, 280, 240, nil, 135, nil, nil, nil, 163, nil, + nil, nil, nil, nil, 277, nil, nil, nil, 146, 146, + 146, 146, nil, nil, 174, nil, 177, nil, nil, 139, + nil, nil, 292, 166, 14, 167, 45, 276, 176, 139, + 278, nil, nil, 272, nil, nil, 14, 175, nil, nil, + nil, nil, nil, 204, 139, 297, 225, nil, 103, 135, + nil, 227, 202, nil, 206, 207, 208, 209, 210, 211, + 212, 212, 291, nil, nil, nil, nil, nil, nil, nil, + 286, nil, 228, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 202, + nil, nil, 244, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 260, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, 255, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, 261, 138, nil, nil, - nil, 262, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 221, 282, nil, - 240, nil, nil, nil, nil, nil, nil, nil, nil, 285, - nil, nil, 276, 138, nil, nil, nil, nil, 240, nil, - nil, 261, nil, nil, nil, nil, 262, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 285, nil, nil, - nil, nil, nil, nil, nil, nil, 294 ] + 266, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 139, + nil, 287, 225, 267, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 290, nil, nil, 281, nil, 212, + nil, nil, nil, 244, nil, nil, 266, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 139, nil, nil, nil, + nil, 244, 290, nil, nil, nil, nil, nil, nil, 267, + nil, 299 ] racc_goto_check = [ - 28, 13, 14, 10, 29, 52, 18, 52, 17, 52, - 52, 52, 52, 52, 52, 12, 26, 24, 11, 14, - 25, 28, 66, 9, 54, 47, 67, 67, 45, 65, - 65, 28, 14, 43, 44, 46, 49, 7, 58, 59, - 60, 64, 33, 69, 70, 77, 82, 1, 83, 2, - 7, 3, 4, 5, 10, 33, 45, 6, 8, 52, - 33, 52, 15, 33, 16, 19, 20, 21, 22, 23, - 47, 30, 31, 32, 11, 29, 35, 39, 54, 40, - 41, 42, nil, 17, nil, 9, nil, nil, 25, nil, - 14, nil, nil, 66, 66, 66, 66, 14, nil, nil, - 14, 9, nil, nil, nil, 28, 25, nil, nil, nil, - 24, 26, nil, nil, nil, 14, nil, nil, nil, nil, - 52, nil, nil, 14, nil, nil, 14, 14, 14, 14, - 14, 14, 28, 11, 13, 7, 13, 17, nil, 33, - 33, nil, 14, 18, nil, nil, nil, 7, 52, nil, - 12, nil, 33, nil, nil, nil, 10, nil, nil, 14, + 28, 13, 29, 10, 12, 52, 18, 52, 17, 52, + 52, 52, 52, 52, 52, 33, 7, 11, 64, 64, + 14, 28, 26, 25, 24, 9, 66, 54, 33, 7, + 47, 28, 44, 33, 46, 45, 33, 14, 67, 67, + 65, 65, 49, 58, 59, 60, 69, 70, 77, 82, + 14, 1, 83, 2, 3, 10, 4, 5, 6, 8, + 52, 15, 52, 45, 16, 19, 20, 21, 22, 23, + 30, 31, 32, 35, 29, 11, 47, 39, 40, 41, + 42, 43, 54, nil, 17, nil, nil, nil, 9, nil, + nil, nil, nil, nil, 25, nil, nil, nil, 66, 66, + 66, 66, nil, nil, 9, nil, 28, nil, nil, 14, + nil, nil, 25, 33, 33, 7, 14, 64, 26, 14, + 24, nil, nil, 52, nil, nil, 33, 7, nil, nil, + nil, nil, nil, 28, 14, 11, 13, nil, 13, 17, + nil, 12, 14, nil, 18, 14, 14, 14, 14, 14, + 14, 14, 52, nil, nil, nil, nil, nil, nil, nil, + 10, nil, 14, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 14, nil, nil, 14, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 29, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, 29, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, 13, 14, nil, nil, - nil, 14, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 13, 29, nil, - 14, nil, nil, nil, nil, nil, nil, nil, nil, 13, - nil, nil, 28, 14, nil, nil, nil, nil, 14, nil, - nil, 13, nil, nil, nil, nil, 14, nil, nil, nil, - nil, nil, nil, nil, nil, nil, nil, 13, nil, nil, - nil, nil, nil, nil, nil, nil, 28 ] + 13, nil, nil, nil, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, nil, nil, nil, nil, nil, 14, + nil, 29, 13, 14, nil, nil, nil, nil, nil, nil, + nil, nil, nil, nil, 13, nil, nil, 28, nil, 14, + nil, nil, nil, 14, nil, nil, 13, nil, nil, nil, + nil, nil, nil, nil, nil, nil, 14, nil, nil, nil, + nil, 14, 13, nil, nil, nil, nil, nil, nil, 14, + nil, 28 ] racc_goto_pointer = [ - nil, 47, 49, 51, 52, 53, 57, 30, 31, -15, - -107, -148, -12, -26, -21, 62, 55, -41, -4, 42, - 25, 42, -31, -90, -143, -163, -7, nil, -14, -36, - 30, -100, -160, 35, nil, 27, nil, nil, nil, -88, - -86, -85, -175, -223, -231, -237, -197, -207, nil, -224, - nil, nil, -118, nil, -100, nil, nil, nil, -83, -97, - -13, nil, nil, nil, -111, -110, -46, -115, nil, -112, - -24, nil, nil, nil, nil, nil, nil, -101, nil, nil, - nil, nil, -109, -107, nil, nil ] + nil, 51, 53, 54, 56, 57, 58, 9, 32, -13, + -108, -151, -23, -26, -3, 61, 55, -41, -4, 42, + 25, 42, -32, -92, -138, -162, -1, nil, -14, -38, + 29, -103, -165, 8, nil, 24, nil, nil, nil, -90, + -89, -88, -181, -180, -238, -235, -202, -206, nil, -223, + nil, nil, -119, nil, -98, nil, nil, nil, -79, -93, + -8, nil, nil, nil, -135, -100, -42, -104, nil, -111, + -21, nil, nil, nil, nil, nil, nil, -99, nil, nil, + nil, nil, -108, -105, nil, nil ] racc_goto_default = [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, - nil, nil, nil, 71, 182, 112, nil, 47, nil, nil, + nil, nil, nil, 71, 184, 113, nil, 47, nil, nil, nil, 15, nil, nil, nil, nil, nil, 44, 79, 46, - nil, nil, nil, 80, 16, 185, 17, 18, 30, nil, - nil, nil, nil, nil, nil, nil, nil, nil, 260, nil, + nil, nil, nil, 80, 16, 187, 17, 18, 30, nil, + nil, nil, nil, nil, nil, nil, nil, nil, 265, nil, 63, 57, 48, 58, nil, 59, 60, 61, 51, 52, 54, 55, 56, 62, nil, 64, 65, 66, 67, 68, - 69, 70, 72, 74, 75, 76, 78, nil, 82, 88, - 89, 92, nil, nil, 96, 97 ] + 69, 70, 72, 74, 75, 76, 78, nil, 82, 89, + 90, 93, nil, nil, 97, 98 ] racc_reduce_table = [ 0, 0, :racc_error, @@ -575,29 +597,31 @@ def self.parse(sql) 4, 146, :_reduce_152, 4, 146, :_reduce_153, 4, 146, :_reduce_154, + 4, 146, :_reduce_155, + 3, 146, :_reduce_156, 1, 143, :_reduce_none, 1, 143, :_reduce_none, - 3, 147, :_reduce_157, - 2, 147, :_reduce_158, - 2, 147, :_reduce_159, - 1, 147, :_reduce_160, - 3, 148, :_reduce_161, + 3, 147, :_reduce_159, + 2, 147, :_reduce_160, + 2, 147, :_reduce_161, + 1, 147, :_reduce_162, + 3, 148, :_reduce_163, 1, 149, :_reduce_none, 1, 150, :_reduce_none, - 2, 151, :_reduce_164, - 1, 151, :_reduce_165, - 1, 137, :_reduce_166, - 1, 137, :_reduce_167, - 1, 96, :_reduce_168, - 3, 134, :_reduce_169, - 2, 134, :_reduce_170, + 2, 151, :_reduce_166, + 1, 151, :_reduce_167, + 1, 137, :_reduce_168, + 1, 137, :_reduce_169, + 1, 96, :_reduce_170, + 3, 134, :_reduce_171, + 2, 134, :_reduce_172, 1, 134, :_reduce_none, 1, 152, :_reduce_none, - 2, 153, :_reduce_173 ] + 2, 153, :_reduce_175 ] -racc_reduce_n = 174 +racc_reduce_n = 176 -racc_shift_n = 296 +racc_shift_n = 301 racc_token_table = { false => 0, @@ -651,18 +675,18 @@ def self.parse(sql) :greater_than_operator => 48, :less_than_or_equals_operator => 49, :greater_than_or_equals_operator => 50, - :value_expresson => 51, - :plus_sign => 52, - :minus_sign => 53, - :solidus => 54, - :CURRENT_USER => 55, - :period => 56, - :COUNT => 57, - :AVG => 58, - :MAX => 59, - :MIN => 60, - :SUM => 61, - :COALESCE => 62, + :plus_sign => 51, + :minus_sign => 52, + :solidus => 53, + :CURRENT_USER => 54, + :period => 55, + :COUNT => 56, + :AVG => 57, + :MAX => 58, + :MIN => 59, + :SUM => 60, + :COALESCE => 61, + :sql_function => 62, :E => 63, :quote => 64, :character_string_literal => 65, @@ -741,7 +765,6 @@ def self.parse(sql) "greater_than_operator", "less_than_or_equals_operator", "greater_than_or_equals_operator", - "value_expresson", "plus_sign", "minus_sign", "solidus", @@ -753,6 +776,7 @@ def self.parse(sql) "MIN", "SUM", "COALESCE", + "sql_function", "E", "quote", "character_string_literal", @@ -1579,109 +1603,123 @@ def _reduce_153(val, _values, result) module_eval(<<'.,.,', 'parser.racc', 314) def _reduce_154(val, _values, result) - result = SQLParser::Statement::Coalesce.new(val[2]) + result = SQLParser::Statement::Coalesce.new(*val[2]) + result + end +.,., + +module_eval(<<'.,.,', 'parser.racc', 315) + def _reduce_155(val, _values, result) + result = SQLParser::Statement::SQLFunction.new(val[0], *val[2]) result end .,., -# reduce 155 omitted +module_eval(<<'.,.,', 'parser.racc', 316) + def _reduce_156(val, _values, result) + result = SQLParser::Statement::SQLFunction.new(val[0]) + result + end +.,., + +# reduce 157 omitted -# reduce 156 omitted +# reduce 158 omitted -module_eval(<<'.,.,', 'parser.racc', 322) - def _reduce_157(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 324) + def _reduce_159(val, _values, result) result = SQLParser::Statement::Float.new("#{val[0]}.#{val[2]}".to_f) result end .,., -module_eval(<<'.,.,', 'parser.racc', 323) - def _reduce_158(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 325) + def _reduce_160(val, _values, result) result = SQLParser::Statement::Float.new(val[0]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 324) - def _reduce_159(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 326) + def _reduce_161(val, _values, result) result = SQLParser::Statement::Float.new("0.#{val[1]}".to_f) result end .,., -module_eval(<<'.,.,', 'parser.racc', 325) - def _reduce_160(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 327) + def _reduce_162(val, _values, result) result = SQLParser::Statement::Integer.new(val[0]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 328) - def _reduce_161(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 330) + def _reduce_163(val, _values, result) result = SQLParser::Statement::ApproximateFloat.new(val[0], val[2]) result end .,., -# reduce 162 omitted +# reduce 164 omitted -# reduce 163 omitted +# reduce 165 omitted -module_eval(<<'.,.,', 'parser.racc', 337) - def _reduce_164(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 339) + def _reduce_166(val, _values, result) result = val[0].new(SQLParser::Statement::Integer.new(val[1])) result end .,., -module_eval(<<'.,.,', 'parser.racc', 338) - def _reduce_165(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 340) + def _reduce_167(val, _values, result) result = SQLParser::Statement::Integer.new(val[0]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 341) - def _reduce_166(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 343) + def _reduce_168(val, _values, result) result = SQLParser::Statement::UnaryPlus result end .,., -module_eval(<<'.,.,', 'parser.racc', 342) - def _reduce_167(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 344) + def _reduce_169(val, _values, result) result = SQLParser::Statement::UnaryMinus result end .,., -module_eval(<<'.,.,', 'parser.racc', 346) - def _reduce_168(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 348) + def _reduce_170(val, _values, result) result = SQLParser::Statement::Column.new(val[0]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 350) - def _reduce_169(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 352) + def _reduce_171(val, _values, result) result = SQLParser::Statement::String.new(val[1]) result end .,., -module_eval(<<'.,.,', 'parser.racc', 351) - def _reduce_170(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 353) + def _reduce_172(val, _values, result) result = SQLParser::Statement::String.new('') result end .,., -# reduce 171 omitted +# reduce 173 omitted -# reduce 172 omitted +# reduce 174 omitted -module_eval(<<'.,.,', 'parser.racc', 358) - def _reduce_173(val, _values, result) +module_eval(<<'.,.,', 'parser.racc', 360) + def _reduce_175(val, _values, result) result = SQLParser::Statement::Date.new(val[1]) result end diff --git a/lib/sql-parser/parser.rex b/lib/sql-parser/parser.rex index d1d5f14..3c1b17e 100644 --- a/lib/sql-parser/parser.rex +++ b/lib/sql-parser/parser.rex @@ -81,9 +81,10 @@ rule SET(?!\w) { [:SET, text] } DISTINCT(?!\w) { [:DISTINCT, text] } COALESCE(?!\w) { [:COALESCE, text] } + {IDENT}(?=\() { [:sql_function, text] } # tokens - E { [:E, text] } + E(?=(-|\+|\d)) { [:E, text] } <> { [:not_equals_operator, text] } != { [:not_equals_operator, text] } diff --git a/lib/sql-parser/parser.rex.rb b/lib/sql-parser/parser.rex.rb index 4db4a93..2ee84af 100644 --- a/lib/sql-parser/parser.rex.rb +++ b/lib/sql-parser/parser.rex.rb @@ -210,7 +210,10 @@ def _next_token when (text = @ss.scan(/COALESCE(?!\w)/i)) action { [:COALESCE, text] } - when (text = @ss.scan(/E/i)) + when (text = @ss.scan(/\w+(?=\()/i)) + action { [:sql_function, text] } + + when (text = @ss.scan(/E(?=(-|\+|\d))/i)) action { [:E, text] } when (text = @ss.scan(/<>/i)) diff --git a/lib/sql-parser/sql_visitor.rb b/lib/sql-parser/sql_visitor.rb index 62eb9d3..ca71b7b 100644 --- a/lib/sql-parser/sql_visitor.rb +++ b/lib/sql-parser/sql_visitor.rb @@ -218,6 +218,10 @@ def visit_Count(o) aggregate('COUNT', o) end + def visit_Coalesce(o) + "COALESCE(#{o.args.map { |arg| visit(arg) }.join(', ')})" + end + def visit_CrossJoin(o) "#{visit(o.left)} CROSS JOIN #{visit(o.right)}" end @@ -334,6 +338,10 @@ def visit_Integer(o) check_negated(o.value.to_s) end + def visit_SQLFunction(o) + "#{o.name.upcase}(#{o.args.map { |a| visit(a) }.join(', ')})" + end + private def negate diff --git a/lib/sql-parser/statement.rb b/lib/sql-parser/statement.rb index 6d957e2..aa2f6be 100644 --- a/lib/sql-parser/statement.rb +++ b/lib/sql-parser/statement.rb @@ -341,9 +341,6 @@ def initialize(column) end - class Coalesce < Aggregate - end - class Sum < Aggregate end @@ -359,6 +356,16 @@ class Average < Aggregate class Count < Aggregate end + class Coalesce < Node + + def initialize(*args) + @args = args + end + + attr_reader :args + + end + class JoinedTable < Node def initialize(left, right) @@ -540,6 +547,18 @@ class Float < Literal class Integer < Literal end + + class SQLFunction < Node + + def initialize(name, *args) + @name = name + @args = args + end + + attr_reader :name + attr_reader :args + + end end end diff --git a/test/test_parser.rb b/test/test_parser.rb index 03c50eb..bafd834 100644 --- a/test/test_parser.rb +++ b/test/test_parser.rb @@ -258,6 +258,10 @@ def test_count assert_understands 'SELECT COUNT(`id`) FROM `users`' end + def test_coalesce + assert_understands 'SELECT COALESCE(NULL, 1)' + end + def test_from_clause assert_understands 'SELECT 1 FROM `users`' assert_understands 'SELECT `id` FROM `users`' @@ -331,6 +335,7 @@ def test_string def test_approximate_numeric_literal assert_understands 'SELECT 1E1' + assert_sql 'SELECT 1E1', 'SELECT 1e1' assert_understands 'SELECT 1E+1' assert_understands 'SELECT 1E-1' @@ -353,6 +358,9 @@ def test_approximate_numeric_literal assert_understands 'SELECT -1.5E30' assert_understands 'SELECT -1.5E+30' assert_understands 'SELECT -1.5E-30' + + # doesn't mess up tables that start with e + assert_sql 'SELECT * FROM `egg`', 'SELECT * FROM egg' end def test_signed_float @@ -395,6 +403,12 @@ def test_unsigned_integer assert_understands 'SELECT 10' end + def test_sql_function + assert_understands 'SELECT NOW()' + assert_understands "SELECT CONCAT('a', 'b')" + assert_sql 'SELECT NOW()', 'SELECT now()' + end + def test_invalid assert_raise(Racc::ParseError) { SQLParser::Parser.parse('SELECT1') } end