From e8ce1c4caf4753096fb78dd659b18eb96842938c Mon Sep 17 00:00:00 2001 From: Tobias Nack Date: Tue, 18 Feb 2020 14:26:10 +0100 Subject: [PATCH] Add support to identify different set operators & allow chain of multiple set operators (#138) --- src/parser/bison_parser.cpp | 2871 ++++++++++++++++++----------------- src/parser/bison_parser.h | 5 +- src/parser/bison_parser.y | 93 +- src/parser/flex_lexer.cpp | 354 ++--- src/parser/flex_lexer.h | 8 +- src/parser/flex_lexer.l | 2 + src/sql/SelectStatement.h | 46 +- src/sql/statements.cpp | 27 +- src/util/sqlhelper.cpp | 38 +- test/sql_tests.cpp | 187 ++- 10 files changed, 2018 insertions(+), 1613 deletions(-) diff --git a/src/parser/bison_parser.cpp b/src/parser/bison_parser.cpp index 5d6632a..d9fee6b 100644 --- a/src/parser/bison_parser.cpp +++ b/src/parser/bison_parser.cpp @@ -1,4 +1,4 @@ -/* A Bison parser, made by GNU Bison 3.4.1. */ +/* A Bison parser, made by GNU Bison 3.4.2. */ /* Bison implementation for Yacc-like parsers in C @@ -48,7 +48,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "3.4.1" +#define YYBISON_VERSION "3.4.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -366,6 +366,7 @@ union HSQL_STYPE hsql::GroupByDescription* group_t; hsql::UpdateClause* update_t; hsql::Alias* alias_t; + hsql::SetOperation* set_operator_t; std::vector* stmt_vec; @@ -377,7 +378,7 @@ union HSQL_STYPE std::vector* order_vec; std::vector* with_description_vec; -#line 381 "bison_parser.cpp" +#line 382 "bison_parser.cpp" }; typedef union HSQL_STYPE HSQL_STYPE; @@ -642,16 +643,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 62 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 711 +#define YYLAST 725 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 167 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 104 +#define YYNNTS 105 /* YYNRULES -- Number of rules. */ -#define YYNRULES 256 +#define YYNRULES 258 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 462 +#define YYNSTATES 465 #define YYUNDEFTOK 2 #define YYMAXUTOK 404 @@ -712,32 +713,32 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 267, 267, 288, 294, 303, 307, 311, 314, 317, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 341, - 342, 347, 348, 352, 356, 368, 371, 374, 380, 381, - 388, 395, 398, 402, 416, 422, 431, 448, 452, 455, - 464, 478, 481, 486, 500, 513, 520, 527, 538, 539, - 543, 544, 548, 554, 555, 556, 557, 558, 559, 560, - 561, 565, 566, 567, 577, 583, 589, 597, 598, 607, - 616, 629, 636, 647, 648, 658, 667, 668, 672, 684, - 688, 692, 710, 711, 715, 716, 720, 730, 747, 751, - 752, 753, 757, 758, 762, 774, 775, 779, 783, 784, - 788, 793, 794, 798, 803, 807, 808, 812, 813, 817, - 818, 822, 826, 827, 828, 834, 835, 839, 840, 841, - 842, 843, 844, 851, 852, 856, 857, 861, 862, 866, - 876, 877, 878, 879, 880, 884, 885, 886, 887, 888, - 889, 890, 891, 892, 893, 897, 898, 902, 903, 904, - 905, 906, 910, 911, 912, 913, 914, 915, 916, 917, - 918, 919, 920, 924, 925, 929, 930, 931, 932, 938, - 939, 940, 941, 945, 946, 950, 951, 955, 956, 957, - 958, 959, 960, 961, 965, 966, 970, 974, 975, 976, - 977, 978, 979, 983, 987, 991, 995, 996, 997, 998, - 1002, 1003, 1004, 1005, 1006, 1010, 1014, 1015, 1019, 1020, - 1024, 1028, 1032, 1044, 1045, 1055, 1056, 1060, 1061, 1070, - 1071, 1076, 1087, 1096, 1097, 1102, 1103, 1108, 1109, 1114, - 1115, 1120, 1121, 1130, 1131, 1135, 1139, 1143, 1150, 1163, - 1171, 1181, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, - 1208, 1209, 1214, 1223, 1224, 1229, 1230 + 0, 269, 269, 290, 296, 305, 309, 313, 316, 319, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 343, + 344, 349, 350, 354, 358, 370, 373, 376, 382, 383, + 390, 397, 400, 404, 418, 424, 433, 450, 454, 457, + 466, 480, 483, 488, 502, 515, 522, 529, 540, 541, + 545, 546, 550, 556, 557, 558, 559, 560, 561, 562, + 563, 567, 568, 569, 579, 585, 591, 599, 600, 609, + 618, 631, 638, 649, 650, 660, 669, 670, 674, 686, + 690, 694, 708, 709, 712, 713, 724, 725, 729, 739, + 752, 759, 763, 767, 774, 777, 783, 795, 796, 800, + 804, 805, 809, 814, 815, 819, 824, 828, 829, 833, + 834, 838, 839, 843, 847, 848, 849, 855, 856, 860, + 861, 862, 863, 864, 865, 872, 873, 877, 878, 882, + 883, 887, 897, 898, 899, 900, 901, 905, 906, 907, + 908, 909, 910, 911, 912, 913, 914, 918, 919, 923, + 924, 925, 926, 927, 931, 932, 933, 934, 935, 936, + 937, 938, 939, 940, 941, 945, 946, 950, 951, 952, + 953, 959, 960, 961, 962, 966, 967, 971, 972, 976, + 977, 978, 979, 980, 981, 982, 986, 987, 991, 995, + 996, 997, 998, 999, 1000, 1004, 1008, 1012, 1016, 1017, + 1018, 1019, 1023, 1024, 1025, 1026, 1027, 1031, 1035, 1036, + 1040, 1041, 1045, 1049, 1053, 1065, 1066, 1076, 1077, 1081, + 1082, 1091, 1092, 1097, 1108, 1117, 1118, 1123, 1124, 1129, + 1130, 1135, 1136, 1141, 1142, 1151, 1152, 1156, 1160, 1164, + 1171, 1184, 1192, 1202, 1221, 1222, 1223, 1224, 1225, 1226, + 1227, 1228, 1229, 1230, 1235, 1244, 1245, 1250, 1251 }; #endif @@ -778,20 +779,21 @@ static const char *const yytname[] = "opt_column_nullable", "drop_statement", "opt_exists", "delete_statement", "truncate_statement", "insert_statement", "opt_column_list", "update_statement", "update_clause_commalist", - "update_clause", "select_statement", "select_with_paren", - "select_paren_or_clause", "select_no_paren", "set_operator", "set_type", - "opt_all", "select_clause", "opt_distinct", "select_list", - "opt_from_clause", "from_clause", "opt_where", "opt_group", "opt_having", - "opt_order", "order_list", "order_desc", "opt_order_type", "opt_top", - "opt_limit", "expr_list", "opt_literal_list", "literal_list", - "expr_alias", "expr", "operand", "scalar_expr", "unary_expr", - "binary_expr", "logic_expr", "in_expr", "case_expr", "case_list", - "exists_expr", "comp_expr", "function_expr", "extract_expr", - "datetime_field", "array_expr", "array_index", "between_expr", - "column_name", "literal", "string_literal", "bool_literal", - "num_literal", "int_literal", "null_literal", "param_expr", "table_ref", - "table_ref_atomic", "nonjoin_table_ref_atomic", "table_ref_commalist", - "table_ref_name", "table_ref_name_no_alias", "table_name", "table_alias", + "update_clause", "select_statement", "select_within_set_operation", + "select_within_set_operation_no_parentheses", "select_with_paren", + "select_no_paren", "set_operator", "set_type", "opt_all", + "select_clause", "opt_distinct", "select_list", "opt_from_clause", + "from_clause", "opt_where", "opt_group", "opt_having", "opt_order", + "order_list", "order_desc", "opt_order_type", "opt_top", "opt_limit", + "expr_list", "opt_literal_list", "literal_list", "expr_alias", "expr", + "operand", "scalar_expr", "unary_expr", "binary_expr", "logic_expr", + "in_expr", "case_expr", "case_list", "exists_expr", "comp_expr", + "function_expr", "extract_expr", "datetime_field", "array_expr", + "array_index", "between_expr", "column_name", "literal", + "string_literal", "bool_literal", "num_literal", "int_literal", + "null_literal", "param_expr", "table_ref", "table_ref_atomic", + "nonjoin_table_ref_atomic", "table_ref_commalist", "table_ref_name", + "table_ref_name_no_alias", "table_name", "table_alias", "opt_table_alias", "alias", "opt_alias", "opt_with_clause", "with_clause", "with_description_list", "with_description", "join_clause", "opt_join_type", "join_condition", "opt_semicolon", @@ -824,67 +826,67 @@ static const yytype_uint16 yytoknum[] = }; # endif -#define YYPACT_NINF -277 +#define YYPACT_NINF -369 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-277))) + (!!((Yystate) == (-369))) -#define YYTABLE_NINF -254 +#define YYTABLE_NINF -256 #define yytable_value_is_error(Yytable_value) \ - (!!((Yytable_value) == (-254))) + (!!((Yytable_value) == (-256))) /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int16 yypact[] = { - 468, 7, 40, 82, 89, 40, -19, 48, 57, 13, - 40, 40, -8, 17, 156, 29, 29, 29, 180, 38, - -277, 121, -277, 121, -277, -277, -277, -277, -277, -277, - -277, -277, -277, -277, -277, -30, -277, 211, 86, -277, - 102, 158, -277, 138, 138, 40, 264, 40, 157, -277, - -62, 162, 162, 40, -277, 166, 130, -277, -277, -277, - -277, -277, -277, 463, -277, 208, -277, -277, 185, -30, - 28, -277, 5, -277, 300, 11, 304, 196, 40, 40, - 236, -277, 226, 154, 313, 316, 316, 284, 40, 40, - -277, 161, 156, -277, 169, 325, 321, 172, 175, -277, - -277, -277, -30, 231, 220, -30, 65, -277, -277, -277, - -277, -277, -277, -277, -277, 183, 179, -277, -277, -277, - -277, -277, -277, -277, -277, -277, 299, -56, 154, 235, - -277, 316, 343, 42, 210, -23, -277, 250, -277, 250, - -277, -277, -277, -277, -277, 355, -277, -277, 235, -277, - -277, -277, 288, -277, -277, -277, 235, 288, 235, 55, - -277, -277, 11, -277, 358, 258, 362, 248, 96, 209, - 212, 133, 285, 217, 214, -277, 182, -27, 312, -277, - -277, -277, -277, -277, -277, -277, -277, -277, -277, -277, - -277, -277, -277, -277, 286, -277, -9, 218, -277, 235, - 313, -277, 335, -277, -277, 222, 66, -277, 294, 219, - -277, 25, 65, 221, -277, 75, 65, -27, 336, -26, - -277, 305, -277, 205, 71, -277, 258, 6, 16, 338, - 423, 235, 41, 69, 232, 214, 516, 235, 259, 233, - -76, 235, 235, 214, -277, 214, -46, 237, 84, 214, - 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, - 214, 214, 214, 214, 325, 40, -277, 391, 11, -27, - -277, 264, 11, -277, 355, 10, 236, -277, 235, -277, - 397, -277, -277, -277, 235, -277, -277, -277, -277, 235, - 235, 316, -277, 241, -277, -277, 246, -277, -277, -277, - 118, -277, 362, -277, -277, 235, -277, -277, 247, -277, - -277, -277, -277, -277, -277, 323, -51, 93, 235, 235, - -277, 338, 314, -14, -277, -277, -277, 303, 469, 552, - 214, 256, 182, -277, 328, 261, 552, 552, 552, 552, - 383, 383, 383, 383, 259, 259, -94, -94, -94, -87, - 267, -277, -277, 100, -277, 109, -277, 258, -277, 331, - -277, 263, -277, 23, -277, 365, -277, -277, -277, -27, - -27, -277, 424, 426, -277, 339, -277, -277, 110, -277, - 235, 235, 235, -277, 97, -18, 273, -277, 214, 552, - 182, 275, 116, -277, -277, -277, -277, 280, 351, -277, - -277, -277, 372, 375, 376, 357, 10, 447, -277, -277, - -277, 333, -277, 291, 297, -277, -277, -69, -27, 117, - -277, 235, -277, 516, 298, 135, -277, -277, 23, 10, - -277, -277, -277, 10, 420, 311, 235, -277, -277, -277, - -277, -27, -277, -277, -277, -277, 281, 343, -25, 315, - 235, 142, 235, -277, 18, -27, -277, -277, -27, 310, - 317, -277 + 482, 23, 79, 159, 178, 79, -39, 69, 95, 112, + 79, 79, -17, 26, 180, 81, 81, 81, 231, 73, + -369, 147, -369, 147, -369, -369, -369, -369, -369, -369, + -369, -369, -369, -369, -369, -23, -369, 247, 94, -369, + 100, 191, -369, 164, 164, 79, 286, 79, 184, -369, + -21, 176, 176, 79, -369, 189, 144, -369, -369, -369, + -369, -369, -369, 477, -369, 220, -369, -369, 203, -23, + 44, -369, 113, -369, 319, 10, 321, 209, 79, 79, + 251, -369, 243, 171, 330, 331, 331, 293, 79, 79, + -369, 177, 180, -369, 181, 333, 325, 182, 183, -369, + -369, -369, -23, 239, 232, -23, -9, -369, -369, -369, + -369, -369, -369, -369, -369, 199, 188, -369, -369, -369, + -369, -369, -369, -369, -369, -369, 315, -48, 171, 271, + -369, 331, 359, 2, 223, -44, -369, 261, -369, 261, + -369, -369, -369, -369, -369, 366, -369, -369, 271, -369, + -369, 300, -369, -369, 44, -369, -369, 271, 300, 271, + 126, -369, -369, 10, -369, 367, 267, 370, 259, -89, + 219, 221, 145, 299, 227, 222, -369, 194, 96, 326, + -369, -369, -369, -369, -369, -369, -369, -369, -369, -369, + -369, -369, -369, -369, -369, 290, -369, 76, 226, -369, + 271, 330, -369, 346, -369, -369, 230, 105, -369, 305, + 228, -369, 17, -9, -23, 229, -369, -46, -9, 96, + 348, 1, -369, 313, -369, 492, 106, -369, 267, 11, + 16, 351, 468, 271, 140, -49, 244, 222, 530, 271, + 52, 238, -52, 271, 271, 222, -369, 222, -56, 245, + -55, 222, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 222, 222, 222, 222, 222, 333, 79, -369, 401, + 10, 96, -369, 286, 10, -369, 366, 14, 251, -369, + 271, -369, 406, -369, -369, -369, -369, 271, -369, -369, + -369, -369, 271, 271, 331, -369, 249, -369, -369, 250, + -369, -369, -369, 137, -369, 370, -369, -369, 271, -369, + -369, 252, -369, -369, -369, -369, -369, -369, 332, 53, + 92, 271, 271, -369, 351, 318, -5, -369, -369, -369, + 308, 483, 566, 222, 257, 194, -369, 334, 264, 566, + 566, 566, 566, 397, 397, 397, 397, 52, 52, 61, + 61, 61, 0, 268, -369, -369, 121, -369, 123, -369, + 267, -369, 51, -369, 262, -369, 19, -369, 365, -369, + -369, -369, 96, 96, -369, 424, 427, -369, 337, -369, + -369, 128, -369, 271, 271, 271, -369, 122, 114, 276, + -369, 222, 566, 194, 277, 132, -369, -369, -369, -369, + 279, 350, -369, -369, -369, 371, 372, 374, 357, 14, + 447, -369, -369, -369, 338, -369, 289, 294, -369, -369, + 32, 96, 135, -369, 271, -369, 530, 296, 152, -369, + -369, 19, 14, -369, -369, -369, 14, 329, 298, 271, + -369, -369, -369, -369, 96, -369, -369, -369, -369, 291, + 359, -20, 301, 271, 153, 271, -369, 18, 96, -369, + -369, 96, 303, 302, -369 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -892,85 +894,85 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 29, 29, 29, 0, 254, + 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 29, 29, 0, 256, 3, 20, 18, 20, 17, 8, 9, 7, 11, 16, - 13, 14, 12, 15, 10, 0, 233, 0, 223, 70, - 32, 0, 43, 49, 49, 0, 0, 0, 0, 222, - 0, 68, 68, 0, 41, 0, 235, 236, 28, 25, - 27, 26, 1, 234, 2, 0, 6, 5, 116, 0, - 79, 80, 108, 66, 0, 126, 0, 0, 0, 0, - 102, 36, 0, 74, 0, 0, 0, 0, 0, 0, - 42, 0, 0, 4, 0, 0, 96, 0, 0, 90, - 91, 89, 0, 93, 0, 0, 122, 224, 205, 208, - 210, 211, 206, 207, 212, 0, 125, 127, 200, 201, - 202, 209, 203, 204, 31, 30, 0, 0, 74, 0, - 69, 0, 0, 0, 0, 102, 76, 39, 37, 39, - 67, 64, 65, 238, 237, 0, 115, 95, 0, 83, - 82, 84, 108, 85, 92, 88, 0, 108, 0, 0, - 86, 33, 0, 48, 0, 234, 0, 0, 196, 0, - 0, 0, 0, 0, 0, 198, 0, 101, 130, 137, - 138, 139, 132, 134, 140, 133, 152, 141, 142, 143, - 136, 131, 145, 146, 0, 255, 0, 0, 72, 0, - 0, 75, 0, 35, 40, 23, 0, 21, 99, 97, - 123, 232, 122, 107, 109, 114, 122, 118, 120, 117, - 128, 0, 46, 0, 0, 50, 234, 96, 0, 0, - 0, 0, 0, 0, 0, 0, 148, 0, 147, 0, - 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, + 13, 14, 12, 15, 10, 0, 235, 0, 225, 70, + 32, 0, 43, 49, 49, 0, 0, 0, 0, 224, + 0, 68, 68, 0, 41, 0, 237, 238, 28, 25, + 27, 26, 1, 236, 2, 0, 6, 5, 118, 0, + 79, 80, 110, 66, 0, 128, 0, 0, 0, 0, + 104, 36, 0, 74, 0, 0, 0, 0, 0, 0, + 42, 0, 0, 4, 0, 0, 98, 0, 0, 92, + 93, 91, 0, 95, 0, 0, 124, 226, 207, 210, + 212, 213, 208, 209, 214, 0, 127, 129, 202, 203, + 204, 211, 205, 206, 31, 30, 0, 0, 74, 0, + 69, 0, 0, 0, 0, 104, 76, 39, 37, 39, + 67, 64, 65, 240, 239, 0, 117, 97, 0, 87, + 86, 110, 83, 82, 84, 94, 90, 0, 110, 0, + 0, 88, 33, 0, 48, 0, 236, 0, 0, 198, + 0, 0, 0, 0, 0, 0, 200, 0, 103, 132, + 139, 140, 141, 134, 136, 142, 135, 154, 143, 144, + 145, 138, 133, 147, 148, 0, 257, 0, 0, 72, + 0, 0, 75, 0, 35, 40, 23, 0, 21, 101, + 99, 125, 234, 124, 0, 109, 111, 116, 124, 120, + 122, 119, 130, 0, 46, 0, 0, 50, 236, 98, + 0, 0, 0, 0, 0, 0, 0, 0, 150, 0, + 149, 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 73, 0, 0, 78, - 77, 0, 0, 19, 0, 0, 102, 98, 0, 230, - 0, 231, 129, 81, 0, 113, 112, 111, 87, 0, - 0, 0, 54, 0, 57, 56, 0, 55, 60, 53, - 63, 45, 0, 47, 184, 0, 197, 199, 0, 187, - 188, 189, 190, 191, 192, 0, 0, 0, 0, 0, - 171, 0, 0, 0, 144, 135, 163, 164, 0, 159, - 0, 0, 0, 150, 0, 162, 161, 177, 178, 179, - 180, 181, 182, 183, 154, 153, 156, 155, 157, 158, - 0, 34, 256, 0, 38, 0, 22, 234, 100, 213, - 215, 0, 217, 228, 216, 104, 124, 229, 110, 121, - 119, 44, 0, 0, 61, 0, 52, 51, 0, 175, - 0, 0, 0, 169, 0, 0, 0, 193, 0, 160, - 0, 0, 0, 151, 194, 71, 24, 0, 0, 250, - 242, 248, 246, 249, 244, 0, 0, 0, 227, 221, - 225, 0, 94, 0, 0, 62, 185, 0, 173, 0, - 172, 0, 176, 195, 0, 0, 167, 165, 228, 0, - 245, 247, 243, 0, 214, 229, 0, 58, 59, 186, - 170, 174, 168, 166, 218, 239, 251, 0, 106, 0, - 0, 0, 0, 103, 0, 252, 240, 226, 105, 196, - 0, 241 + 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, + 0, 78, 77, 0, 0, 19, 0, 0, 104, 100, + 0, 232, 0, 233, 131, 81, 85, 0, 115, 114, + 113, 89, 0, 0, 0, 54, 0, 57, 56, 0, + 55, 60, 53, 63, 45, 0, 47, 186, 0, 199, + 201, 0, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 0, 0, 173, 0, 0, 0, 146, 137, 165, + 166, 0, 161, 0, 0, 0, 152, 0, 164, 163, + 179, 180, 181, 182, 183, 184, 185, 156, 155, 158, + 157, 159, 160, 0, 34, 258, 0, 38, 0, 22, + 236, 102, 215, 217, 0, 219, 230, 218, 106, 126, + 231, 112, 123, 121, 44, 0, 0, 61, 0, 52, + 51, 0, 177, 0, 0, 0, 171, 0, 0, 0, + 195, 0, 162, 0, 0, 0, 153, 196, 71, 24, + 0, 0, 252, 244, 250, 248, 251, 246, 0, 0, + 0, 229, 223, 227, 0, 96, 0, 0, 62, 187, + 0, 175, 0, 174, 0, 178, 197, 0, 0, 169, + 167, 230, 0, 247, 249, 245, 0, 216, 231, 0, + 58, 59, 188, 172, 176, 170, 168, 220, 241, 253, + 0, 108, 0, 0, 0, 0, 105, 0, 254, 242, + 228, 107, 198, 0, 243 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -277, -277, -277, 411, -277, 454, -277, 206, -277, 177, - -277, -277, -277, -277, 213, -78, 348, -277, -277, -277, - 438, -277, 186, -277, -277, -277, 439, -277, -277, -277, - 369, -277, -277, 301, -153, 0, 401, -66, 430, -277, - -277, 178, 289, -277, -277, -277, -111, -277, -277, 49, - -277, 223, -277, -277, 32, -226, -277, -22, 240, -129, - -134, -277, -277, -277, -277, -277, -277, 287, -277, -277, - -277, -277, -277, -277, -277, -277, 67, -73, -80, -277, - -277, -88, -277, -277, -277, -276, 94, -277, -277, -277, - -1, -277, 98, 319, -277, -277, -277, -277, 432, -277, - -277, -277, -277, 80 + -369, -369, -369, 398, -369, 440, -369, 197, -369, 117, + -369, -369, -369, -369, 201, -84, 328, -369, -369, -369, + 442, -369, 185, -369, -369, -369, 435, -369, -369, -369, + 360, -369, -369, 292, -159, -73, -369, 83, -66, -38, + -369, -369, -78, 266, -369, -369, -369, -109, -369, -369, + -31, -369, 204, -369, -369, -28, -227, -369, -79, 216, + -129, -162, -369, -369, -369, -369, -369, -369, 272, -369, + -369, -369, -369, -369, -369, -369, -369, 41, -57, -80, + -369, -369, -87, -369, -369, -369, -368, 68, -369, -369, + -369, -1, -369, 70, 295, -369, -369, -369, -369, 410, + -369, -369, -369, -369, 55 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 18, 19, 20, 21, 66, 206, 207, 22, 59, - 23, 125, 24, 25, 82, 137, 203, 26, 27, 28, - 78, 224, 225, 300, 376, 29, 88, 30, 31, 32, - 133, 33, 135, 136, 34, 151, 152, 71, 102, 103, - 155, 72, 148, 208, 276, 277, 130, 412, 453, 106, - 213, 214, 287, 96, 160, 209, 115, 116, 210, 211, - 178, 179, 180, 181, 182, 183, 184, 233, 185, 186, - 187, 188, 315, 189, 190, 191, 192, 193, 118, 119, - 120, 121, 122, 123, 358, 359, 360, 361, 362, 48, - 363, 408, 409, 410, 282, 35, 36, 56, 57, 364, - 405, 456, 64, 196 + -1, 18, 19, 20, 21, 66, 207, 208, 22, 59, + 23, 125, 24, 25, 82, 137, 204, 26, 27, 28, + 78, 226, 227, 303, 379, 29, 88, 30, 31, 32, + 133, 33, 135, 136, 34, 151, 152, 153, 71, 102, + 103, 156, 72, 148, 209, 278, 279, 130, 415, 456, + 106, 215, 216, 290, 96, 161, 210, 115, 116, 211, + 212, 179, 180, 181, 182, 183, 184, 185, 235, 186, + 187, 188, 189, 318, 190, 191, 192, 193, 194, 118, + 119, 120, 121, 122, 123, 361, 362, 363, 364, 365, + 48, 366, 411, 412, 413, 284, 35, 36, 56, 57, + 367, 408, 459, 64, 197 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -978,154 +980,156 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 177, 39, 117, 98, 42, 138, 138, 146, 139, 49, - 50, 323, 222, 38, 99, 108, 109, 110, 147, 306, - 452, 459, 68, 290, 201, 85, 279, 215, 279, 217, - 219, 164, 241, 37, 249, 70, 53, 99, 236, 241, - 238, 249, 232, 38, 80, 100, 83, 240, 330, 242, - 381, 138, 90, 194, 129, 43, 242, 241, 168, 108, - 109, 110, 165, 263, 86, 264, 51, 198, 100, 97, - 269, 54, 264, 303, 242, 331, 104, 127, 128, 378, - 101, 241, 241, 421, 44, 40, 325, 141, 142, 220, - 241, 143, 41, 439, 68, 52, 169, 170, 242, 242, - 197, 236, 316, 101, 47, 166, 392, 242, 111, 328, - 239, 329, 326, 327, 158, 335, 336, 337, 338, 339, - 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 434, 69, 159, 241, 171, 45, 168, 108, 109, 110, - 278, 407, 200, 280, 46, 231, 387, 112, 113, 241, - 242, 278, 111, 266, 318, 215, 267, 446, 285, 55, - 369, 370, 218, 308, 425, 365, 242, 58, 304, 172, - 307, 357, 175, 319, 169, 170, 350, 114, 382, 320, - 62, 333, 173, 241, 286, 168, 108, 109, 110, 384, - 385, 112, 113, 60, 61, 117, 389, 319, 334, 117, - 242, 212, 63, 383, 397, 241, 216, 420, 174, 175, - 448, 138, 171, 371, 73, 374, 176, 168, 108, 109, - 110, 114, 242, 169, 170, 241, 65, 440, 273, 292, - 111, 274, 375, 301, 68, 293, 302, 231, 168, 108, - 109, 110, 242, 294, 283, 76, 353, 172, 288, 74, - 355, 417, 418, 419, 423, 386, 170, 227, 77, 228, - 173, 171, 395, 75, 351, 162, 391, 81, 295, 112, - 113, 396, 416, 84, 162, 278, 169, 170, 427, 111, - 153, 278, 87, 153, 91, 296, 174, 175, 168, 108, - 109, 110, 441, 171, 176, 92, 172, 443, 94, 114, - 278, 297, 95, 107, 457, 298, 398, 267, 124, 173, - 126, 111, 131, 129, 171, 132, 134, 299, 112, 113, - 108, 455, 69, 458, 424, 140, 234, 170, 235, 243, - 145, 110, 111, 147, 149, 174, 175, 150, 154, 156, - 163, 173, 399, 176, 162, 161, 195, 400, 114, 172, - 112, 113, 199, 401, 402, 202, 398, 449, 205, 104, - 244, 221, 173, 14, 171, 223, 226, 174, 175, 403, - 229, 112, 113, 230, 404, 176, 237, 265, 271, 268, - 114, 275, 111, 272, 278, 289, 284, 249, 174, 175, - 68, 291, 399, 321, 352, 324, 176, 400, 332, 235, - 367, 114, 372, 401, 402, 450, 245, 373, 330, 379, - 380, 241, 173, 260, 261, 262, 263, 390, 264, 403, - 264, 112, 113, -251, 404, 393, 246, 394, 406, 411, - 413, 244, 414, 247, 248, 422, 415, 426, 174, 175, - 249, 250, 428, 429, 430, 398, 176, 431, 432, 433, - 435, 114, 436, 437, 251, 252, 253, 254, 255, 438, - 442, 256, 257, -253, 258, 259, 260, 261, 262, 263, - 1, 264, 447, 228, 93, 1, 454, 67, 2, 461, - 356, 399, 79, 2, 354, 3, 400, 204, 377, 4, - 3, 89, 401, 402, 4, 5, -219, 167, 6, 7, - 5, 270, 105, 6, 7, 248, 157, 368, 403, 8, - 9, 249, -251, 404, 8, 9, 305, 244, 366, 317, - 10, 460, 0, 445, 144, 10, 444, 451, -254, -254, - 281, 0, -254, -254, 0, 258, 259, 260, 261, 262, - 263, 0, 264, 0, 11, 0, 0, 12, 0, 11, - 0, 0, 12, 309, 310, 311, 312, 313, 314, 0, - 0, 0, 13, 245, 244, 0, 0, 13, 14, 0, - 0, 0, 0, 14, 0, 0, 0, 388, 0, 0, - 0, 0, 0, 322, 0, -220, 0, 0, 0, 0, - 0, 248, 0, 0, 0, 0, 0, 249, 250, 0, - 244, 0, 15, 16, 17, 0, 0, 15, 16, 17, - 245, 251, 252, 253, 254, 255, 0, 0, 256, 257, - 0, 258, 259, 260, 261, 262, 263, 0, 264, 0, - 322, 0, 0, 0, 0, 0, 0, 0, 248, 0, - 0, 0, 0, 0, 249, 250, -254, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 251, 252, - 253, 254, 255, 0, 0, 256, 257, 0, 258, 259, - 260, 261, 262, 263, 248, 264, 0, 0, 0, 0, - 249, -254, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -254, -254, -254, 254, 255, 0, - 0, 256, 257, 0, 258, 259, 260, 261, 262, 263, - 0, 264 + 178, 39, 139, 98, 42, 138, 138, 224, 146, 49, + 50, 238, 326, 240, 108, 109, 110, 38, 117, 309, + 281, 462, 281, 147, 154, 455, 202, 154, 217, 68, + 219, 221, 158, 129, 105, 43, 321, 288, 333, 165, + 159, 437, 336, 234, 80, 53, 83, 195, 242, 37, + 293, 138, 90, 99, 68, 322, 243, 51, 160, 337, + 198, 323, 243, 289, 44, 334, 85, 199, 449, 306, + 166, 271, 229, 244, 230, 238, 401, 127, 128, 244, + 54, 381, 38, 331, 100, 332, 52, 141, 142, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 319, 86, 222, 111, 395, 243, + 328, 241, 402, 167, 329, 330, 214, 403, 70, 101, + 213, 201, 99, 404, 405, 243, 244, 218, 251, 169, + 108, 109, 110, 60, 61, 282, 154, 410, 69, 406, + 243, 286, 244, -253, 407, 280, 112, 113, 169, 108, + 109, 110, 97, 100, 384, 390, 45, 244, 217, 266, + 280, 243, 40, 372, 373, 311, 428, 170, 171, 368, + 310, 392, 176, 307, 143, 360, 114, 385, 244, 353, + 251, 41, 46, 55, 104, 285, 170, 171, 101, 251, + 291, 356, 387, 388, 442, 358, 322, 169, 108, 109, + 110, 400, 386, 47, 243, 172, 262, 263, 264, 265, + 374, 266, 451, 117, 138, 424, -221, 117, 265, 58, + 266, 244, 243, 111, 172, 169, 108, 109, 110, 426, + 243, 62, 423, 220, 377, 170, 171, 63, 268, 244, + 173, 269, 111, 243, 233, 443, 68, 244, 243, 233, + 73, 378, 65, 174, 420, 421, 422, 74, 389, 173, + 244, 75, 112, 113, 171, 244, 354, 275, 304, 394, + 276, 305, 174, 172, 169, 108, 109, 110, 76, 175, + 176, 112, 113, 398, 77, 399, 163, 177, 163, 81, + 419, 111, 114, 280, 430, 444, 87, 280, 175, 176, + 84, 172, 169, 108, 109, 110, 177, 91, 173, 92, + 94, 114, 170, 171, 446, 460, 401, 280, 269, 111, + 95, 174, 107, 126, 458, 124, 461, 427, 129, 131, + 112, 113, 132, 134, 140, 108, 237, 147, 69, 110, + 236, 171, 145, 245, 149, 150, 155, 175, 176, 174, + 172, 157, 402, 163, 401, 177, 164, 403, 112, 113, + 114, 162, 196, 404, 405, 200, 203, 452, 111, 206, + 223, 104, 14, 225, 246, 175, 176, 228, 172, 406, + 231, 267, 232, 177, 407, 173, 239, 270, 114, 273, + 402, 274, 277, 280, 287, 403, 111, 292, 174, 294, + 327, 404, 405, 68, 355, 324, 335, 112, 113, 370, + 375, 376, 333, 237, 382, 453, 243, 406, 393, 383, + 247, -253, 407, 266, 175, 176, 174, 409, 397, 414, + 416, 396, 177, 417, 418, 112, 113, 114, 425, 429, + 248, 431, 432, 433, 434, 246, 435, 249, 250, 436, + 438, 440, 175, 176, 251, 252, 441, 439, 445, 450, + 177, 93, 457, 67, 464, 114, 230, 205, 253, 254, + 255, 256, 257, 359, 357, 258, 259, -255, 260, 261, + 262, 263, 264, 265, 1, 266, 79, 89, 168, 1, + 380, 371, 2, 272, -222, 308, 369, 2, 463, 3, + 448, 447, 144, 4, 3, 454, 320, 283, 4, 5, + 0, 0, 6, 7, 5, 0, 295, 6, 7, 250, + 0, 0, 296, 8, 9, 251, 0, 0, 8, 9, + 297, 246, 0, 0, 10, 0, 0, 0, 0, 10, + 0, 0, -256, -256, 0, 0, -256, -256, 0, 260, + 261, 262, 263, 264, 265, 298, 266, 0, 11, 0, + 0, 12, 0, 11, 0, 0, 12, 0, 0, 0, + 0, 0, 299, 0, 0, 0, 13, 247, 246, 0, + 0, 13, 14, 0, 0, 0, 0, 14, 300, 0, + 0, 391, 301, 0, 0, 0, 0, 325, 312, 313, + 314, 315, 316, 317, 302, 250, 0, 0, 0, 0, + 0, 251, 252, 0, 246, 0, 15, 16, 17, 0, + 0, 15, 16, 17, 247, 253, 254, 255, 256, 257, + 0, 0, 258, 259, 0, 260, 261, 262, 263, 264, + 265, 0, 266, 0, 325, 0, 0, 0, 0, 0, + 0, 0, 250, 0, 0, 0, 0, 0, 251, 252, + -256, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 253, 254, 255, 256, 257, 0, 0, 258, + 259, 0, 260, 261, 262, 263, 264, 265, 250, 266, + 0, 0, 0, 0, 251, -256, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -256, -256, + -256, 256, 257, 0, 0, 258, 259, 0, 260, 261, + 262, 263, 264, 265, 0, 266 }; static const yytype_int16 yycheck[] = { - 129, 2, 75, 69, 5, 85, 86, 95, 86, 10, - 11, 237, 165, 3, 9, 4, 5, 6, 12, 3, - 45, 3, 52, 49, 135, 87, 3, 156, 3, 158, - 159, 87, 108, 26, 128, 35, 19, 9, 172, 108, - 174, 128, 171, 3, 45, 40, 47, 176, 94, 125, - 101, 131, 53, 131, 77, 74, 125, 108, 3, 4, - 5, 6, 118, 157, 126, 159, 74, 133, 40, 69, - 199, 54, 159, 226, 125, 121, 71, 78, 79, 305, - 75, 108, 108, 101, 103, 3, 162, 88, 89, 162, - 108, 91, 3, 162, 52, 103, 41, 42, 125, 125, - 58, 235, 231, 75, 91, 161, 332, 125, 97, 243, - 176, 245, 241, 242, 49, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 406, 161, 67, 108, 79, 87, 3, 4, 5, 6, - 165, 118, 165, 118, 87, 104, 160, 136, 137, 108, - 125, 165, 97, 162, 85, 284, 165, 433, 83, 3, - 289, 290, 107, 229, 390, 276, 125, 138, 162, 114, - 154, 161, 154, 104, 41, 42, 264, 166, 85, 110, - 0, 97, 127, 108, 109, 3, 4, 5, 6, 318, - 319, 136, 137, 16, 17, 268, 330, 104, 114, 272, - 125, 152, 164, 110, 357, 108, 157, 110, 153, 154, - 436, 291, 79, 291, 3, 97, 161, 3, 4, 5, - 6, 166, 125, 41, 42, 108, 105, 110, 162, 24, - 97, 165, 114, 162, 52, 30, 165, 104, 3, 4, - 5, 6, 125, 38, 212, 87, 268, 114, 216, 163, - 272, 380, 381, 382, 388, 321, 42, 161, 120, 163, - 127, 79, 162, 161, 265, 165, 332, 3, 63, 136, - 137, 162, 162, 116, 165, 165, 41, 42, 162, 97, - 102, 165, 120, 105, 118, 80, 153, 154, 3, 4, - 5, 6, 421, 79, 161, 165, 114, 162, 90, 166, - 165, 96, 117, 3, 162, 100, 25, 165, 4, 127, - 114, 97, 86, 77, 79, 161, 3, 112, 136, 137, - 4, 450, 161, 452, 390, 41, 41, 42, 114, 17, - 161, 6, 97, 12, 162, 153, 154, 162, 107, 119, - 41, 127, 61, 161, 165, 162, 3, 66, 166, 114, - 136, 137, 142, 72, 73, 105, 25, 76, 3, 71, - 48, 3, 127, 105, 79, 3, 118, 153, 154, 88, - 161, 136, 137, 161, 93, 161, 159, 91, 43, 161, - 166, 87, 97, 161, 165, 49, 165, 128, 153, 154, - 52, 86, 61, 161, 3, 162, 161, 66, 161, 114, - 3, 166, 161, 72, 73, 124, 94, 161, 94, 162, - 87, 108, 127, 154, 155, 156, 157, 161, 159, 88, - 159, 136, 137, 92, 93, 97, 114, 160, 165, 64, - 6, 48, 6, 121, 122, 162, 97, 162, 153, 154, - 128, 129, 162, 92, 72, 25, 161, 72, 72, 92, - 3, 166, 119, 162, 142, 143, 144, 145, 146, 162, - 162, 149, 150, 0, 152, 153, 154, 155, 156, 157, - 7, 159, 161, 163, 63, 7, 161, 23, 15, 162, - 274, 61, 44, 15, 271, 22, 66, 139, 302, 26, - 22, 52, 72, 73, 26, 32, 165, 128, 35, 36, - 32, 200, 72, 35, 36, 122, 105, 284, 88, 46, - 47, 128, 92, 93, 46, 47, 227, 48, 278, 232, - 57, 454, -1, 429, 92, 57, 428, 447, 145, 146, - 211, -1, 149, 150, -1, 152, 153, 154, 155, 156, - 157, -1, 159, -1, 81, -1, -1, 84, -1, 81, - -1, -1, 84, 130, 131, 132, 133, 134, 135, -1, - -1, -1, 99, 94, 48, -1, -1, 99, 105, -1, - -1, -1, -1, 105, -1, -1, -1, 108, -1, -1, - -1, -1, -1, 114, -1, 165, -1, -1, -1, -1, - -1, 122, -1, -1, -1, -1, -1, 128, 129, -1, - 48, -1, 139, 140, 141, -1, -1, 139, 140, 141, - 94, 142, 143, 144, 145, 146, -1, -1, 149, 150, - -1, 152, 153, 154, 155, 156, 157, -1, 159, -1, - 114, -1, -1, -1, -1, -1, -1, -1, 122, -1, - -1, -1, -1, -1, 128, 129, 94, -1, -1, -1, + 129, 2, 86, 69, 5, 85, 86, 166, 95, 10, + 11, 173, 239, 175, 4, 5, 6, 3, 75, 3, + 3, 3, 3, 12, 102, 45, 135, 105, 157, 52, + 159, 160, 105, 77, 72, 74, 85, 83, 94, 87, + 49, 409, 97, 172, 45, 19, 47, 131, 177, 26, + 49, 131, 53, 9, 52, 104, 108, 74, 67, 114, + 58, 110, 108, 109, 103, 121, 87, 133, 436, 228, + 118, 200, 161, 125, 163, 237, 25, 78, 79, 125, + 54, 308, 3, 245, 40, 247, 103, 88, 89, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 233, 126, 163, 97, 335, 108, + 162, 177, 61, 161, 243, 244, 154, 66, 35, 75, + 151, 165, 9, 72, 73, 108, 125, 158, 128, 3, + 4, 5, 6, 16, 17, 118, 214, 118, 161, 88, + 108, 214, 125, 92, 93, 165, 136, 137, 3, 4, + 5, 6, 69, 40, 101, 160, 87, 125, 287, 159, + 165, 108, 3, 292, 293, 231, 393, 41, 42, 278, + 154, 333, 154, 162, 91, 161, 166, 85, 125, 266, + 128, 3, 87, 3, 71, 213, 41, 42, 75, 128, + 218, 270, 321, 322, 162, 274, 104, 3, 4, 5, + 6, 360, 110, 91, 108, 79, 154, 155, 156, 157, + 294, 159, 439, 270, 294, 101, 165, 274, 157, 138, + 159, 125, 108, 97, 79, 3, 4, 5, 6, 391, + 108, 0, 110, 107, 97, 41, 42, 164, 162, 125, + 114, 165, 97, 108, 104, 110, 52, 125, 108, 104, + 3, 114, 105, 127, 383, 384, 385, 163, 324, 114, + 125, 161, 136, 137, 42, 125, 267, 162, 162, 335, + 165, 165, 127, 79, 3, 4, 5, 6, 87, 153, + 154, 136, 137, 162, 120, 162, 165, 161, 165, 3, + 162, 97, 166, 165, 162, 424, 120, 165, 153, 154, + 116, 79, 3, 4, 5, 6, 161, 118, 114, 165, + 90, 166, 41, 42, 162, 162, 25, 165, 165, 97, + 117, 127, 3, 114, 453, 4, 455, 393, 77, 86, + 136, 137, 161, 3, 41, 4, 114, 12, 161, 6, + 41, 42, 161, 17, 162, 162, 107, 153, 154, 127, + 79, 119, 61, 165, 25, 161, 41, 66, 136, 137, + 166, 162, 3, 72, 73, 142, 105, 76, 97, 3, + 3, 71, 105, 3, 48, 153, 154, 118, 79, 88, + 161, 91, 161, 161, 93, 114, 159, 161, 166, 43, + 61, 161, 87, 165, 165, 66, 97, 49, 127, 86, + 162, 72, 73, 52, 3, 161, 161, 136, 137, 3, + 161, 161, 94, 114, 162, 124, 108, 88, 161, 87, + 94, 92, 93, 159, 153, 154, 127, 165, 160, 64, + 6, 97, 161, 6, 97, 136, 137, 166, 162, 162, + 114, 162, 92, 72, 72, 48, 72, 121, 122, 92, + 3, 162, 153, 154, 128, 129, 162, 119, 162, 161, + 161, 63, 161, 23, 162, 166, 163, 139, 142, 143, + 144, 145, 146, 276, 273, 149, 150, 0, 152, 153, + 154, 155, 156, 157, 7, 159, 44, 52, 128, 7, + 305, 287, 15, 201, 165, 229, 280, 15, 457, 22, + 432, 431, 92, 26, 22, 450, 234, 212, 26, 32, + -1, -1, 35, 36, 32, -1, 24, 35, 36, 122, + -1, -1, 30, 46, 47, 128, -1, -1, 46, 47, + 38, 48, -1, -1, 57, -1, -1, -1, -1, 57, + -1, -1, 145, 146, -1, -1, 149, 150, -1, 152, + 153, 154, 155, 156, 157, 63, 159, -1, 81, -1, + -1, 84, -1, 81, -1, -1, 84, -1, -1, -1, + -1, -1, 80, -1, -1, -1, 99, 94, 48, -1, + -1, 99, 105, -1, -1, -1, -1, 105, 96, -1, + -1, 108, 100, -1, -1, -1, -1, 114, 130, 131, + 132, 133, 134, 135, 112, 122, -1, -1, -1, -1, + -1, 128, 129, -1, 48, -1, 139, 140, 141, -1, + -1, 139, 140, 141, 94, 142, 143, 144, 145, 146, + -1, -1, 149, 150, -1, 152, 153, 154, 155, 156, + 157, -1, 159, -1, 114, -1, -1, -1, -1, -1, + -1, -1, 122, -1, -1, -1, -1, -1, 128, 129, + 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 142, 143, 144, 145, 146, -1, -1, 149, + 150, -1, 152, 153, 154, 155, 156, 157, 122, 159, + -1, -1, -1, -1, 128, 129, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 142, 143, 144, 145, 146, -1, -1, 149, 150, -1, 152, 153, - 154, 155, 156, 157, 122, 159, -1, -1, -1, -1, - 128, 129, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 142, 143, 144, 145, 146, -1, - -1, 149, 150, -1, 152, 153, 154, 155, 156, 157, - -1, 159 + 154, 155, 156, 157, -1, 159 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -1135,50 +1139,50 @@ static const yytype_uint16 yystos[] = 0, 7, 15, 22, 26, 32, 35, 36, 46, 47, 57, 81, 84, 99, 105, 139, 140, 141, 168, 169, 170, 171, 175, 177, 179, 180, 184, 185, 186, 192, - 194, 195, 196, 198, 201, 262, 263, 26, 3, 257, - 3, 3, 257, 74, 103, 87, 87, 91, 256, 257, - 257, 74, 103, 19, 54, 3, 264, 265, 138, 176, - 176, 176, 0, 164, 269, 105, 172, 172, 52, 161, - 202, 204, 208, 3, 163, 161, 87, 120, 187, 187, - 257, 3, 181, 257, 116, 87, 126, 120, 193, 193, - 257, 118, 165, 170, 90, 117, 220, 202, 204, 9, - 40, 75, 205, 206, 71, 205, 216, 3, 4, 5, - 6, 97, 136, 137, 166, 223, 224, 244, 245, 246, - 247, 248, 249, 250, 4, 178, 114, 257, 257, 77, - 213, 86, 161, 197, 3, 199, 200, 182, 245, 182, - 41, 257, 257, 202, 265, 161, 248, 12, 209, 162, - 162, 202, 203, 208, 107, 207, 119, 203, 49, 67, - 221, 162, 165, 41, 87, 118, 161, 197, 3, 41, - 42, 79, 114, 127, 153, 154, 161, 226, 227, 228, - 229, 230, 231, 232, 233, 235, 236, 237, 238, 240, - 241, 242, 243, 244, 182, 3, 270, 58, 204, 142, - 165, 213, 105, 183, 183, 3, 173, 174, 210, 222, - 225, 226, 216, 217, 218, 226, 216, 226, 107, 226, - 244, 3, 201, 3, 188, 189, 118, 161, 163, 161, - 161, 104, 226, 234, 41, 114, 227, 159, 227, 204, - 226, 108, 125, 17, 48, 94, 114, 121, 122, 128, - 129, 142, 143, 144, 145, 146, 149, 150, 152, 153, - 154, 155, 156, 157, 159, 91, 162, 165, 161, 226, - 200, 43, 161, 162, 165, 87, 211, 212, 165, 3, - 118, 260, 261, 221, 165, 83, 109, 219, 221, 49, - 49, 86, 24, 30, 38, 63, 80, 96, 100, 112, - 190, 162, 165, 201, 162, 209, 3, 154, 204, 130, - 131, 132, 133, 134, 135, 239, 226, 234, 85, 104, - 110, 161, 114, 222, 162, 162, 226, 226, 227, 227, - 94, 121, 161, 97, 114, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, - 248, 257, 3, 224, 181, 224, 174, 161, 251, 252, - 253, 254, 255, 257, 266, 213, 225, 3, 218, 226, - 226, 182, 161, 161, 97, 114, 191, 189, 222, 162, - 87, 101, 85, 110, 226, 226, 204, 160, 108, 227, - 161, 204, 222, 97, 160, 162, 162, 201, 25, 61, - 66, 72, 73, 88, 93, 267, 165, 118, 258, 259, - 260, 64, 214, 6, 6, 97, 162, 226, 226, 226, - 110, 101, 162, 227, 204, 222, 162, 162, 162, 92, - 72, 72, 72, 92, 252, 3, 119, 162, 162, 162, - 110, 226, 162, 162, 259, 253, 252, 161, 222, 76, - 124, 270, 45, 215, 161, 226, 268, 162, 226, 3, - 243, 162 + 194, 195, 196, 198, 201, 263, 264, 26, 3, 258, + 3, 3, 258, 74, 103, 87, 87, 91, 257, 258, + 258, 74, 103, 19, 54, 3, 265, 266, 138, 176, + 176, 176, 0, 164, 270, 105, 172, 172, 52, 161, + 204, 205, 209, 3, 163, 161, 87, 120, 187, 187, + 258, 3, 181, 258, 116, 87, 126, 120, 193, 193, + 258, 118, 165, 170, 90, 117, 221, 204, 205, 9, + 40, 75, 206, 207, 71, 206, 217, 3, 4, 5, + 6, 97, 136, 137, 166, 224, 225, 245, 246, 247, + 248, 249, 250, 251, 4, 178, 114, 258, 258, 77, + 214, 86, 161, 197, 3, 199, 200, 182, 246, 182, + 41, 258, 258, 204, 266, 161, 249, 12, 210, 162, + 162, 202, 203, 204, 209, 107, 208, 119, 202, 49, + 67, 222, 162, 165, 41, 87, 118, 161, 197, 3, + 41, 42, 79, 114, 127, 153, 154, 161, 227, 228, + 229, 230, 231, 232, 233, 234, 236, 237, 238, 239, + 241, 242, 243, 244, 245, 182, 3, 271, 58, 205, + 142, 165, 214, 105, 183, 183, 3, 173, 174, 211, + 223, 226, 227, 217, 206, 218, 219, 227, 217, 227, + 107, 227, 245, 3, 201, 3, 188, 189, 118, 161, + 163, 161, 161, 104, 227, 235, 41, 114, 228, 159, + 228, 205, 227, 108, 125, 17, 48, 94, 114, 121, + 122, 128, 129, 142, 143, 144, 145, 146, 149, 150, + 152, 153, 154, 155, 156, 157, 159, 91, 162, 165, + 161, 227, 200, 43, 161, 162, 165, 87, 212, 213, + 165, 3, 118, 261, 262, 222, 202, 165, 83, 109, + 220, 222, 49, 49, 86, 24, 30, 38, 63, 80, + 96, 100, 112, 190, 162, 165, 201, 162, 210, 3, + 154, 205, 130, 131, 132, 133, 134, 135, 240, 227, + 235, 85, 104, 110, 161, 114, 223, 162, 162, 227, + 227, 228, 228, 94, 121, 161, 97, 114, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 249, 258, 3, 225, 181, 225, 174, + 161, 252, 253, 254, 255, 256, 258, 267, 214, 226, + 3, 219, 227, 227, 182, 161, 161, 97, 114, 191, + 189, 223, 162, 87, 101, 85, 110, 227, 227, 205, + 160, 108, 228, 161, 205, 223, 97, 160, 162, 162, + 201, 25, 61, 66, 72, 73, 88, 93, 268, 165, + 118, 259, 260, 261, 64, 215, 6, 6, 97, 162, + 227, 227, 227, 110, 101, 162, 228, 205, 223, 162, + 162, 162, 92, 72, 72, 72, 92, 253, 3, 119, + 162, 162, 162, 110, 227, 162, 162, 260, 254, 253, + 161, 223, 76, 124, 271, 45, 216, 161, 227, 269, + 162, 227, 3, 244, 162 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ @@ -1192,24 +1196,24 @@ static const yytype_uint16 yyr1[] = 188, 188, 189, 190, 190, 190, 190, 190, 190, 190, 190, 191, 191, 191, 192, 192, 192, 193, 193, 194, 195, 196, 196, 197, 197, 198, 199, 199, 200, 201, - 201, 201, 202, 202, 203, 203, 204, 204, 205, 206, - 206, 206, 207, 207, 208, 209, 209, 210, 211, 211, - 212, 213, 213, 214, 214, 215, 215, 216, 216, 217, - 217, 218, 219, 219, 219, 220, 220, 221, 221, 221, - 221, 221, 221, 222, 222, 223, 223, 224, 224, 225, - 226, 226, 226, 226, 226, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 228, 228, 229, 229, 229, - 229, 229, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 231, 231, 232, 232, 232, 232, 233, - 233, 233, 233, 234, 234, 235, 235, 236, 236, 236, - 236, 236, 236, 236, 237, 237, 238, 239, 239, 239, - 239, 239, 239, 240, 241, 242, 243, 243, 243, 243, - 244, 244, 244, 244, 244, 245, 246, 246, 247, 247, - 248, 249, 250, 251, 251, 252, 252, 253, 253, 254, - 254, 255, 256, 257, 257, 258, 258, 259, 259, 260, - 260, 261, 261, 262, 262, 263, 264, 264, 265, 266, - 266, 266, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 268, 269, 269, 270, 270 + 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, + 206, 207, 207, 207, 208, 208, 209, 210, 210, 211, + 212, 212, 213, 214, 214, 215, 215, 216, 216, 217, + 217, 218, 218, 219, 220, 220, 220, 221, 221, 222, + 222, 222, 222, 222, 222, 223, 223, 224, 224, 225, + 225, 226, 227, 227, 227, 227, 227, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 229, 229, 230, + 230, 230, 230, 230, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 232, 232, 233, 233, 233, + 233, 234, 234, 234, 234, 235, 235, 236, 236, 237, + 237, 237, 237, 237, 237, 237, 238, 238, 239, 240, + 240, 240, 240, 240, 240, 241, 242, 243, 244, 244, + 244, 244, 245, 245, 245, 245, 245, 246, 247, 247, + 248, 248, 249, 250, 251, 252, 252, 253, 253, 254, + 254, 255, 255, 256, 257, 258, 258, 259, 259, 260, + 260, 261, 261, 262, 262, 263, 263, 264, 265, 265, + 266, 267, 267, 267, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 269, 270, 270, 271, 271 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -1223,24 +1227,24 @@ static const yytype_uint8 yyr2[] = 1, 3, 3, 1, 1, 1, 1, 1, 4, 4, 1, 1, 2, 0, 4, 4, 3, 2, 0, 4, 2, 8, 5, 3, 0, 5, 1, 3, 3, 2, - 2, 6, 3, 3, 1, 1, 3, 5, 2, 1, - 1, 1, 1, 0, 7, 1, 0, 1, 1, 0, - 2, 2, 0, 4, 0, 2, 0, 3, 0, 1, - 3, 2, 1, 1, 0, 2, 0, 2, 2, 4, - 2, 4, 0, 1, 3, 1, 0, 1, 3, 2, - 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 1, 1, 2, 2, 2, - 3, 4, 1, 3, 3, 3, 3, 3, 3, 3, - 4, 3, 3, 3, 3, 5, 6, 5, 6, 4, - 6, 3, 5, 4, 5, 4, 5, 3, 3, 3, - 3, 3, 3, 3, 3, 5, 6, 1, 1, 1, - 1, 1, 1, 4, 4, 5, 1, 3, 1, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 1, 1, 1, 4, 1, - 3, 2, 1, 1, 3, 1, 5, 1, 0, 2, - 1, 1, 0, 1, 0, 2, 1, 3, 3, 4, - 6, 8, 1, 2, 1, 2, 1, 2, 1, 1, - 1, 0, 1, 1, 0, 1, 3 + 2, 6, 1, 1, 1, 3, 3, 3, 3, 5, + 2, 1, 1, 1, 1, 0, 7, 1, 0, 1, + 1, 0, 2, 2, 0, 4, 0, 2, 0, 3, + 0, 1, 3, 2, 1, 1, 0, 2, 0, 2, + 2, 4, 2, 4, 0, 1, 3, 1, 0, 1, + 3, 2, 1, 1, 1, 1, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, + 2, 2, 3, 4, 1, 3, 3, 3, 3, 3, + 3, 3, 4, 3, 3, 3, 3, 5, 6, 5, + 6, 4, 6, 3, 5, 4, 5, 4, 5, 3, + 3, 3, 3, 3, 3, 3, 3, 5, 6, 1, + 1, 1, 1, 1, 1, 4, 4, 5, 1, 3, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, + 4, 1, 3, 2, 1, 1, 3, 1, 5, 1, + 0, 2, 1, 1, 0, 1, 0, 2, 1, 3, + 3, 4, 6, 8, 1, 2, 1, 2, 1, 2, + 1, 1, 1, 0, 1, 1, 0, 1, 3 }; @@ -1394,7 +1398,9 @@ yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, YY if (yytype < YYNTOKENS) YYPRINT (yyo, yytoknum[yytype], *yyvaluep); # endif + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YYUSE (yytype); + YY_IGNORE_MAYBE_UNINITIALIZED_END } @@ -1742,31 +1748,31 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio switch (yytype) { case 3: /* IDENTIFIER */ -#line 148 "bison_parser.y" - { free( (((*yyvaluep).sval)) ); } -#line 1748 "bison_parser.cpp" - break; - - case 4: /* STRING */ -#line 148 "bison_parser.y" +#line 149 "bison_parser.y" { free( (((*yyvaluep).sval)) ); } #line 1754 "bison_parser.cpp" break; - case 5: /* FLOATVAL */ -#line 146 "bison_parser.y" - { } + case 4: /* STRING */ +#line 149 "bison_parser.y" + { free( (((*yyvaluep).sval)) ); } #line 1760 "bison_parser.cpp" break; - case 6: /* INTVAL */ -#line 146 "bison_parser.y" + case 5: /* FLOATVAL */ +#line 147 "bison_parser.y" { } #line 1766 "bison_parser.cpp" break; + case 6: /* INTVAL */ +#line 147 "bison_parser.y" + { } +#line 1772 "bison_parser.cpp" + break; + case 169: /* statement_list */ -#line 149 "bison_parser.y" +#line 150 "bison_parser.y" { if ((((*yyvaluep).stmt_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).stmt_vec))) { @@ -1775,23 +1781,23 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).stmt_vec)); } -#line 1779 "bison_parser.cpp" - break; - - case 170: /* statement */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).statement)); } #line 1785 "bison_parser.cpp" break; - case 171: /* preparable_statement */ -#line 157 "bison_parser.y" + case 170: /* statement */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).statement)); } #line 1791 "bison_parser.cpp" break; + case 171: /* preparable_statement */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).statement)); } +#line 1797 "bison_parser.cpp" + break; + case 172: /* opt_hints */ -#line 149 "bison_parser.y" +#line 150 "bison_parser.y" { if ((((*yyvaluep).expr_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).expr_vec))) { @@ -1800,11 +1806,11 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).expr_vec)); } -#line 1804 "bison_parser.cpp" +#line 1810 "bison_parser.cpp" break; case 173: /* hint_list */ -#line 149 "bison_parser.y" +#line 150 "bison_parser.y" { if ((((*yyvaluep).expr_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).expr_vec))) { @@ -1813,89 +1819,89 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).expr_vec)); } -#line 1817 "bison_parser.cpp" - break; - - case 174: /* hint */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).expr)); } #line 1823 "bison_parser.cpp" break; - case 175: /* transaction_statement */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).transaction_stmt)); } + case 174: /* hint */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).expr)); } #line 1829 "bison_parser.cpp" break; - case 177: /* prepare_statement */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).prep_stmt)); } + case 175: /* transaction_statement */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).transaction_stmt)); } #line 1835 "bison_parser.cpp" break; - case 178: /* prepare_target_query */ -#line 148 "bison_parser.y" - { free( (((*yyvaluep).sval)) ); } + case 177: /* prepare_statement */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).prep_stmt)); } #line 1841 "bison_parser.cpp" break; - case 179: /* execute_statement */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).exec_stmt)); } + case 178: /* prepare_target_query */ +#line 149 "bison_parser.y" + { free( (((*yyvaluep).sval)) ); } #line 1847 "bison_parser.cpp" break; - case 180: /* import_statement */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).import_stmt)); } + case 179: /* execute_statement */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).exec_stmt)); } #line 1853 "bison_parser.cpp" break; - case 181: /* file_type */ -#line 146 "bison_parser.y" - { } + case 180: /* import_statement */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).import_stmt)); } #line 1859 "bison_parser.cpp" break; - case 182: /* file_path */ -#line 148 "bison_parser.y" - { free( (((*yyvaluep).sval)) ); } + case 181: /* file_type */ +#line 147 "bison_parser.y" + { } #line 1865 "bison_parser.cpp" break; - case 183: /* opt_file_type */ -#line 146 "bison_parser.y" - { } + case 182: /* file_path */ +#line 149 "bison_parser.y" + { free( (((*yyvaluep).sval)) ); } #line 1871 "bison_parser.cpp" break; - case 184: /* export_statement */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).export_stmt)); } + case 183: /* opt_file_type */ +#line 147 "bison_parser.y" + { } #line 1877 "bison_parser.cpp" break; - case 185: /* show_statement */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).show_stmt)); } + case 184: /* export_statement */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).export_stmt)); } #line 1883 "bison_parser.cpp" break; - case 186: /* create_statement */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).create_stmt)); } + case 185: /* show_statement */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).show_stmt)); } #line 1889 "bison_parser.cpp" break; - case 187: /* opt_not_exists */ -#line 146 "bison_parser.y" - { } + case 186: /* create_statement */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).create_stmt)); } #line 1895 "bison_parser.cpp" break; + case 187: /* opt_not_exists */ +#line 147 "bison_parser.y" + { } +#line 1901 "bison_parser.cpp" + break; + case 188: /* column_def_commalist */ -#line 149 "bison_parser.y" +#line 150 "bison_parser.y" { if ((((*yyvaluep).column_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).column_vec))) { @@ -1904,59 +1910,59 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).column_vec)); } -#line 1908 "bison_parser.cpp" - break; - - case 189: /* column_def */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).column_t)); } #line 1914 "bison_parser.cpp" break; - case 190: /* column_type */ -#line 146 "bison_parser.y" - { } + case 189: /* column_def */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).column_t)); } #line 1920 "bison_parser.cpp" break; - case 191: /* opt_column_nullable */ -#line 146 "bison_parser.y" + case 190: /* column_type */ +#line 147 "bison_parser.y" { } #line 1926 "bison_parser.cpp" break; - case 192: /* drop_statement */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).drop_stmt)); } + case 191: /* opt_column_nullable */ +#line 147 "bison_parser.y" + { } #line 1932 "bison_parser.cpp" break; - case 193: /* opt_exists */ -#line 146 "bison_parser.y" - { } + case 192: /* drop_statement */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).drop_stmt)); } #line 1938 "bison_parser.cpp" break; - case 194: /* delete_statement */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).delete_stmt)); } + case 193: /* opt_exists */ +#line 147 "bison_parser.y" + { } #line 1944 "bison_parser.cpp" break; - case 195: /* truncate_statement */ -#line 157 "bison_parser.y" + case 194: /* delete_statement */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).delete_stmt)); } #line 1950 "bison_parser.cpp" break; - case 196: /* insert_statement */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).insert_stmt)); } + case 195: /* truncate_statement */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).delete_stmt)); } #line 1956 "bison_parser.cpp" break; + case 196: /* insert_statement */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).insert_stmt)); } +#line 1962 "bison_parser.cpp" + break; + case 197: /* opt_column_list */ -#line 149 "bison_parser.y" +#line 150 "bison_parser.y" { if ((((*yyvaluep).str_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).str_vec))) { @@ -1965,17 +1971,17 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).str_vec)); } -#line 1969 "bison_parser.cpp" - break; - - case 198: /* update_statement */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).update_stmt)); } #line 1975 "bison_parser.cpp" break; + case 198: /* update_statement */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).update_stmt)); } +#line 1981 "bison_parser.cpp" + break; + case 199: /* update_clause_commalist */ -#line 149 "bison_parser.y" +#line 150 "bison_parser.y" { if ((((*yyvaluep).update_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).update_vec))) { @@ -1984,53 +1990,77 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).update_vec)); } -#line 1988 "bison_parser.cpp" - break; - - case 200: /* update_clause */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).update_t)); } #line 1994 "bison_parser.cpp" break; - case 201: /* select_statement */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).select_stmt)); } + case 200: /* update_clause */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).update_t)); } #line 2000 "bison_parser.cpp" break; - case 202: /* select_with_paren */ -#line 157 "bison_parser.y" + case 201: /* select_statement */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).select_stmt)); } #line 2006 "bison_parser.cpp" break; - case 203: /* select_paren_or_clause */ -#line 157 "bison_parser.y" + case 202: /* select_within_set_operation */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).select_stmt)); } #line 2012 "bison_parser.cpp" break; - case 204: /* select_no_paren */ -#line 157 "bison_parser.y" + case 203: /* select_within_set_operation_no_parentheses */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).select_stmt)); } #line 2018 "bison_parser.cpp" break; - case 208: /* select_clause */ -#line 157 "bison_parser.y" + case 204: /* select_with_paren */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).select_stmt)); } #line 2024 "bison_parser.cpp" break; - case 209: /* opt_distinct */ -#line 146 "bison_parser.y" - { } + case 205: /* select_no_paren */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).select_stmt)); } #line 2030 "bison_parser.cpp" break; - case 210: /* select_list */ -#line 149 "bison_parser.y" + case 206: /* set_operator */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).set_operator_t)); } +#line 2036 "bison_parser.cpp" + break; + + case 207: /* set_type */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).set_operator_t)); } +#line 2042 "bison_parser.cpp" + break; + + case 208: /* opt_all */ +#line 147 "bison_parser.y" + { } +#line 2048 "bison_parser.cpp" + break; + + case 209: /* select_clause */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).select_stmt)); } +#line 2054 "bison_parser.cpp" + break; + + case 210: /* opt_distinct */ +#line 147 "bison_parser.y" + { } +#line 2060 "bison_parser.cpp" + break; + + case 211: /* select_list */ +#line 150 "bison_parser.y" { if ((((*yyvaluep).expr_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).expr_vec))) { @@ -2039,41 +2069,41 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).expr_vec)); } -#line 2043 "bison_parser.cpp" - break; - - case 211: /* opt_from_clause */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).table)); } -#line 2049 "bison_parser.cpp" - break; - - case 212: /* from_clause */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).table)); } -#line 2055 "bison_parser.cpp" - break; - - case 213: /* opt_where */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2061 "bison_parser.cpp" - break; - - case 214: /* opt_group */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).group_t)); } -#line 2067 "bison_parser.cpp" - break; - - case 215: /* opt_having */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).expr)); } #line 2073 "bison_parser.cpp" break; - case 216: /* opt_order */ -#line 149 "bison_parser.y" + case 212: /* opt_from_clause */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 2079 "bison_parser.cpp" + break; + + case 213: /* from_clause */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 2085 "bison_parser.cpp" + break; + + case 214: /* opt_where */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2091 "bison_parser.cpp" + break; + + case 215: /* opt_group */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).group_t)); } +#line 2097 "bison_parser.cpp" + break; + + case 216: /* opt_having */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2103 "bison_parser.cpp" + break; + + case 217: /* opt_order */ +#line 150 "bison_parser.y" { if ((((*yyvaluep).order_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).order_vec))) { @@ -2082,11 +2112,11 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).order_vec)); } -#line 2086 "bison_parser.cpp" +#line 2116 "bison_parser.cpp" break; - case 217: /* order_list */ -#line 149 "bison_parser.y" + case 218: /* order_list */ +#line 150 "bison_parser.y" { if ((((*yyvaluep).order_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).order_vec))) { @@ -2095,35 +2125,35 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).order_vec)); } -#line 2099 "bison_parser.cpp" +#line 2129 "bison_parser.cpp" break; - case 218: /* order_desc */ -#line 157 "bison_parser.y" + case 219: /* order_desc */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).order)); } -#line 2105 "bison_parser.cpp" +#line 2135 "bison_parser.cpp" break; - case 219: /* opt_order_type */ -#line 146 "bison_parser.y" + case 220: /* opt_order_type */ +#line 147 "bison_parser.y" { } -#line 2111 "bison_parser.cpp" +#line 2141 "bison_parser.cpp" break; - case 220: /* opt_top */ -#line 157 "bison_parser.y" + case 221: /* opt_top */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).limit)); } -#line 2117 "bison_parser.cpp" +#line 2147 "bison_parser.cpp" break; - case 221: /* opt_limit */ -#line 157 "bison_parser.y" + case 222: /* opt_limit */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).limit)); } -#line 2123 "bison_parser.cpp" +#line 2153 "bison_parser.cpp" break; - case 222: /* expr_list */ -#line 149 "bison_parser.y" + case 223: /* expr_list */ +#line 150 "bison_parser.y" { if ((((*yyvaluep).expr_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).expr_vec))) { @@ -2132,11 +2162,11 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).expr_vec)); } -#line 2136 "bison_parser.cpp" +#line 2166 "bison_parser.cpp" break; - case 223: /* opt_literal_list */ -#line 149 "bison_parser.y" + case 224: /* opt_literal_list */ +#line 150 "bison_parser.y" { if ((((*yyvaluep).expr_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).expr_vec))) { @@ -2145,11 +2175,11 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).expr_vec)); } -#line 2149 "bison_parser.cpp" +#line 2179 "bison_parser.cpp" break; - case 224: /* literal_list */ -#line 149 "bison_parser.y" + case 225: /* literal_list */ +#line 150 "bison_parser.y" { if ((((*yyvaluep).expr_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).expr_vec))) { @@ -2158,185 +2188,185 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).expr_vec)); } -#line 2162 "bison_parser.cpp" - break; - - case 225: /* expr_alias */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2168 "bison_parser.cpp" - break; - - case 226: /* expr */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2174 "bison_parser.cpp" - break; - - case 227: /* operand */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2180 "bison_parser.cpp" - break; - - case 228: /* scalar_expr */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).expr)); } -#line 2186 "bison_parser.cpp" - break; - - case 229: /* unary_expr */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).expr)); } #line 2192 "bison_parser.cpp" break; - case 230: /* binary_expr */ -#line 157 "bison_parser.y" + case 226: /* expr_alias */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2198 "bison_parser.cpp" break; - case 231: /* logic_expr */ -#line 157 "bison_parser.y" + case 227: /* expr */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2204 "bison_parser.cpp" break; - case 232: /* in_expr */ -#line 157 "bison_parser.y" + case 228: /* operand */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2210 "bison_parser.cpp" break; - case 233: /* case_expr */ -#line 157 "bison_parser.y" + case 229: /* scalar_expr */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2216 "bison_parser.cpp" break; - case 234: /* case_list */ -#line 157 "bison_parser.y" + case 230: /* unary_expr */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2222 "bison_parser.cpp" break; - case 235: /* exists_expr */ -#line 157 "bison_parser.y" + case 231: /* binary_expr */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2228 "bison_parser.cpp" break; - case 236: /* comp_expr */ -#line 157 "bison_parser.y" + case 232: /* logic_expr */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2234 "bison_parser.cpp" break; - case 237: /* function_expr */ -#line 157 "bison_parser.y" + case 233: /* in_expr */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2240 "bison_parser.cpp" break; - case 238: /* extract_expr */ -#line 157 "bison_parser.y" + case 234: /* case_expr */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2246 "bison_parser.cpp" break; - case 239: /* datetime_field */ -#line 146 "bison_parser.y" - { } + case 235: /* case_list */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).expr)); } #line 2252 "bison_parser.cpp" break; - case 240: /* array_expr */ -#line 157 "bison_parser.y" + case 236: /* exists_expr */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2258 "bison_parser.cpp" break; - case 241: /* array_index */ -#line 157 "bison_parser.y" + case 237: /* comp_expr */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2264 "bison_parser.cpp" break; - case 242: /* between_expr */ -#line 157 "bison_parser.y" + case 238: /* function_expr */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2270 "bison_parser.cpp" break; - case 243: /* column_name */ -#line 157 "bison_parser.y" + case 239: /* extract_expr */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2276 "bison_parser.cpp" break; - case 244: /* literal */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).expr)); } + case 240: /* datetime_field */ +#line 147 "bison_parser.y" + { } #line 2282 "bison_parser.cpp" break; - case 245: /* string_literal */ -#line 157 "bison_parser.y" + case 241: /* array_expr */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2288 "bison_parser.cpp" break; - case 246: /* bool_literal */ -#line 157 "bison_parser.y" + case 242: /* array_index */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2294 "bison_parser.cpp" break; - case 247: /* num_literal */ -#line 157 "bison_parser.y" + case 243: /* between_expr */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2300 "bison_parser.cpp" break; - case 248: /* int_literal */ -#line 157 "bison_parser.y" + case 244: /* column_name */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2306 "bison_parser.cpp" break; - case 249: /* null_literal */ -#line 157 "bison_parser.y" + case 245: /* literal */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2312 "bison_parser.cpp" break; - case 250: /* param_expr */ -#line 157 "bison_parser.y" + case 246: /* string_literal */ +#line 158 "bison_parser.y" { delete (((*yyvaluep).expr)); } #line 2318 "bison_parser.cpp" break; - case 251: /* table_ref */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).table)); } + case 247: /* bool_literal */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).expr)); } #line 2324 "bison_parser.cpp" break; - case 252: /* table_ref_atomic */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).table)); } + case 248: /* num_literal */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).expr)); } #line 2330 "bison_parser.cpp" break; - case 253: /* nonjoin_table_ref_atomic */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).table)); } + case 249: /* int_literal */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).expr)); } #line 2336 "bison_parser.cpp" break; - case 254: /* table_ref_commalist */ -#line 149 "bison_parser.y" + case 250: /* null_literal */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2342 "bison_parser.cpp" + break; + + case 251: /* param_expr */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2348 "bison_parser.cpp" + break; + + case 252: /* table_ref */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 2354 "bison_parser.cpp" + break; + + case 253: /* table_ref_atomic */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 2360 "bison_parser.cpp" + break; + + case 254: /* nonjoin_table_ref_atomic */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 2366 "bison_parser.cpp" + break; + + case 255: /* table_ref_commalist */ +#line 150 "bison_parser.y" { if ((((*yyvaluep).table_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).table_vec))) { @@ -2345,95 +2375,95 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).table_vec)); } -#line 2349 "bison_parser.cpp" - break; - - case 255: /* table_ref_name */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).table)); } -#line 2355 "bison_parser.cpp" - break; - - case 256: /* table_ref_name_no_alias */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).table)); } -#line 2361 "bison_parser.cpp" - break; - - case 257: /* table_name */ -#line 147 "bison_parser.y" - { free( (((*yyvaluep).table_name).name) ); free( (((*yyvaluep).table_name).schema) ); } -#line 2367 "bison_parser.cpp" - break; - - case 258: /* table_alias */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).alias_t)); } -#line 2373 "bison_parser.cpp" - break; - - case 259: /* opt_table_alias */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).alias_t)); } #line 2379 "bison_parser.cpp" break; - case 260: /* alias */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).alias_t)); } + case 256: /* table_ref_name */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).table)); } #line 2385 "bison_parser.cpp" break; - case 261: /* opt_alias */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).alias_t)); } + case 257: /* table_ref_name_no_alias */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).table)); } #line 2391 "bison_parser.cpp" break; - case 262: /* opt_with_clause */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).with_description_vec)); } + case 258: /* table_name */ +#line 148 "bison_parser.y" + { free( (((*yyvaluep).table_name).name) ); free( (((*yyvaluep).table_name).schema) ); } #line 2397 "bison_parser.cpp" break; - case 263: /* with_clause */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).with_description_vec)); } + case 259: /* table_alias */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).alias_t)); } #line 2403 "bison_parser.cpp" break; - case 264: /* with_description_list */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).with_description_vec)); } + case 260: /* opt_table_alias */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).alias_t)); } #line 2409 "bison_parser.cpp" break; - case 265: /* with_description */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).with_description_t)); } + case 261: /* alias */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).alias_t)); } #line 2415 "bison_parser.cpp" break; - case 266: /* join_clause */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).table)); } + case 262: /* opt_alias */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).alias_t)); } #line 2421 "bison_parser.cpp" break; - case 267: /* opt_join_type */ -#line 146 "bison_parser.y" - { } + case 263: /* opt_with_clause */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).with_description_vec)); } #line 2427 "bison_parser.cpp" break; - case 268: /* join_condition */ -#line 157 "bison_parser.y" - { delete (((*yyvaluep).expr)); } + case 264: /* with_clause */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).with_description_vec)); } #line 2433 "bison_parser.cpp" break; - case 270: /* ident_commalist */ -#line 149 "bison_parser.y" + case 265: /* with_description_list */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).with_description_vec)); } +#line 2439 "bison_parser.cpp" + break; + + case 266: /* with_description */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).with_description_t)); } +#line 2445 "bison_parser.cpp" + break; + + case 267: /* join_clause */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).table)); } +#line 2451 "bison_parser.cpp" + break; + + case 268: /* opt_join_type */ +#line 147 "bison_parser.y" + { } +#line 2457 "bison_parser.cpp" + break; + + case 269: /* join_condition */ +#line 158 "bison_parser.y" + { delete (((*yyvaluep).expr)); } +#line 2463 "bison_parser.cpp" + break; + + case 271: /* ident_commalist */ +#line 150 "bison_parser.y" { if ((((*yyvaluep).str_vec)) != nullptr) { for (auto ptr : *(((*yyvaluep).str_vec))) { @@ -2442,7 +2472,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocatio } delete (((*yyvaluep).str_vec)); } -#line 2446 "bison_parser.cpp" +#line 2476 "bison_parser.cpp" break; default: @@ -2560,7 +2590,7 @@ YYLTYPE yylloc = yyloc_default; yylloc.string_length = 0; } -#line 2564 "bison_parser.cpp" +#line 2594 "bison_parser.cpp" yylsp[0] = yylloc; goto yysetstate; @@ -2753,7 +2783,7 @@ yyreduce: switch (yyn) { case 2: -#line 267 "bison_parser.y" +#line 269 "bison_parser.y" { for (SQLStatement* stmt : *(yyvsp[-1].stmt_vec)) { // Transfers ownership of the statement. @@ -2771,247 +2801,247 @@ yyreduce: } delete (yyvsp[-1].stmt_vec); } -#line 2775 "bison_parser.cpp" +#line 2805 "bison_parser.cpp" break; case 3: -#line 288 "bison_parser.y" +#line 290 "bison_parser.y" { (yyvsp[0].statement)->stringLength = yylloc.string_length; yylloc.string_length = 0; (yyval.stmt_vec) = new std::vector(); (yyval.stmt_vec)->push_back((yyvsp[0].statement)); } -#line 2786 "bison_parser.cpp" +#line 2816 "bison_parser.cpp" break; case 4: -#line 294 "bison_parser.y" +#line 296 "bison_parser.y" { (yyvsp[0].statement)->stringLength = yylloc.string_length; yylloc.string_length = 0; (yyvsp[-2].stmt_vec)->push_back((yyvsp[0].statement)); (yyval.stmt_vec) = (yyvsp[-2].stmt_vec); } -#line 2797 "bison_parser.cpp" +#line 2827 "bison_parser.cpp" break; case 5: -#line 303 "bison_parser.y" +#line 305 "bison_parser.y" { (yyval.statement) = (yyvsp[-1].prep_stmt); (yyval.statement)->hints = (yyvsp[0].expr_vec); } -#line 2806 "bison_parser.cpp" +#line 2836 "bison_parser.cpp" break; case 6: -#line 307 "bison_parser.y" +#line 309 "bison_parser.y" { (yyval.statement) = (yyvsp[-1].statement); (yyval.statement)->hints = (yyvsp[0].expr_vec); } -#line 2815 "bison_parser.cpp" - break; - - case 7: -#line 311 "bison_parser.y" - { - (yyval.statement) = (yyvsp[0].show_stmt); - } -#line 2823 "bison_parser.cpp" - break; - - case 8: -#line 314 "bison_parser.y" - { - (yyval.statement) = (yyvsp[0].import_stmt); - } -#line 2831 "bison_parser.cpp" - break; - - case 9: -#line 317 "bison_parser.y" - { - (yyval.statement) = (yyvsp[0].export_stmt); - } -#line 2839 "bison_parser.cpp" - break; - - case 10: -#line 324 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].select_stmt); } #line 2845 "bison_parser.cpp" break; - case 11: -#line 325 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].create_stmt); } -#line 2851 "bison_parser.cpp" + case 7: +#line 313 "bison_parser.y" + { + (yyval.statement) = (yyvsp[0].show_stmt); + } +#line 2853 "bison_parser.cpp" break; - case 12: -#line 326 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].insert_stmt); } -#line 2857 "bison_parser.cpp" + case 8: +#line 316 "bison_parser.y" + { + (yyval.statement) = (yyvsp[0].import_stmt); + } +#line 2861 "bison_parser.cpp" break; - case 13: -#line 327 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].delete_stmt); } -#line 2863 "bison_parser.cpp" - break; - - case 14: -#line 328 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].delete_stmt); } + case 9: +#line 319 "bison_parser.y" + { + (yyval.statement) = (yyvsp[0].export_stmt); + } #line 2869 "bison_parser.cpp" break; - case 15: -#line 329 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].update_stmt); } + case 10: +#line 326 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].select_stmt); } #line 2875 "bison_parser.cpp" break; - case 16: -#line 330 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].drop_stmt); } + case 11: +#line 327 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].create_stmt); } #line 2881 "bison_parser.cpp" break; - case 17: -#line 331 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].exec_stmt); } + case 12: +#line 328 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].insert_stmt); } #line 2887 "bison_parser.cpp" break; - case 18: -#line 332 "bison_parser.y" - { (yyval.statement) = (yyvsp[0].transaction_stmt); } + case 13: +#line 329 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].delete_stmt); } #line 2893 "bison_parser.cpp" break; - case 19: -#line 341 "bison_parser.y" - { (yyval.expr_vec) = (yyvsp[-1].expr_vec); } + case 14: +#line 330 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].delete_stmt); } #line 2899 "bison_parser.cpp" break; - case 20: -#line 342 "bison_parser.y" - { (yyval.expr_vec) = nullptr; } + case 15: +#line 331 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].update_stmt); } #line 2905 "bison_parser.cpp" break; - case 21: -#line 347 "bison_parser.y" - { (yyval.expr_vec) = new std::vector(); (yyval.expr_vec)->push_back((yyvsp[0].expr)); } + case 16: +#line 332 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].drop_stmt); } #line 2911 "bison_parser.cpp" break; - case 22: -#line 348 "bison_parser.y" - { (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); (yyval.expr_vec) = (yyvsp[-2].expr_vec); } + case 17: +#line 333 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].exec_stmt); } #line 2917 "bison_parser.cpp" break; + case 18: +#line 334 "bison_parser.y" + { (yyval.statement) = (yyvsp[0].transaction_stmt); } +#line 2923 "bison_parser.cpp" + break; + + case 19: +#line 343 "bison_parser.y" + { (yyval.expr_vec) = (yyvsp[-1].expr_vec); } +#line 2929 "bison_parser.cpp" + break; + + case 20: +#line 344 "bison_parser.y" + { (yyval.expr_vec) = nullptr; } +#line 2935 "bison_parser.cpp" + break; + + case 21: +#line 349 "bison_parser.y" + { (yyval.expr_vec) = new std::vector(); (yyval.expr_vec)->push_back((yyvsp[0].expr)); } +#line 2941 "bison_parser.cpp" + break; + + case 22: +#line 350 "bison_parser.y" + { (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); (yyval.expr_vec) = (yyvsp[-2].expr_vec); } +#line 2947 "bison_parser.cpp" + break; + case 23: -#line 352 "bison_parser.y" +#line 354 "bison_parser.y" { (yyval.expr) = Expr::make(kExprHint); (yyval.expr)->name = (yyvsp[0].sval); } -#line 2926 "bison_parser.cpp" +#line 2956 "bison_parser.cpp" break; case 24: -#line 356 "bison_parser.y" +#line 358 "bison_parser.y" { (yyval.expr) = Expr::make(kExprHint); (yyval.expr)->name = (yyvsp[-3].sval); (yyval.expr)->exprList = (yyvsp[-1].expr_vec); } -#line 2936 "bison_parser.cpp" +#line 2966 "bison_parser.cpp" break; case 25: -#line 368 "bison_parser.y" +#line 370 "bison_parser.y" { (yyval.transaction_stmt) = new TransactionStatement(kBeginTransaction); } -#line 2944 "bison_parser.cpp" +#line 2974 "bison_parser.cpp" break; case 26: -#line 371 "bison_parser.y" +#line 373 "bison_parser.y" { (yyval.transaction_stmt) = new TransactionStatement(kRollbackTransaction); } -#line 2952 "bison_parser.cpp" +#line 2982 "bison_parser.cpp" break; case 27: -#line 374 "bison_parser.y" +#line 376 "bison_parser.y" { (yyval.transaction_stmt) = new TransactionStatement(kCommitTransaction); } -#line 2960 "bison_parser.cpp" +#line 2990 "bison_parser.cpp" break; case 30: -#line 388 "bison_parser.y" +#line 390 "bison_parser.y" { (yyval.prep_stmt) = new PrepareStatement(); (yyval.prep_stmt)->name = (yyvsp[-2].sval); (yyval.prep_stmt)->query = (yyvsp[0].sval); } -#line 2970 "bison_parser.cpp" +#line 3000 "bison_parser.cpp" break; case 32: -#line 398 "bison_parser.y" +#line 400 "bison_parser.y" { (yyval.exec_stmt) = new ExecuteStatement(); (yyval.exec_stmt)->name = (yyvsp[0].sval); } -#line 2979 "bison_parser.cpp" +#line 3009 "bison_parser.cpp" break; case 33: -#line 402 "bison_parser.y" +#line 404 "bison_parser.y" { (yyval.exec_stmt) = new ExecuteStatement(); (yyval.exec_stmt)->name = (yyvsp[-3].sval); (yyval.exec_stmt)->parameters = (yyvsp[-1].expr_vec); } -#line 2989 "bison_parser.cpp" +#line 3019 "bison_parser.cpp" break; case 34: -#line 416 "bison_parser.y" +#line 418 "bison_parser.y" { (yyval.import_stmt) = new ImportStatement((yyvsp[-4].import_type_t)); (yyval.import_stmt)->filePath = (yyvsp[-2].sval); (yyval.import_stmt)->schema = (yyvsp[0].table_name).schema; (yyval.import_stmt)->tableName = (yyvsp[0].table_name).name; } -#line 3000 "bison_parser.cpp" +#line 3030 "bison_parser.cpp" break; case 35: -#line 422 "bison_parser.y" +#line 424 "bison_parser.y" { (yyval.import_stmt) = new ImportStatement((yyvsp[0].import_type_t)); (yyval.import_stmt)->filePath = (yyvsp[-1].sval); (yyval.import_stmt)->schema = (yyvsp[-3].table_name).schema; (yyval.import_stmt)->tableName = (yyvsp[-3].table_name).name; } -#line 3011 "bison_parser.cpp" +#line 3041 "bison_parser.cpp" break; case 36: -#line 431 "bison_parser.y" +#line 433 "bison_parser.y" { if (strcasecmp((yyvsp[0].sval), "csv") == 0) { (yyval.import_type_t) = kImportCSV; @@ -3026,70 +3056,70 @@ yyreduce: } free((yyvsp[0].sval)); } -#line 3030 "bison_parser.cpp" +#line 3060 "bison_parser.cpp" break; case 37: -#line 448 "bison_parser.y" +#line 450 "bison_parser.y" { (yyval.sval) = strdup((yyvsp[0].expr)->name); delete (yyvsp[0].expr); } -#line 3036 "bison_parser.cpp" +#line 3066 "bison_parser.cpp" break; case 38: -#line 452 "bison_parser.y" +#line 454 "bison_parser.y" { (yyval.import_type_t) = (yyvsp[0].import_type_t); } -#line 3044 "bison_parser.cpp" +#line 3074 "bison_parser.cpp" break; case 39: -#line 455 "bison_parser.y" +#line 457 "bison_parser.y" { (yyval.import_type_t) = kImportAuto; } -#line 3050 "bison_parser.cpp" +#line 3080 "bison_parser.cpp" break; case 40: -#line 464 "bison_parser.y" +#line 466 "bison_parser.y" { (yyval.export_stmt) = new ExportStatement((yyvsp[0].import_type_t)); (yyval.export_stmt)->filePath = (yyvsp[-1].sval); (yyval.export_stmt)->schema = (yyvsp[-3].table_name).schema; (yyval.export_stmt)->tableName = (yyvsp[-3].table_name).name; } -#line 3061 "bison_parser.cpp" +#line 3091 "bison_parser.cpp" break; case 41: -#line 478 "bison_parser.y" +#line 480 "bison_parser.y" { (yyval.show_stmt) = new ShowStatement(kShowTables); } -#line 3069 "bison_parser.cpp" +#line 3099 "bison_parser.cpp" break; case 42: -#line 481 "bison_parser.y" +#line 483 "bison_parser.y" { (yyval.show_stmt) = new ShowStatement(kShowColumns); (yyval.show_stmt)->schema = (yyvsp[0].table_name).schema; (yyval.show_stmt)->name = (yyvsp[0].table_name).name; } -#line 3079 "bison_parser.cpp" +#line 3109 "bison_parser.cpp" break; case 43: -#line 486 "bison_parser.y" +#line 488 "bison_parser.y" { (yyval.show_stmt) = new ShowStatement(kShowColumns); (yyval.show_stmt)->schema = (yyvsp[0].table_name).schema; (yyval.show_stmt)->name = (yyvsp[0].table_name).name; } -#line 3089 "bison_parser.cpp" +#line 3119 "bison_parser.cpp" break; case 44: -#line 500 "bison_parser.y" +#line 502 "bison_parser.y" { (yyval.create_stmt) = new CreateStatement(kCreateTableFromTbl); (yyval.create_stmt)->ifNotExists = (yyvsp[-5].bval); @@ -3103,11 +3133,11 @@ yyreduce: free((yyvsp[-2].sval)); (yyval.create_stmt)->filePath = (yyvsp[0].sval); } -#line 3107 "bison_parser.cpp" +#line 3137 "bison_parser.cpp" break; case 45: -#line 513 "bison_parser.y" +#line 515 "bison_parser.y" { (yyval.create_stmt) = new CreateStatement(kCreateTable); (yyval.create_stmt)->ifNotExists = (yyvsp[-4].bval); @@ -3115,11 +3145,11 @@ yyreduce: (yyval.create_stmt)->tableName = (yyvsp[-3].table_name).name; (yyval.create_stmt)->columns = (yyvsp[-1].column_vec); } -#line 3119 "bison_parser.cpp" +#line 3149 "bison_parser.cpp" break; case 46: -#line 520 "bison_parser.y" +#line 522 "bison_parser.y" { (yyval.create_stmt) = new CreateStatement(kCreateTable); (yyval.create_stmt)->ifNotExists = (yyvsp[-3].bval); @@ -3127,11 +3157,11 @@ yyreduce: (yyval.create_stmt)->tableName = (yyvsp[-2].table_name).name; (yyval.create_stmt)->select = (yyvsp[0].select_stmt); } -#line 3131 "bison_parser.cpp" +#line 3161 "bison_parser.cpp" break; case 47: -#line 527 "bison_parser.y" +#line 529 "bison_parser.y" { (yyval.create_stmt) = new CreateStatement(kCreateView); (yyval.create_stmt)->ifNotExists = (yyvsp[-4].bval); @@ -3140,174 +3170,174 @@ yyreduce: (yyval.create_stmt)->viewColumns = (yyvsp[-2].str_vec); (yyval.create_stmt)->select = (yyvsp[0].select_stmt); } -#line 3144 "bison_parser.cpp" +#line 3174 "bison_parser.cpp" break; case 48: -#line 538 "bison_parser.y" +#line 540 "bison_parser.y" { (yyval.bval) = true; } -#line 3150 "bison_parser.cpp" +#line 3180 "bison_parser.cpp" break; case 49: -#line 539 "bison_parser.y" +#line 541 "bison_parser.y" { (yyval.bval) = false; } -#line 3156 "bison_parser.cpp" +#line 3186 "bison_parser.cpp" break; case 50: -#line 543 "bison_parser.y" +#line 545 "bison_parser.y" { (yyval.column_vec) = new std::vector(); (yyval.column_vec)->push_back((yyvsp[0].column_t)); } -#line 3162 "bison_parser.cpp" +#line 3192 "bison_parser.cpp" break; case 51: -#line 544 "bison_parser.y" +#line 546 "bison_parser.y" { (yyvsp[-2].column_vec)->push_back((yyvsp[0].column_t)); (yyval.column_vec) = (yyvsp[-2].column_vec); } -#line 3168 "bison_parser.cpp" +#line 3198 "bison_parser.cpp" break; case 52: -#line 548 "bison_parser.y" +#line 550 "bison_parser.y" { (yyval.column_t) = new ColumnDefinition((yyvsp[-2].sval), (yyvsp[-1].column_type_t), (yyvsp[0].bval)); } -#line 3176 "bison_parser.cpp" - break; - - case 53: -#line 554 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::INT}; } -#line 3182 "bison_parser.cpp" - break; - - case 54: -#line 555 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::INT}; } -#line 3188 "bison_parser.cpp" - break; - - case 55: -#line 556 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::LONG}; } -#line 3194 "bison_parser.cpp" - break; - - case 56: -#line 557 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::FLOAT}; } -#line 3200 "bison_parser.cpp" - break; - - case 57: -#line 558 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::DOUBLE}; } #line 3206 "bison_parser.cpp" break; - case 58: -#line 559 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::VARCHAR, (yyvsp[-1].ival)}; } + case 53: +#line 556 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::INT}; } #line 3212 "bison_parser.cpp" break; - case 59: -#line 560 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::CHAR, (yyvsp[-1].ival)}; } + case 54: +#line 557 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::INT}; } #line 3218 "bison_parser.cpp" break; - case 60: -#line 561 "bison_parser.y" - { (yyval.column_type_t) = ColumnType{DataType::TEXT}; } + case 55: +#line 558 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::LONG}; } #line 3224 "bison_parser.cpp" break; - case 61: -#line 565 "bison_parser.y" - { (yyval.bval) = true; } + case 56: +#line 559 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::FLOAT}; } #line 3230 "bison_parser.cpp" break; - case 62: -#line 566 "bison_parser.y" - { (yyval.bval) = false; } + case 57: +#line 560 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::DOUBLE}; } #line 3236 "bison_parser.cpp" break; - case 63: -#line 567 "bison_parser.y" - { (yyval.bval) = false; } + case 58: +#line 561 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::VARCHAR, (yyvsp[-1].ival)}; } #line 3242 "bison_parser.cpp" break; + case 59: +#line 562 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::CHAR, (yyvsp[-1].ival)}; } +#line 3248 "bison_parser.cpp" + break; + + case 60: +#line 563 "bison_parser.y" + { (yyval.column_type_t) = ColumnType{DataType::TEXT}; } +#line 3254 "bison_parser.cpp" + break; + + case 61: +#line 567 "bison_parser.y" + { (yyval.bval) = true; } +#line 3260 "bison_parser.cpp" + break; + + case 62: +#line 568 "bison_parser.y" + { (yyval.bval) = false; } +#line 3266 "bison_parser.cpp" + break; + + case 63: +#line 569 "bison_parser.y" + { (yyval.bval) = false; } +#line 3272 "bison_parser.cpp" + break; + case 64: -#line 577 "bison_parser.y" +#line 579 "bison_parser.y" { (yyval.drop_stmt) = new DropStatement(kDropTable); (yyval.drop_stmt)->ifExists = (yyvsp[-1].bval); (yyval.drop_stmt)->schema = (yyvsp[0].table_name).schema; (yyval.drop_stmt)->name = (yyvsp[0].table_name).name; } -#line 3253 "bison_parser.cpp" +#line 3283 "bison_parser.cpp" break; case 65: -#line 583 "bison_parser.y" +#line 585 "bison_parser.y" { (yyval.drop_stmt) = new DropStatement(kDropView); (yyval.drop_stmt)->ifExists = (yyvsp[-1].bval); (yyval.drop_stmt)->schema = (yyvsp[0].table_name).schema; (yyval.drop_stmt)->name = (yyvsp[0].table_name).name; } -#line 3264 "bison_parser.cpp" +#line 3294 "bison_parser.cpp" break; case 66: -#line 589 "bison_parser.y" +#line 591 "bison_parser.y" { (yyval.drop_stmt) = new DropStatement(kDropPreparedStatement); (yyval.drop_stmt)->ifExists = false; (yyval.drop_stmt)->name = (yyvsp[0].sval); } -#line 3274 "bison_parser.cpp" +#line 3304 "bison_parser.cpp" break; case 67: -#line 597 "bison_parser.y" +#line 599 "bison_parser.y" { (yyval.bval) = true; } -#line 3280 "bison_parser.cpp" +#line 3310 "bison_parser.cpp" break; case 68: -#line 598 "bison_parser.y" +#line 600 "bison_parser.y" { (yyval.bval) = false; } -#line 3286 "bison_parser.cpp" +#line 3316 "bison_parser.cpp" break; case 69: -#line 607 "bison_parser.y" +#line 609 "bison_parser.y" { (yyval.delete_stmt) = new DeleteStatement(); (yyval.delete_stmt)->schema = (yyvsp[-1].table_name).schema; (yyval.delete_stmt)->tableName = (yyvsp[-1].table_name).name; (yyval.delete_stmt)->expr = (yyvsp[0].expr); } -#line 3297 "bison_parser.cpp" +#line 3327 "bison_parser.cpp" break; case 70: -#line 616 "bison_parser.y" +#line 618 "bison_parser.y" { (yyval.delete_stmt) = new DeleteStatement(); (yyval.delete_stmt)->schema = (yyvsp[0].table_name).schema; (yyval.delete_stmt)->tableName = (yyvsp[0].table_name).name; } -#line 3307 "bison_parser.cpp" +#line 3337 "bison_parser.cpp" break; case 71: -#line 629 "bison_parser.y" +#line 631 "bison_parser.y" { (yyval.insert_stmt) = new InsertStatement(kInsertValues); (yyval.insert_stmt)->schema = (yyvsp[-5].table_name).schema; @@ -3315,11 +3345,11 @@ yyreduce: (yyval.insert_stmt)->columns = (yyvsp[-4].str_vec); (yyval.insert_stmt)->values = (yyvsp[-1].expr_vec); } -#line 3319 "bison_parser.cpp" +#line 3349 "bison_parser.cpp" break; case 72: -#line 636 "bison_parser.y" +#line 638 "bison_parser.y" { (yyval.insert_stmt) = new InsertStatement(kInsertSelect); (yyval.insert_stmt)->schema = (yyvsp[-2].table_name).schema; @@ -3327,106 +3357,121 @@ yyreduce: (yyval.insert_stmt)->columns = (yyvsp[-1].str_vec); (yyval.insert_stmt)->select = (yyvsp[0].select_stmt); } -#line 3331 "bison_parser.cpp" +#line 3361 "bison_parser.cpp" break; case 73: -#line 647 "bison_parser.y" +#line 649 "bison_parser.y" { (yyval.str_vec) = (yyvsp[-1].str_vec); } -#line 3337 "bison_parser.cpp" +#line 3367 "bison_parser.cpp" break; case 74: -#line 648 "bison_parser.y" +#line 650 "bison_parser.y" { (yyval.str_vec) = nullptr; } -#line 3343 "bison_parser.cpp" +#line 3373 "bison_parser.cpp" break; case 75: -#line 658 "bison_parser.y" +#line 660 "bison_parser.y" { (yyval.update_stmt) = new UpdateStatement(); (yyval.update_stmt)->table = (yyvsp[-3].table); (yyval.update_stmt)->updates = (yyvsp[-1].update_vec); (yyval.update_stmt)->where = (yyvsp[0].expr); } -#line 3354 "bison_parser.cpp" +#line 3384 "bison_parser.cpp" break; case 76: -#line 667 "bison_parser.y" +#line 669 "bison_parser.y" { (yyval.update_vec) = new std::vector(); (yyval.update_vec)->push_back((yyvsp[0].update_t)); } -#line 3360 "bison_parser.cpp" +#line 3390 "bison_parser.cpp" break; case 77: -#line 668 "bison_parser.y" +#line 670 "bison_parser.y" { (yyvsp[-2].update_vec)->push_back((yyvsp[0].update_t)); (yyval.update_vec) = (yyvsp[-2].update_vec); } -#line 3366 "bison_parser.cpp" +#line 3396 "bison_parser.cpp" break; case 78: -#line 672 "bison_parser.y" +#line 674 "bison_parser.y" { (yyval.update_t) = new UpdateClause(); (yyval.update_t)->column = (yyvsp[-2].sval); (yyval.update_t)->value = (yyvsp[0].expr); } -#line 3376 "bison_parser.cpp" +#line 3406 "bison_parser.cpp" break; case 79: -#line 684 "bison_parser.y" +#line 686 "bison_parser.y" { (yyval.select_stmt) = (yyvsp[0].select_stmt); (yyval.select_stmt)->withDescriptions = (yyvsp[-1].with_description_vec); } -#line 3385 "bison_parser.cpp" +#line 3415 "bison_parser.cpp" break; case 80: -#line 688 "bison_parser.y" +#line 690 "bison_parser.y" { (yyval.select_stmt) = (yyvsp[0].select_stmt); (yyval.select_stmt)->withDescriptions = (yyvsp[-1].with_description_vec); } -#line 3394 "bison_parser.cpp" +#line 3424 "bison_parser.cpp" break; case 81: -#line 692 "bison_parser.y" +#line 694 "bison_parser.y" { - // TODO: allow multiple unions (through linked list) - // TODO: capture type of set_operator - // TODO: might overwrite order and limit of first select here (yyval.select_stmt) = (yyvsp[-4].select_stmt); - (yyval.select_stmt)->withDescriptions = (yyvsp[-5].with_description_vec); - (yyval.select_stmt)->unionSelect = (yyvsp[-2].select_stmt); - (yyval.select_stmt)->order = (yyvsp[-1].order_vec); - - // Limit could have been set by TOP. - if ((yyvsp[0].limit) != nullptr) { - delete (yyval.select_stmt)->limit; - (yyval.select_stmt)->limit = (yyvsp[0].limit); + if ((yyval.select_stmt)->setOperations == nullptr) { + (yyval.select_stmt)->setOperations = new std::vector(); } + (yyval.select_stmt)->setOperations->push_back((yyvsp[-3].set_operator_t)); + (yyval.select_stmt)->setOperations->back()->nestedSelectStatement = (yyvsp[-2].select_stmt); + (yyval.select_stmt)->setOperations->back()->resultOrder = (yyvsp[-1].order_vec); + (yyval.select_stmt)->setOperations->back()->resultLimit = (yyvsp[0].limit); + (yyval.select_stmt)->withDescriptions = (yyvsp[-5].with_description_vec); } -#line 3414 "bison_parser.cpp" +#line 3440 "bison_parser.cpp" break; - case 82: -#line 710 "bison_parser.y" - { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } -#line 3420 "bison_parser.cpp" + case 84: +#line 712 "bison_parser.y" + { (yyval.select_stmt) = (yyvsp[0].select_stmt); } +#line 3446 "bison_parser.cpp" break; - case 83: -#line 711 "bison_parser.y" - { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } -#line 3426 "bison_parser.cpp" + case 85: +#line 713 "bison_parser.y" + { + (yyval.select_stmt) = (yyvsp[-2].select_stmt); + if ((yyval.select_stmt)->setOperations == nullptr) { + (yyval.select_stmt)->setOperations = new std::vector(); + } + (yyval.select_stmt)->setOperations->push_back((yyvsp[-1].set_operator_t)); + (yyval.select_stmt)->setOperations->back()->nestedSelectStatement = (yyvsp[0].select_stmt); + } +#line 3459 "bison_parser.cpp" break; case 86: -#line 720 "bison_parser.y" +#line 724 "bison_parser.y" + { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } +#line 3465 "bison_parser.cpp" + break; + + case 87: +#line 725 "bison_parser.y" + { (yyval.select_stmt) = (yyvsp[-1].select_stmt); } +#line 3471 "bison_parser.cpp" + break; + + case 88: +#line 729 "bison_parser.y" { (yyval.select_stmt) = (yyvsp[-2].select_stmt); (yyval.select_stmt)->order = (yyvsp[-1].order_vec); @@ -3437,30 +3482,78 @@ yyreduce: (yyval.select_stmt)->limit = (yyvsp[0].limit); } } -#line 3441 "bison_parser.cpp" +#line 3486 "bison_parser.cpp" break; - case 87: -#line 730 "bison_parser.y" + case 89: +#line 739 "bison_parser.y" { - // TODO: allow multiple unions (through linked list) - // TODO: capture type of set_operator - // TODO: might overwrite order and limit of first select here (yyval.select_stmt) = (yyvsp[-4].select_stmt); - (yyval.select_stmt)->unionSelect = (yyvsp[-2].select_stmt); - (yyval.select_stmt)->order = (yyvsp[-1].order_vec); - - // Limit could have been set by TOP. - if ((yyvsp[0].limit) != nullptr) { - delete (yyval.select_stmt)->limit; - (yyval.select_stmt)->limit = (yyvsp[0].limit); + if ((yyval.select_stmt)->setOperations == nullptr) { + (yyval.select_stmt)->setOperations = new std::vector(); } + (yyval.select_stmt)->setOperations->push_back((yyvsp[-3].set_operator_t)); + (yyval.select_stmt)->setOperations->back()->nestedSelectStatement = (yyvsp[-2].select_stmt); + (yyval.select_stmt)->setOperations->back()->resultOrder = (yyvsp[-1].order_vec); + (yyval.select_stmt)->setOperations->back()->resultLimit = (yyvsp[0].limit); } -#line 3460 "bison_parser.cpp" +#line 3501 "bison_parser.cpp" + break; + + case 90: +#line 752 "bison_parser.y" + { + (yyval.set_operator_t) = (yyvsp[-1].set_operator_t); + (yyval.set_operator_t)->isAll = (yyvsp[0].bval); + } +#line 3510 "bison_parser.cpp" + break; + + case 91: +#line 759 "bison_parser.y" + { + (yyval.set_operator_t) = new SetOperation(); + (yyval.set_operator_t)->setType = SetType::kSetUnion; + } +#line 3519 "bison_parser.cpp" + break; + + case 92: +#line 763 "bison_parser.y" + { + (yyval.set_operator_t) = new SetOperation(); + (yyval.set_operator_t)->setType = SetType::kSetIntersect; + } +#line 3528 "bison_parser.cpp" + break; + + case 93: +#line 767 "bison_parser.y" + { + (yyval.set_operator_t) = new SetOperation(); + (yyval.set_operator_t)->setType = SetType::kSetExcept; + } +#line 3537 "bison_parser.cpp" break; case 94: -#line 762 "bison_parser.y" +#line 774 "bison_parser.y" + { + (yyval.bval) = true; + } +#line 3545 "bison_parser.cpp" + break; + + case 95: +#line 777 "bison_parser.y" + { + (yyval.bval) = false; + } +#line 3553 "bison_parser.cpp" + break; + + case 96: +#line 783 "bison_parser.y" { (yyval.select_stmt) = new SelectStatement(); (yyval.select_stmt)->limit = (yyvsp[-5].limit); @@ -3470,213 +3563,213 @@ yyreduce: (yyval.select_stmt)->whereClause = (yyvsp[-1].expr); (yyval.select_stmt)->groupBy = (yyvsp[0].group_t); } -#line 3474 "bison_parser.cpp" +#line 3567 "bison_parser.cpp" break; - case 95: -#line 774 "bison_parser.y" + case 97: +#line 795 "bison_parser.y" { (yyval.bval) = true; } -#line 3480 "bison_parser.cpp" - break; - - case 96: -#line 775 "bison_parser.y" - { (yyval.bval) = false; } -#line 3486 "bison_parser.cpp" +#line 3573 "bison_parser.cpp" break; case 98: -#line 783 "bison_parser.y" - { (yyval.table) = (yyvsp[0].table); } -#line 3492 "bison_parser.cpp" - break; - - case 99: -#line 784 "bison_parser.y" - { (yyval.table) = nullptr; } -#line 3498 "bison_parser.cpp" +#line 796 "bison_parser.y" + { (yyval.bval) = false; } +#line 3579 "bison_parser.cpp" break; case 100: -#line 788 "bison_parser.y" +#line 804 "bison_parser.y" { (yyval.table) = (yyvsp[0].table); } -#line 3504 "bison_parser.cpp" +#line 3585 "bison_parser.cpp" break; case 101: -#line 793 "bison_parser.y" - { (yyval.expr) = (yyvsp[0].expr); } -#line 3510 "bison_parser.cpp" +#line 805 "bison_parser.y" + { (yyval.table) = nullptr; } +#line 3591 "bison_parser.cpp" break; case 102: -#line 794 "bison_parser.y" - { (yyval.expr) = nullptr; } -#line 3516 "bison_parser.cpp" +#line 809 "bison_parser.y" + { (yyval.table) = (yyvsp[0].table); } +#line 3597 "bison_parser.cpp" break; case 103: -#line 798 "bison_parser.y" +#line 814 "bison_parser.y" + { (yyval.expr) = (yyvsp[0].expr); } +#line 3603 "bison_parser.cpp" + break; + + case 104: +#line 815 "bison_parser.y" + { (yyval.expr) = nullptr; } +#line 3609 "bison_parser.cpp" + break; + + case 105: +#line 819 "bison_parser.y" { (yyval.group_t) = new GroupByDescription(); (yyval.group_t)->columns = (yyvsp[-1].expr_vec); (yyval.group_t)->having = (yyvsp[0].expr); } -#line 3526 "bison_parser.cpp" - break; - - case 104: -#line 803 "bison_parser.y" - { (yyval.group_t) = nullptr; } -#line 3532 "bison_parser.cpp" - break; - - case 105: -#line 807 "bison_parser.y" - { (yyval.expr) = (yyvsp[0].expr); } -#line 3538 "bison_parser.cpp" +#line 3619 "bison_parser.cpp" break; case 106: -#line 808 "bison_parser.y" - { (yyval.expr) = nullptr; } -#line 3544 "bison_parser.cpp" +#line 824 "bison_parser.y" + { (yyval.group_t) = nullptr; } +#line 3625 "bison_parser.cpp" break; case 107: -#line 812 "bison_parser.y" - { (yyval.order_vec) = (yyvsp[0].order_vec); } -#line 3550 "bison_parser.cpp" +#line 828 "bison_parser.y" + { (yyval.expr) = (yyvsp[0].expr); } +#line 3631 "bison_parser.cpp" break; case 108: -#line 813 "bison_parser.y" - { (yyval.order_vec) = nullptr; } -#line 3556 "bison_parser.cpp" +#line 829 "bison_parser.y" + { (yyval.expr) = nullptr; } +#line 3637 "bison_parser.cpp" break; case 109: -#line 817 "bison_parser.y" - { (yyval.order_vec) = new std::vector(); (yyval.order_vec)->push_back((yyvsp[0].order)); } -#line 3562 "bison_parser.cpp" +#line 833 "bison_parser.y" + { (yyval.order_vec) = (yyvsp[0].order_vec); } +#line 3643 "bison_parser.cpp" break; case 110: -#line 818 "bison_parser.y" - { (yyvsp[-2].order_vec)->push_back((yyvsp[0].order)); (yyval.order_vec) = (yyvsp[-2].order_vec); } -#line 3568 "bison_parser.cpp" +#line 834 "bison_parser.y" + { (yyval.order_vec) = nullptr; } +#line 3649 "bison_parser.cpp" break; case 111: -#line 822 "bison_parser.y" - { (yyval.order) = new OrderDescription((yyvsp[0].order_type), (yyvsp[-1].expr)); } -#line 3574 "bison_parser.cpp" +#line 838 "bison_parser.y" + { (yyval.order_vec) = new std::vector(); (yyval.order_vec)->push_back((yyvsp[0].order)); } +#line 3655 "bison_parser.cpp" break; case 112: -#line 826 "bison_parser.y" - { (yyval.order_type) = kOrderAsc; } -#line 3580 "bison_parser.cpp" +#line 839 "bison_parser.y" + { (yyvsp[-2].order_vec)->push_back((yyvsp[0].order)); (yyval.order_vec) = (yyvsp[-2].order_vec); } +#line 3661 "bison_parser.cpp" break; case 113: -#line 827 "bison_parser.y" - { (yyval.order_type) = kOrderDesc; } -#line 3586 "bison_parser.cpp" +#line 843 "bison_parser.y" + { (yyval.order) = new OrderDescription((yyvsp[0].order_type), (yyvsp[-1].expr)); } +#line 3667 "bison_parser.cpp" break; case 114: -#line 828 "bison_parser.y" +#line 847 "bison_parser.y" { (yyval.order_type) = kOrderAsc; } -#line 3592 "bison_parser.cpp" +#line 3673 "bison_parser.cpp" break; case 115: -#line 834 "bison_parser.y" - { (yyval.limit) = new LimitDescription((yyvsp[0].expr), nullptr); } -#line 3598 "bison_parser.cpp" +#line 848 "bison_parser.y" + { (yyval.order_type) = kOrderDesc; } +#line 3679 "bison_parser.cpp" break; case 116: -#line 835 "bison_parser.y" - { (yyval.limit) = nullptr; } -#line 3604 "bison_parser.cpp" +#line 849 "bison_parser.y" + { (yyval.order_type) = kOrderAsc; } +#line 3685 "bison_parser.cpp" break; case 117: -#line 839 "bison_parser.y" +#line 855 "bison_parser.y" { (yyval.limit) = new LimitDescription((yyvsp[0].expr), nullptr); } -#line 3610 "bison_parser.cpp" +#line 3691 "bison_parser.cpp" break; case 118: -#line 840 "bison_parser.y" - { (yyval.limit) = new LimitDescription(nullptr, (yyvsp[0].expr)); } -#line 3616 "bison_parser.cpp" +#line 856 "bison_parser.y" + { (yyval.limit) = nullptr; } +#line 3697 "bison_parser.cpp" break; case 119: -#line 841 "bison_parser.y" - { (yyval.limit) = new LimitDescription((yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 3622 "bison_parser.cpp" +#line 860 "bison_parser.y" + { (yyval.limit) = new LimitDescription((yyvsp[0].expr), nullptr); } +#line 3703 "bison_parser.cpp" break; case 120: -#line 842 "bison_parser.y" - { (yyval.limit) = new LimitDescription(nullptr, nullptr); } -#line 3628 "bison_parser.cpp" +#line 861 "bison_parser.y" + { (yyval.limit) = new LimitDescription(nullptr, (yyvsp[0].expr)); } +#line 3709 "bison_parser.cpp" break; case 121: -#line 843 "bison_parser.y" - { (yyval.limit) = new LimitDescription(nullptr, (yyvsp[0].expr)); } -#line 3634 "bison_parser.cpp" +#line 862 "bison_parser.y" + { (yyval.limit) = new LimitDescription((yyvsp[-2].expr), (yyvsp[0].expr)); } +#line 3715 "bison_parser.cpp" break; case 122: -#line 844 "bison_parser.y" - { (yyval.limit) = nullptr; } -#line 3640 "bison_parser.cpp" +#line 863 "bison_parser.y" + { (yyval.limit) = new LimitDescription(nullptr, nullptr); } +#line 3721 "bison_parser.cpp" break; case 123: -#line 851 "bison_parser.y" - { (yyval.expr_vec) = new std::vector(); (yyval.expr_vec)->push_back((yyvsp[0].expr)); } -#line 3646 "bison_parser.cpp" +#line 864 "bison_parser.y" + { (yyval.limit) = new LimitDescription(nullptr, (yyvsp[0].expr)); } +#line 3727 "bison_parser.cpp" break; case 124: -#line 852 "bison_parser.y" - { (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); (yyval.expr_vec) = (yyvsp[-2].expr_vec); } -#line 3652 "bison_parser.cpp" +#line 865 "bison_parser.y" + { (yyval.limit) = nullptr; } +#line 3733 "bison_parser.cpp" break; case 125: -#line 856 "bison_parser.y" - { (yyval.expr_vec) = (yyvsp[0].expr_vec); } -#line 3658 "bison_parser.cpp" +#line 872 "bison_parser.y" + { (yyval.expr_vec) = new std::vector(); (yyval.expr_vec)->push_back((yyvsp[0].expr)); } +#line 3739 "bison_parser.cpp" break; case 126: -#line 857 "bison_parser.y" - { (yyval.expr_vec) = nullptr; } -#line 3664 "bison_parser.cpp" +#line 873 "bison_parser.y" + { (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); (yyval.expr_vec) = (yyvsp[-2].expr_vec); } +#line 3745 "bison_parser.cpp" break; case 127: -#line 861 "bison_parser.y" - { (yyval.expr_vec) = new std::vector(); (yyval.expr_vec)->push_back((yyvsp[0].expr)); } -#line 3670 "bison_parser.cpp" +#line 877 "bison_parser.y" + { (yyval.expr_vec) = (yyvsp[0].expr_vec); } +#line 3751 "bison_parser.cpp" break; case 128: -#line 862 "bison_parser.y" - { (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); (yyval.expr_vec) = (yyvsp[-2].expr_vec); } -#line 3676 "bison_parser.cpp" +#line 878 "bison_parser.y" + { (yyval.expr_vec) = nullptr; } +#line 3757 "bison_parser.cpp" break; case 129: -#line 866 "bison_parser.y" +#line 882 "bison_parser.y" + { (yyval.expr_vec) = new std::vector(); (yyval.expr_vec)->push_back((yyvsp[0].expr)); } +#line 3763 "bison_parser.cpp" + break; + + case 130: +#line 883 "bison_parser.y" + { (yyvsp[-2].expr_vec)->push_back((yyvsp[0].expr)); (yyval.expr_vec) = (yyvsp[-2].expr_vec); } +#line 3769 "bison_parser.cpp" + break; + + case 131: +#line 887 "bison_parser.y" { (yyval.expr) = (yyvsp[-1].expr); if ((yyvsp[0].alias_t)) { @@ -3684,415 +3777,415 @@ yyreduce: delete (yyvsp[0].alias_t); } } -#line 3688 "bison_parser.cpp" +#line 3781 "bison_parser.cpp" break; - case 135: -#line 884 "bison_parser.y" + case 137: +#line 905 "bison_parser.y" { (yyval.expr) = (yyvsp[-1].expr); } -#line 3694 "bison_parser.cpp" +#line 3787 "bison_parser.cpp" break; - case 144: -#line 893 "bison_parser.y" + case 146: +#line 914 "bison_parser.y" { (yyval.expr) = Expr::makeSelect((yyvsp[-1].select_stmt)); } -#line 3700 "bison_parser.cpp" - break; - - case 147: -#line 902 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpUnaryMinus, (yyvsp[0].expr)); } -#line 3706 "bison_parser.cpp" - break; - - case 148: -#line 903 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpNot, (yyvsp[0].expr)); } -#line 3712 "bison_parser.cpp" +#line 3793 "bison_parser.cpp" break; case 149: -#line 904 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpIsNull, (yyvsp[-1].expr)); } -#line 3718 "bison_parser.cpp" +#line 923 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpUnaryMinus, (yyvsp[0].expr)); } +#line 3799 "bison_parser.cpp" break; case 150: -#line 905 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpIsNull, (yyvsp[-2].expr)); } -#line 3724 "bison_parser.cpp" +#line 924 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpNot, (yyvsp[0].expr)); } +#line 3805 "bison_parser.cpp" break; case 151: -#line 906 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeOpUnary(kOpIsNull, (yyvsp[-3].expr))); } -#line 3730 "bison_parser.cpp" +#line 925 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpIsNull, (yyvsp[-1].expr)); } +#line 3811 "bison_parser.cpp" + break; + + case 152: +#line 926 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpIsNull, (yyvsp[-2].expr)); } +#line 3817 "bison_parser.cpp" break; case 153: -#line 911 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpMinus, (yyvsp[0].expr)); } -#line 3736 "bison_parser.cpp" - break; - - case 154: -#line 912 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpPlus, (yyvsp[0].expr)); } -#line 3742 "bison_parser.cpp" +#line 927 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeOpUnary(kOpIsNull, (yyvsp[-3].expr))); } +#line 3823 "bison_parser.cpp" break; case 155: -#line 913 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpSlash, (yyvsp[0].expr)); } -#line 3748 "bison_parser.cpp" +#line 932 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpMinus, (yyvsp[0].expr)); } +#line 3829 "bison_parser.cpp" break; case 156: -#line 914 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAsterisk, (yyvsp[0].expr)); } -#line 3754 "bison_parser.cpp" +#line 933 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpPlus, (yyvsp[0].expr)); } +#line 3835 "bison_parser.cpp" break; case 157: -#line 915 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpPercentage, (yyvsp[0].expr)); } -#line 3760 "bison_parser.cpp" +#line 934 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpSlash, (yyvsp[0].expr)); } +#line 3841 "bison_parser.cpp" break; case 158: -#line 916 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpCaret, (yyvsp[0].expr)); } -#line 3766 "bison_parser.cpp" +#line 935 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAsterisk, (yyvsp[0].expr)); } +#line 3847 "bison_parser.cpp" break; case 159: -#line 917 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLike, (yyvsp[0].expr)); } -#line 3772 "bison_parser.cpp" +#line 936 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpPercentage, (yyvsp[0].expr)); } +#line 3853 "bison_parser.cpp" break; case 160: -#line 918 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-3].expr), kOpNotLike, (yyvsp[0].expr)); } -#line 3778 "bison_parser.cpp" +#line 937 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpCaret, (yyvsp[0].expr)); } +#line 3859 "bison_parser.cpp" break; case 161: -#line 919 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpILike, (yyvsp[0].expr)); } -#line 3784 "bison_parser.cpp" +#line 938 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLike, (yyvsp[0].expr)); } +#line 3865 "bison_parser.cpp" break; case 162: -#line 920 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpConcat, (yyvsp[0].expr)); } -#line 3790 "bison_parser.cpp" +#line 939 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-3].expr), kOpNotLike, (yyvsp[0].expr)); } +#line 3871 "bison_parser.cpp" break; case 163: -#line 924 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAnd, (yyvsp[0].expr)); } -#line 3796 "bison_parser.cpp" +#line 940 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpILike, (yyvsp[0].expr)); } +#line 3877 "bison_parser.cpp" break; case 164: -#line 925 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpOr, (yyvsp[0].expr)); } -#line 3802 "bison_parser.cpp" +#line 941 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpConcat, (yyvsp[0].expr)); } +#line 3883 "bison_parser.cpp" break; case 165: -#line 929 "bison_parser.y" - { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].expr_vec)); } -#line 3808 "bison_parser.cpp" +#line 945 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpAnd, (yyvsp[0].expr)); } +#line 3889 "bison_parser.cpp" break; case 166: -#line 930 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].expr_vec))); } -#line 3814 "bison_parser.cpp" +#line 946 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpOr, (yyvsp[0].expr)); } +#line 3895 "bison_parser.cpp" break; case 167: -#line 931 "bison_parser.y" - { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].select_stmt)); } -#line 3820 "bison_parser.cpp" +#line 950 "bison_parser.y" + { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].expr_vec)); } +#line 3901 "bison_parser.cpp" break; case 168: -#line 932 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].select_stmt))); } -#line 3826 "bison_parser.cpp" +#line 951 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].expr_vec))); } +#line 3907 "bison_parser.cpp" break; case 169: -#line 938 "bison_parser.y" - { (yyval.expr) = Expr::makeCase((yyvsp[-2].expr), (yyvsp[-1].expr), nullptr); } -#line 3832 "bison_parser.cpp" +#line 952 "bison_parser.y" + { (yyval.expr) = Expr::makeInOperator((yyvsp[-4].expr), (yyvsp[-1].select_stmt)); } +#line 3913 "bison_parser.cpp" break; case 170: -#line 939 "bison_parser.y" - { (yyval.expr) = Expr::makeCase((yyvsp[-4].expr), (yyvsp[-3].expr), (yyvsp[-1].expr)); } -#line 3838 "bison_parser.cpp" +#line 953 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeInOperator((yyvsp[-5].expr), (yyvsp[-1].select_stmt))); } +#line 3919 "bison_parser.cpp" break; case 171: -#line 940 "bison_parser.y" - { (yyval.expr) = Expr::makeCase(nullptr, (yyvsp[-1].expr), nullptr); } -#line 3844 "bison_parser.cpp" +#line 959 "bison_parser.y" + { (yyval.expr) = Expr::makeCase((yyvsp[-2].expr), (yyvsp[-1].expr), nullptr); } +#line 3925 "bison_parser.cpp" break; case 172: -#line 941 "bison_parser.y" - { (yyval.expr) = Expr::makeCase(nullptr, (yyvsp[-3].expr), (yyvsp[-1].expr)); } -#line 3850 "bison_parser.cpp" +#line 960 "bison_parser.y" + { (yyval.expr) = Expr::makeCase((yyvsp[-4].expr), (yyvsp[-3].expr), (yyvsp[-1].expr)); } +#line 3931 "bison_parser.cpp" break; case 173: -#line 945 "bison_parser.y" - { (yyval.expr) = Expr::makeCaseList(Expr::makeCaseListElement((yyvsp[-2].expr), (yyvsp[0].expr))); } -#line 3856 "bison_parser.cpp" +#line 961 "bison_parser.y" + { (yyval.expr) = Expr::makeCase(nullptr, (yyvsp[-1].expr), nullptr); } +#line 3937 "bison_parser.cpp" break; case 174: -#line 946 "bison_parser.y" - { (yyval.expr) = Expr::caseListAppend((yyvsp[-4].expr), Expr::makeCaseListElement((yyvsp[-2].expr), (yyvsp[0].expr))); } -#line 3862 "bison_parser.cpp" +#line 962 "bison_parser.y" + { (yyval.expr) = Expr::makeCase(nullptr, (yyvsp[-3].expr), (yyvsp[-1].expr)); } +#line 3943 "bison_parser.cpp" break; case 175: -#line 950 "bison_parser.y" - { (yyval.expr) = Expr::makeExists((yyvsp[-1].select_stmt)); } -#line 3868 "bison_parser.cpp" +#line 966 "bison_parser.y" + { (yyval.expr) = Expr::makeCaseList(Expr::makeCaseListElement((yyvsp[-2].expr), (yyvsp[0].expr))); } +#line 3949 "bison_parser.cpp" break; case 176: -#line 951 "bison_parser.y" - { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeExists((yyvsp[-1].select_stmt))); } -#line 3874 "bison_parser.cpp" +#line 967 "bison_parser.y" + { (yyval.expr) = Expr::caseListAppend((yyvsp[-4].expr), Expr::makeCaseListElement((yyvsp[-2].expr), (yyvsp[0].expr))); } +#line 3955 "bison_parser.cpp" break; case 177: -#line 955 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpEquals, (yyvsp[0].expr)); } -#line 3880 "bison_parser.cpp" +#line 971 "bison_parser.y" + { (yyval.expr) = Expr::makeExists((yyvsp[-1].select_stmt)); } +#line 3961 "bison_parser.cpp" break; case 178: -#line 956 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpEquals, (yyvsp[0].expr)); } -#line 3886 "bison_parser.cpp" +#line 972 "bison_parser.y" + { (yyval.expr) = Expr::makeOpUnary(kOpNot, Expr::makeExists((yyvsp[-1].select_stmt))); } +#line 3967 "bison_parser.cpp" break; case 179: -#line 957 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpNotEquals, (yyvsp[0].expr)); } -#line 3892 "bison_parser.cpp" +#line 976 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpEquals, (yyvsp[0].expr)); } +#line 3973 "bison_parser.cpp" break; case 180: -#line 958 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLess, (yyvsp[0].expr)); } -#line 3898 "bison_parser.cpp" +#line 977 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpEquals, (yyvsp[0].expr)); } +#line 3979 "bison_parser.cpp" break; case 181: -#line 959 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpGreater, (yyvsp[0].expr)); } -#line 3904 "bison_parser.cpp" +#line 978 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpNotEquals, (yyvsp[0].expr)); } +#line 3985 "bison_parser.cpp" break; case 182: -#line 960 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLessEq, (yyvsp[0].expr)); } -#line 3910 "bison_parser.cpp" +#line 979 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLess, (yyvsp[0].expr)); } +#line 3991 "bison_parser.cpp" break; case 183: -#line 961 "bison_parser.y" - { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpGreaterEq, (yyvsp[0].expr)); } -#line 3916 "bison_parser.cpp" +#line 980 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpGreater, (yyvsp[0].expr)); } +#line 3997 "bison_parser.cpp" break; case 184: -#line 965 "bison_parser.y" - { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-2].sval), new std::vector(), false); } -#line 3922 "bison_parser.cpp" +#line 981 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpLessEq, (yyvsp[0].expr)); } +#line 4003 "bison_parser.cpp" break; case 185: -#line 966 "bison_parser.y" - { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-4].sval), (yyvsp[-1].expr_vec), (yyvsp[-2].bval)); } -#line 3928 "bison_parser.cpp" +#line 982 "bison_parser.y" + { (yyval.expr) = Expr::makeOpBinary((yyvsp[-2].expr), kOpGreaterEq, (yyvsp[0].expr)); } +#line 4009 "bison_parser.cpp" break; case 186: -#line 970 "bison_parser.y" - { (yyval.expr) = Expr::makeExtract((yyvsp[-3].datetime_field), (yyvsp[-1].expr)); } -#line 3934 "bison_parser.cpp" +#line 986 "bison_parser.y" + { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-2].sval), new std::vector(), false); } +#line 4015 "bison_parser.cpp" break; case 187: -#line 974 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeSecond; } -#line 3940 "bison_parser.cpp" +#line 987 "bison_parser.y" + { (yyval.expr) = Expr::makeFunctionRef((yyvsp[-4].sval), (yyvsp[-1].expr_vec), (yyvsp[-2].bval)); } +#line 4021 "bison_parser.cpp" break; case 188: -#line 975 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeMinute; } -#line 3946 "bison_parser.cpp" +#line 991 "bison_parser.y" + { (yyval.expr) = Expr::makeExtract((yyvsp[-3].datetime_field), (yyvsp[-1].expr)); } +#line 4027 "bison_parser.cpp" break; case 189: -#line 976 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeHour; } -#line 3952 "bison_parser.cpp" +#line 995 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeSecond; } +#line 4033 "bison_parser.cpp" break; case 190: -#line 977 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeDay; } -#line 3958 "bison_parser.cpp" +#line 996 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeMinute; } +#line 4039 "bison_parser.cpp" break; case 191: -#line 978 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeMonth; } -#line 3964 "bison_parser.cpp" +#line 997 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeHour; } +#line 4045 "bison_parser.cpp" break; case 192: -#line 979 "bison_parser.y" - { (yyval.datetime_field) = kDatetimeYear; } -#line 3970 "bison_parser.cpp" +#line 998 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeDay; } +#line 4051 "bison_parser.cpp" break; case 193: -#line 983 "bison_parser.y" - { (yyval.expr) = Expr::makeArray((yyvsp[-1].expr_vec)); } -#line 3976 "bison_parser.cpp" +#line 999 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeMonth; } +#line 4057 "bison_parser.cpp" break; case 194: -#line 987 "bison_parser.y" - { (yyval.expr) = Expr::makeArrayIndex((yyvsp[-3].expr), (yyvsp[-1].expr)->ival); } -#line 3982 "bison_parser.cpp" +#line 1000 "bison_parser.y" + { (yyval.datetime_field) = kDatetimeYear; } +#line 4063 "bison_parser.cpp" break; case 195: -#line 991 "bison_parser.y" - { (yyval.expr) = Expr::makeBetween((yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 3988 "bison_parser.cpp" +#line 1004 "bison_parser.y" + { (yyval.expr) = Expr::makeArray((yyvsp[-1].expr_vec)); } +#line 4069 "bison_parser.cpp" break; case 196: -#line 995 "bison_parser.y" - { (yyval.expr) = Expr::makeColumnRef((yyvsp[0].sval)); } -#line 3994 "bison_parser.cpp" +#line 1008 "bison_parser.y" + { (yyval.expr) = Expr::makeArrayIndex((yyvsp[-3].expr), (yyvsp[-1].expr)->ival); } +#line 4075 "bison_parser.cpp" break; case 197: -#line 996 "bison_parser.y" - { (yyval.expr) = Expr::makeColumnRef((yyvsp[-2].sval), (yyvsp[0].sval)); } -#line 4000 "bison_parser.cpp" +#line 1012 "bison_parser.y" + { (yyval.expr) = Expr::makeBetween((yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); } +#line 4081 "bison_parser.cpp" break; case 198: -#line 997 "bison_parser.y" - { (yyval.expr) = Expr::makeStar(); } -#line 4006 "bison_parser.cpp" +#line 1016 "bison_parser.y" + { (yyval.expr) = Expr::makeColumnRef((yyvsp[0].sval)); } +#line 4087 "bison_parser.cpp" break; case 199: -#line 998 "bison_parser.y" +#line 1017 "bison_parser.y" + { (yyval.expr) = Expr::makeColumnRef((yyvsp[-2].sval), (yyvsp[0].sval)); } +#line 4093 "bison_parser.cpp" + break; + + case 200: +#line 1018 "bison_parser.y" + { (yyval.expr) = Expr::makeStar(); } +#line 4099 "bison_parser.cpp" + break; + + case 201: +#line 1019 "bison_parser.y" { (yyval.expr) = Expr::makeStar((yyvsp[-2].sval)); } -#line 4012 "bison_parser.cpp" - break; - - case 205: -#line 1010 "bison_parser.y" - { (yyval.expr) = Expr::makeLiteral((yyvsp[0].sval)); } -#line 4018 "bison_parser.cpp" - break; - - case 206: -#line 1014 "bison_parser.y" - { (yyval.expr) = Expr::makeLiteral(true); } -#line 4024 "bison_parser.cpp" +#line 4105 "bison_parser.cpp" break; case 207: -#line 1015 "bison_parser.y" - { (yyval.expr) = Expr::makeLiteral(false); } -#line 4030 "bison_parser.cpp" +#line 1031 "bison_parser.y" + { (yyval.expr) = Expr::makeLiteral((yyvsp[0].sval)); } +#line 4111 "bison_parser.cpp" break; case 208: -#line 1019 "bison_parser.y" - { (yyval.expr) = Expr::makeLiteral((yyvsp[0].fval)); } -#line 4036 "bison_parser.cpp" +#line 1035 "bison_parser.y" + { (yyval.expr) = Expr::makeLiteral(true); } +#line 4117 "bison_parser.cpp" + break; + + case 209: +#line 1036 "bison_parser.y" + { (yyval.expr) = Expr::makeLiteral(false); } +#line 4123 "bison_parser.cpp" break; case 210: -#line 1024 "bison_parser.y" - { (yyval.expr) = Expr::makeLiteral((yyvsp[0].ival)); } -#line 4042 "bison_parser.cpp" - break; - - case 211: -#line 1028 "bison_parser.y" - { (yyval.expr) = Expr::makeNullLiteral(); } -#line 4048 "bison_parser.cpp" +#line 1040 "bison_parser.y" + { (yyval.expr) = Expr::makeLiteral((yyvsp[0].fval)); } +#line 4129 "bison_parser.cpp" break; case 212: -#line 1032 "bison_parser.y" +#line 1045 "bison_parser.y" + { (yyval.expr) = Expr::makeLiteral((yyvsp[0].ival)); } +#line 4135 "bison_parser.cpp" + break; + + case 213: +#line 1049 "bison_parser.y" + { (yyval.expr) = Expr::makeNullLiteral(); } +#line 4141 "bison_parser.cpp" + break; + + case 214: +#line 1053 "bison_parser.y" { (yyval.expr) = Expr::makeParameter(yylloc.total_column); (yyval.expr)->ival2 = yyloc.param_list.size(); yyloc.param_list.push_back((yyval.expr)); } -#line 4058 "bison_parser.cpp" +#line 4151 "bison_parser.cpp" break; - case 214: -#line 1045 "bison_parser.y" + case 216: +#line 1066 "bison_parser.y" { (yyvsp[-2].table_vec)->push_back((yyvsp[0].table)); auto tbl = new TableRef(kTableCrossProduct); tbl->list = (yyvsp[-2].table_vec); (yyval.table) = tbl; } -#line 4069 "bison_parser.cpp" +#line 4162 "bison_parser.cpp" break; - case 218: -#line 1061 "bison_parser.y" + case 220: +#line 1082 "bison_parser.y" { auto tbl = new TableRef(kTableSelect); tbl->select = (yyvsp[-2].select_stmt); tbl->alias = (yyvsp[0].alias_t); (yyval.table) = tbl; } -#line 4080 "bison_parser.cpp" - break; - - case 219: -#line 1070 "bison_parser.y" - { (yyval.table_vec) = new std::vector(); (yyval.table_vec)->push_back((yyvsp[0].table)); } -#line 4086 "bison_parser.cpp" - break; - - case 220: -#line 1071 "bison_parser.y" - { (yyvsp[-2].table_vec)->push_back((yyvsp[0].table)); (yyval.table_vec) = (yyvsp[-2].table_vec); } -#line 4092 "bison_parser.cpp" +#line 4173 "bison_parser.cpp" break; case 221: -#line 1076 "bison_parser.y" +#line 1091 "bison_parser.y" + { (yyval.table_vec) = new std::vector(); (yyval.table_vec)->push_back((yyvsp[0].table)); } +#line 4179 "bison_parser.cpp" + break; + + case 222: +#line 1092 "bison_parser.y" + { (yyvsp[-2].table_vec)->push_back((yyvsp[0].table)); (yyval.table_vec) = (yyvsp[-2].table_vec); } +#line 4185 "bison_parser.cpp" + break; + + case 223: +#line 1097 "bison_parser.y" { auto tbl = new TableRef(kTableName); tbl->schema = (yyvsp[-1].table_name).schema; @@ -4100,103 +4193,103 @@ yyreduce: tbl->alias = (yyvsp[0].alias_t); (yyval.table) = tbl; } -#line 4104 "bison_parser.cpp" +#line 4197 "bison_parser.cpp" break; - case 222: -#line 1087 "bison_parser.y" + case 224: +#line 1108 "bison_parser.y" { (yyval.table) = new TableRef(kTableName); (yyval.table)->schema = (yyvsp[0].table_name).schema; (yyval.table)->name = (yyvsp[0].table_name).name; } -#line 4114 "bison_parser.cpp" +#line 4207 "bison_parser.cpp" break; - case 223: -#line 1096 "bison_parser.y" + case 225: +#line 1117 "bison_parser.y" { (yyval.table_name).schema = nullptr; (yyval.table_name).name = (yyvsp[0].sval);} -#line 4120 "bison_parser.cpp" - break; - - case 224: -#line 1097 "bison_parser.y" - { (yyval.table_name).schema = (yyvsp[-2].sval); (yyval.table_name).name = (yyvsp[0].sval); } -#line 4126 "bison_parser.cpp" +#line 4213 "bison_parser.cpp" break; case 226: -#line 1103 "bison_parser.y" - { (yyval.alias_t) = new Alias((yyvsp[-3].sval), (yyvsp[-1].str_vec)); } -#line 4132 "bison_parser.cpp" +#line 1118 "bison_parser.y" + { (yyval.table_name).schema = (yyvsp[-2].sval); (yyval.table_name).name = (yyvsp[0].sval); } +#line 4219 "bison_parser.cpp" break; case 228: -#line 1109 "bison_parser.y" - { (yyval.alias_t) = nullptr; } -#line 4138 "bison_parser.cpp" - break; - - case 229: -#line 1114 "bison_parser.y" - { (yyval.alias_t) = new Alias((yyvsp[0].sval)); } -#line 4144 "bison_parser.cpp" +#line 1124 "bison_parser.y" + { (yyval.alias_t) = new Alias((yyvsp[-3].sval), (yyvsp[-1].str_vec)); } +#line 4225 "bison_parser.cpp" break; case 230: -#line 1115 "bison_parser.y" +#line 1130 "bison_parser.y" + { (yyval.alias_t) = nullptr; } +#line 4231 "bison_parser.cpp" + break; + + case 231: +#line 1135 "bison_parser.y" { (yyval.alias_t) = new Alias((yyvsp[0].sval)); } -#line 4150 "bison_parser.cpp" +#line 4237 "bison_parser.cpp" break; case 232: -#line 1121 "bison_parser.y" - { (yyval.alias_t) = nullptr; } -#line 4156 "bison_parser.cpp" +#line 1136 "bison_parser.y" + { (yyval.alias_t) = new Alias((yyvsp[0].sval)); } +#line 4243 "bison_parser.cpp" break; case 234: -#line 1131 "bison_parser.y" - { (yyval.with_description_vec) = nullptr; } -#line 4162 "bison_parser.cpp" - break; - - case 235: -#line 1135 "bison_parser.y" - { (yyval.with_description_vec) = (yyvsp[0].with_description_vec); } -#line 4168 "bison_parser.cpp" +#line 1142 "bison_parser.y" + { (yyval.alias_t) = nullptr; } +#line 4249 "bison_parser.cpp" break; case 236: -#line 1139 "bison_parser.y" +#line 1152 "bison_parser.y" + { (yyval.with_description_vec) = nullptr; } +#line 4255 "bison_parser.cpp" + break; + + case 237: +#line 1156 "bison_parser.y" + { (yyval.with_description_vec) = (yyvsp[0].with_description_vec); } +#line 4261 "bison_parser.cpp" + break; + + case 238: +#line 1160 "bison_parser.y" { (yyval.with_description_vec) = new std::vector(); (yyval.with_description_vec)->push_back((yyvsp[0].with_description_t)); } -#line 4177 "bison_parser.cpp" +#line 4270 "bison_parser.cpp" break; - case 237: -#line 1143 "bison_parser.y" + case 239: +#line 1164 "bison_parser.y" { (yyvsp[-2].with_description_vec)->push_back((yyvsp[0].with_description_t)); (yyval.with_description_vec) = (yyvsp[-2].with_description_vec); } -#line 4186 "bison_parser.cpp" +#line 4279 "bison_parser.cpp" break; - case 238: -#line 1150 "bison_parser.y" + case 240: +#line 1171 "bison_parser.y" { (yyval.with_description_t) = new WithDescription(); (yyval.with_description_t)->alias = (yyvsp[-2].sval); (yyval.with_description_t)->select = (yyvsp[0].select_stmt); } -#line 4196 "bison_parser.cpp" +#line 4289 "bison_parser.cpp" break; - case 239: -#line 1164 "bison_parser.y" + case 241: +#line 1185 "bison_parser.y" { (yyval.table) = new TableRef(kTableJoin); (yyval.table)->join = new JoinDefinition(); @@ -4204,11 +4297,11 @@ yyreduce: (yyval.table)->join->left = (yyvsp[-3].table); (yyval.table)->join->right = (yyvsp[0].table); } -#line 4208 "bison_parser.cpp" +#line 4301 "bison_parser.cpp" break; - case 240: -#line 1172 "bison_parser.y" + case 242: +#line 1193 "bison_parser.y" { (yyval.table) = new TableRef(kTableJoin); (yyval.table)->join = new JoinDefinition(); @@ -4217,11 +4310,11 @@ yyreduce: (yyval.table)->join->right = (yyvsp[-2].table); (yyval.table)->join->condition = (yyvsp[0].expr); } -#line 4221 "bison_parser.cpp" +#line 4314 "bison_parser.cpp" break; - case 241: -#line 1182 "bison_parser.y" + case 243: +#line 1203 "bison_parser.y" { (yyval.table) = new TableRef(kTableJoin); (yyval.table)->join = new JoinDefinition(); @@ -4237,83 +4330,83 @@ yyreduce: (yyval.table)->join->condition = Expr::makeOpBinary(left_col, kOpEquals, right_col); delete (yyvsp[-1].expr); } -#line 4241 "bison_parser.cpp" - break; - - case 242: -#line 1200 "bison_parser.y" - { (yyval.uval) = kJoinInner; } -#line 4247 "bison_parser.cpp" - break; - - case 243: -#line 1201 "bison_parser.y" - { (yyval.uval) = kJoinLeft; } -#line 4253 "bison_parser.cpp" +#line 4334 "bison_parser.cpp" break; case 244: -#line 1202 "bison_parser.y" - { (yyval.uval) = kJoinLeft; } -#line 4259 "bison_parser.cpp" +#line 1221 "bison_parser.y" + { (yyval.uval) = kJoinInner; } +#line 4340 "bison_parser.cpp" break; case 245: -#line 1203 "bison_parser.y" - { (yyval.uval) = kJoinRight; } -#line 4265 "bison_parser.cpp" +#line 1222 "bison_parser.y" + { (yyval.uval) = kJoinLeft; } +#line 4346 "bison_parser.cpp" break; case 246: -#line 1204 "bison_parser.y" - { (yyval.uval) = kJoinRight; } -#line 4271 "bison_parser.cpp" +#line 1223 "bison_parser.y" + { (yyval.uval) = kJoinLeft; } +#line 4352 "bison_parser.cpp" break; case 247: -#line 1205 "bison_parser.y" - { (yyval.uval) = kJoinFull; } -#line 4277 "bison_parser.cpp" +#line 1224 "bison_parser.y" + { (yyval.uval) = kJoinRight; } +#line 4358 "bison_parser.cpp" break; case 248: -#line 1206 "bison_parser.y" - { (yyval.uval) = kJoinFull; } -#line 4283 "bison_parser.cpp" +#line 1225 "bison_parser.y" + { (yyval.uval) = kJoinRight; } +#line 4364 "bison_parser.cpp" break; case 249: -#line 1207 "bison_parser.y" +#line 1226 "bison_parser.y" { (yyval.uval) = kJoinFull; } -#line 4289 "bison_parser.cpp" +#line 4370 "bison_parser.cpp" break; case 250: -#line 1208 "bison_parser.y" - { (yyval.uval) = kJoinCross; } -#line 4295 "bison_parser.cpp" +#line 1227 "bison_parser.y" + { (yyval.uval) = kJoinFull; } +#line 4376 "bison_parser.cpp" break; case 251: -#line 1209 "bison_parser.y" - { (yyval.uval) = kJoinInner; } -#line 4301 "bison_parser.cpp" +#line 1228 "bison_parser.y" + { (yyval.uval) = kJoinFull; } +#line 4382 "bison_parser.cpp" break; - case 255: + case 252: #line 1229 "bison_parser.y" - { (yyval.str_vec) = new std::vector(); (yyval.str_vec)->push_back((yyvsp[0].sval)); } -#line 4307 "bison_parser.cpp" + { (yyval.uval) = kJoinCross; } +#line 4388 "bison_parser.cpp" break; - case 256: + case 253: #line 1230 "bison_parser.y" + { (yyval.uval) = kJoinInner; } +#line 4394 "bison_parser.cpp" + break; + + case 257: +#line 1250 "bison_parser.y" + { (yyval.str_vec) = new std::vector(); (yyval.str_vec)->push_back((yyvsp[0].sval)); } +#line 4400 "bison_parser.cpp" + break; + + case 258: +#line 1251 "bison_parser.y" { (yyvsp[-2].str_vec)->push_back((yyvsp[0].sval)); (yyval.str_vec) = (yyvsp[-2].str_vec); } -#line 4313 "bison_parser.cpp" +#line 4406 "bison_parser.cpp" break; -#line 4317 "bison_parser.cpp" +#line 4410 "bison_parser.cpp" default: break; } @@ -4551,7 +4644,7 @@ yyreturn: #endif return yyresult; } -#line 1233 "bison_parser.y" +#line 1254 "bison_parser.y" /********************************* ** Section 4: Additional C code diff --git a/src/parser/bison_parser.h b/src/parser/bison_parser.h index d13c4cb..7a380e8 100644 --- a/src/parser/bison_parser.h +++ b/src/parser/bison_parser.h @@ -1,4 +1,4 @@ -/* A Bison parser, made by GNU Bison 3.4.1. */ +/* A Bison parser, made by GNU Bison 3.4.2. */ /* Bison interface for Yacc-like parsers in C @@ -273,6 +273,7 @@ union HSQL_STYPE hsql::GroupByDescription* group_t; hsql::UpdateClause* update_t; hsql::Alias* alias_t; + hsql::SetOperation* set_operator_t; std::vector* stmt_vec; @@ -284,7 +285,7 @@ union HSQL_STYPE std::vector* order_vec; std::vector* with_description_vec; -#line 288 "bison_parser.h" +#line 289 "bison_parser.h" }; typedef union HSQL_STYPE HSQL_STYPE; diff --git a/src/parser/bison_parser.y b/src/parser/bison_parser.y index ed2a667..b502c8a 100755 --- a/src/parser/bison_parser.y +++ b/src/parser/bison_parser.y @@ -127,6 +127,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha hsql::GroupByDescription* group_t; hsql::UpdateClause* update_t; hsql::Alias* alias_t; + hsql::SetOperation* set_operator_t; std::vector* stmt_vec; @@ -191,7 +192,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha %type execute_statement %type transaction_statement %type prepare_statement -%type select_statement select_with_paren select_no_paren select_clause select_paren_or_clause +%type select_statement select_with_paren select_no_paren select_clause select_within_set_operation select_within_set_operation_no_parentheses %type import_statement %type export_statement %type create_statement @@ -202,7 +203,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha %type show_statement %type table_name %type file_path prepare_target_query -%type opt_not_exists opt_exists opt_distinct opt_column_nullable +%type opt_not_exists opt_exists opt_distinct opt_column_nullable opt_all %type opt_join_type %type opt_from_clause from_clause table_ref table_ref_atomic table_ref_name nonjoin_table_ref_atomic %type
join_clause table_ref_name_no_alias @@ -221,6 +222,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha %type opt_group %type opt_table_alias table_alias opt_alias alias %type with_description +%type set_operator set_type // ImportType is used for compatibility reasons %type opt_file_type file_type @@ -689,33 +691,40 @@ select_statement: $$ = $2; $$->withDescriptions = $1; } - | opt_with_clause select_with_paren set_operator select_paren_or_clause opt_order opt_limit { - // TODO: allow multiple unions (through linked list) - // TODO: capture type of set_operator - // TODO: might overwrite order and limit of first select here + | opt_with_clause select_with_paren set_operator select_within_set_operation opt_order opt_limit { $$ = $2; - $$->withDescriptions = $1; - $$->unionSelect = $4; - $$->order = $5; - - // Limit could have been set by TOP. - if ($6 != nullptr) { - delete $$->limit; - $$->limit = $6; + if ($$->setOperations == nullptr) { + $$->setOperations = new std::vector(); } + $$->setOperations->push_back($3); + $$->setOperations->back()->nestedSelectStatement = $4; + $$->setOperations->back()->resultOrder = $5; + $$->setOperations->back()->resultLimit = $6; + $$->withDescriptions = $1; } ; +select_within_set_operation: + select_with_paren + | select_within_set_operation_no_parentheses; + +select_within_set_operation_no_parentheses: + select_clause { $$ = $1; } + | select_clause set_operator select_within_set_operation { + $$ = $1; + if ($$->setOperations == nullptr) { + $$->setOperations = new std::vector(); + } + $$->setOperations->push_back($2); + $$->setOperations->back()->nestedSelectStatement = $3; + } + ; + select_with_paren: '(' select_no_paren ')' { $$ = $2; } | '(' select_with_paren ')' { $$ = $2; } ; -select_paren_or_clause: - select_with_paren - | select_clause - ; - select_no_paren: select_clause opt_order opt_limit { $$ = $1; @@ -727,35 +736,47 @@ select_no_paren: $$->limit = $3; } } - | select_clause set_operator select_paren_or_clause opt_order opt_limit { - // TODO: allow multiple unions (through linked list) - // TODO: capture type of set_operator - // TODO: might overwrite order and limit of first select here + | select_clause set_operator select_within_set_operation opt_order opt_limit { $$ = $1; - $$->unionSelect = $3; - $$->order = $4; - - // Limit could have been set by TOP. - if ($5 != nullptr) { - delete $$->limit; - $$->limit = $5; + if ($$->setOperations == nullptr) { + $$->setOperations = new std::vector(); } + $$->setOperations->push_back($2); + $$->setOperations->back()->nestedSelectStatement = $3; + $$->setOperations->back()->resultOrder = $4; + $$->setOperations->back()->resultLimit = $5; } ; set_operator: - set_type opt_all + set_type opt_all { + $$ = $1; + $$->isAll = $2; + } ; set_type: - UNION - | INTERSECT - | EXCEPT + UNION { + $$ = new SetOperation(); + $$->setType = SetType::kSetUnion; + } + | INTERSECT { + $$ = new SetOperation(); + $$->setType = SetType::kSetIntersect; + } + | EXCEPT { + $$ = new SetOperation(); + $$->setType = SetType::kSetExcept; + } ; opt_all: - ALL - | /* empty */ + ALL { + $$ = true; + } + | /* empty */ { + $$ = false; + } ; select_clause: diff --git a/src/parser/flex_lexer.cpp b/src/parser/flex_lexer.cpp index 7256eca..fc8200c 100644 --- a/src/parser/flex_lexer.cpp +++ b/src/parser/flex_lexer.cpp @@ -1,6 +1,6 @@ -#line 2 "flex_lexer.cpp" +#line 1 "flex_lexer.cpp" -#line 4 "flex_lexer.cpp" +#line 3 "flex_lexer.cpp" #define YY_INT_ALIGNED short int @@ -573,8 +573,8 @@ static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); yyg->yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 156 -#define YY_END_OF_BUFFER 157 +#define YY_NUM_RULES 158 +#define YY_END_OF_BUFFER 159 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -584,25 +584,25 @@ struct yy_trans_info }; static const flex_int16_t yy_accept[1072] = { 0, - 0, 0, 153, 153, 2, 2, 157, 155, 4, 4, - 155, 155, 145, 151, 145, 145, 148, 145, 145, 145, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 145, 153, 154, 2, 2, 3, + 0, 0, 155, 155, 2, 2, 159, 157, 4, 4, + 157, 157, 147, 153, 147, 147, 150, 147, 147, 147, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 147, 155, 156, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 4, 140, 0, 1, 148, - 147, 146, 142, 141, 139, 143, 150, 150, 150, 150, + 2, 2, 2, 2, 2, 4, 142, 0, 1, 150, + 149, 148, 144, 143, 141, 145, 152, 152, 152, 152, - 150, 150, 118, 150, 119, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 120, - 150, 150, 121, 122, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 123, 124, 125, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 126, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 144, 153, 152, 2, 2, + 152, 152, 120, 152, 121, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 122, + 152, 152, 123, 124, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 125, 126, 127, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 128, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 146, 155, 154, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -613,19 +613,19 @@ static const flex_int16_t yy_accept[1072] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 149, 146, 106, 150, 107, 150, 150, 108, 150, 109, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 130, 150, 150, 150, 150, 150, 150, + 151, 148, 108, 152, 109, 152, 152, 110, 152, 111, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 132, 152, 152, 152, 152, 152, 152, - 150, 150, 150, 110, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 111, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 112, 150, 150, - 113, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 114, 150, 150, 115, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 116, 150, - 150, 150, 150, 150, 150, 150, 150, 117, 150, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 152, 152, 152, 112, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 113, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 114, 152, 152, + 115, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 116, 152, 152, 117, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 118, 152, + 152, 152, 152, 152, 152, 152, 152, 119, 152, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -637,18 +637,18 @@ static const flex_int16_t yy_accept[1072] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 150, 150, 150, 150, 150, 150, 150, 77, + 2, 2, 152, 152, 152, 152, 152, 152, 152, 79, - 150, 78, 79, 150, 150, 150, 80, 150, 150, 81, - 150, 150, 150, 150, 82, 150, 150, 150, 83, 84, - 150, 150, 150, 150, 150, 150, 150, 85, 150, 150, - 86, 87, 150, 150, 88, 150, 89, 129, 150, 150, - 150, 150, 150, 150, 90, 150, 91, 92, 93, 150, - 95, 150, 96, 150, 150, 150, 150, 97, 150, 150, - 150, 150, 150, 98, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 99, 150, 150, 150, 150, 100, 101, - 102, 150, 133, 150, 150, 150, 150, 150, 150, 150, - 150, 103, 150, 104, 150, 105, 132, 2, 2, 2, + 152, 80, 81, 152, 152, 152, 82, 152, 152, 83, + 152, 152, 152, 152, 84, 152, 152, 152, 85, 86, + 152, 152, 152, 152, 152, 152, 152, 87, 152, 152, + 88, 89, 152, 152, 90, 152, 91, 131, 152, 152, + 152, 152, 152, 152, 92, 152, 93, 94, 95, 152, + 97, 152, 98, 152, 152, 152, 152, 99, 152, 152, + 152, 152, 152, 100, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 101, 152, 152, 152, 152, 102, 103, + 104, 152, 135, 152, 152, 152, 152, 152, 152, 152, + 152, 105, 152, 106, 152, 107, 134, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -661,14 +661,14 @@ static const flex_int16_t yy_accept[1072] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 57, 58, 150, 59, 150, 136, 150, 150, - 150, 150, 150, 150, 60, 150, 150, 150, 61, 150, - 150, 150, 150, 150, 150, 150, 150, 150, 150, 134, - 62, 150, 150, 63, 150, 94, 150, 64, 65, 150, - 150, 150, 150, 66, 67, 68, 69, 150, 131, 150, - 150, 150, 70, 71, 150, 150, 150, 150, 150, 72, - 150, 150, 150, 150, 150, 150, 73, 150, 150, 150, - 150, 74, 150, 150, 150, 75, 150, 150, 150, 76, + 2, 2, 57, 58, 152, 59, 152, 138, 152, 152, + 152, 152, 152, 152, 60, 152, 152, 152, 61, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 136, + 62, 152, 152, 63, 152, 96, 152, 64, 65, 152, + 152, 152, 152, 66, 67, 68, 69, 152, 133, 152, + 152, 152, 70, 71, 152, 152, 152, 152, 152, 72, + 152, 152, 152, 152, 152, 152, 73, 152, 152, 152, + 152, 74, 152, 152, 152, 77, 152, 152, 152, 78, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -677,30 +677,30 @@ static const flex_int16_t yy_accept[1072] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 150, 31, - 150, 150, 32, 138, 150, 33, 150, 150, 34, 150, - 35, 150, 36, 37, 38, 150, 39, 150, 150, 41, - 42, 43, 44, 45, 150, 150, 46, 128, 150, 150, - 47, 150, 150, 150, 48, 150, 150, 49, 127, 50, + 2, 2, 2, 2, 2, 2, 2, 2, 152, 31, + 152, 152, 32, 140, 152, 33, 152, 152, 34, 152, + 35, 152, 36, 37, 38, 152, 39, 152, 152, 41, + 42, 43, 44, 45, 152, 152, 46, 130, 152, 152, + 47, 152, 152, 152, 48, 152, 152, 49, 129, 50, - 51, 150, 52, 150, 150, 150, 150, 53, 54, 55, - 56, 150, 150, 2, 2, 2, 2, 2, 2, 2, + 51, 152, 52, 152, 152, 152, 152, 53, 54, 55, + 56, 152, 152, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 16, - 17, 18, 19, 150, 20, 150, 150, 21, 22, 40, - 23, 150, 24, 150, 150, 25, 26, 150, 150, 27, - 28, 150, 150, 150, 150, 29, 30, 2, 2, 2, + 17, 18, 19, 152, 20, 152, 152, 21, 22, 40, + 23, 152, 24, 152, 152, 25, 26, 152, 152, 27, + 28, 152, 152, 152, 152, 29, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 150, 10, 11, 150, - 12, 150, 13, 137, 150, 150, 150, 14, 2, 2, + 2, 2, 2, 2, 2, 2, 152, 10, 11, 152, + 12, 152, 13, 139, 152, 152, 152, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 150, 7, 150, 8, 9, 150, 2, 2, 2, 2, - 2, 2, 5, 6, 150, 2, 2, 2, 135, 2, + 152, 7, 152, 8, 9, 152, 2, 2, 2, 2, + 2, 2, 5, 6, 152, 2, 2, 2, 137, 2, 0 } ; @@ -1982,7 +1982,7 @@ static const flex_int16_t yy_chk[4346] = static thread_local std::stringstream strbuf; -#line 1986 "flex_lexer.cpp" +#line 1985 "flex_lexer.cpp" /*************************** ** Section 2: Rules @@ -1996,7 +1996,7 @@ static thread_local std::stringstream strbuf; /*************************** ** Section 3: Rules ***************************/ -#line 2000 "flex_lexer.cpp" +#line 1999 "flex_lexer.cpp" #define INITIAL 0 #define singlequotedstring 1 @@ -2283,7 +2283,7 @@ YY_DECL #line 56 "flex_lexer.l" -#line 2287 "flex_lexer.cpp" +#line 2286 "flex_lexer.cpp" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2711,430 +2711,440 @@ TOKEN(UNION) case 75: YY_RULE_SETUP #line 134 "flex_lexer.l" -TOKEN(USING) +TOKEN(INTERSECT) YY_BREAK case 76: YY_RULE_SETUP #line 135 "flex_lexer.l" -TOKEN(WHERE) +TOKEN(EXCEPT) YY_BREAK case 77: YY_RULE_SETUP #line 136 "flex_lexer.l" -TOKEN(CALL) +TOKEN(USING) YY_BREAK case 78: YY_RULE_SETUP #line 137 "flex_lexer.l" -TOKEN(CASE) +TOKEN(WHERE) YY_BREAK case 79: YY_RULE_SETUP #line 138 "flex_lexer.l" -TOKEN(CHAR) +TOKEN(CALL) YY_BREAK case 80: YY_RULE_SETUP #line 139 "flex_lexer.l" -TOKEN(COPY) +TOKEN(CASE) YY_BREAK case 81: YY_RULE_SETUP #line 140 "flex_lexer.l" -TOKEN(DATE) +TOKEN(CHAR) YY_BREAK case 82: YY_RULE_SETUP #line 141 "flex_lexer.l" -TOKEN(DESC) +TOKEN(COPY) YY_BREAK case 83: YY_RULE_SETUP #line 142 "flex_lexer.l" -TOKEN(DROP) +TOKEN(DATE) YY_BREAK case 84: YY_RULE_SETUP #line 143 "flex_lexer.l" -TOKEN(ELSE) +TOKEN(DESC) YY_BREAK case 85: YY_RULE_SETUP #line 144 "flex_lexer.l" -TOKEN(FILE) +TOKEN(DROP) YY_BREAK case 86: YY_RULE_SETUP #line 145 "flex_lexer.l" -TOKEN(FROM) +TOKEN(ELSE) YY_BREAK case 87: YY_RULE_SETUP #line 146 "flex_lexer.l" -TOKEN(FULL) +TOKEN(FILE) YY_BREAK case 88: YY_RULE_SETUP #line 147 "flex_lexer.l" -TOKEN(HASH) +TOKEN(FROM) YY_BREAK case 89: YY_RULE_SETUP #line 148 "flex_lexer.l" -TOKEN(HINT) +TOKEN(FULL) YY_BREAK case 90: YY_RULE_SETUP #line 149 "flex_lexer.l" -TOKEN(INTO) +TOKEN(HASH) YY_BREAK case 91: YY_RULE_SETUP #line 150 "flex_lexer.l" -TOKEN(JOIN) +TOKEN(HINT) YY_BREAK case 92: YY_RULE_SETUP #line 151 "flex_lexer.l" -TOKEN(LEFT) +TOKEN(INTO) YY_BREAK case 93: YY_RULE_SETUP #line 152 "flex_lexer.l" -TOKEN(LIKE) +TOKEN(JOIN) YY_BREAK case 94: YY_RULE_SETUP #line 153 "flex_lexer.l" -TOKEN(ILIKE) +TOKEN(LEFT) YY_BREAK case 95: YY_RULE_SETUP #line 154 "flex_lexer.l" -TOKEN(LOAD) +TOKEN(LIKE) YY_BREAK case 96: YY_RULE_SETUP #line 155 "flex_lexer.l" -TOKEN(LONG) +TOKEN(ILIKE) YY_BREAK case 97: YY_RULE_SETUP #line 156 "flex_lexer.l" -TOKEN(NULL) +TOKEN(LOAD) YY_BREAK case 98: YY_RULE_SETUP #line 157 "flex_lexer.l" -TOKEN(PLAN) +TOKEN(LONG) YY_BREAK case 99: YY_RULE_SETUP #line 158 "flex_lexer.l" -TOKEN(SHOW) +TOKEN(NULL) YY_BREAK case 100: YY_RULE_SETUP #line 159 "flex_lexer.l" -TOKEN(TEXT) +TOKEN(PLAN) YY_BREAK case 101: YY_RULE_SETUP #line 160 "flex_lexer.l" -TOKEN(THEN) +TOKEN(SHOW) YY_BREAK case 102: YY_RULE_SETUP #line 161 "flex_lexer.l" -TOKEN(TIME) +TOKEN(TEXT) YY_BREAK case 103: YY_RULE_SETUP #line 162 "flex_lexer.l" -TOKEN(VIEW) +TOKEN(THEN) YY_BREAK case 104: YY_RULE_SETUP #line 163 "flex_lexer.l" -TOKEN(WHEN) +TOKEN(TIME) YY_BREAK case 105: YY_RULE_SETUP #line 164 "flex_lexer.l" -TOKEN(WITH) +TOKEN(VIEW) YY_BREAK case 106: YY_RULE_SETUP #line 165 "flex_lexer.l" -TOKEN(ADD) +TOKEN(WHEN) YY_BREAK case 107: YY_RULE_SETUP #line 166 "flex_lexer.l" -TOKEN(ALL) +TOKEN(WITH) YY_BREAK case 108: YY_RULE_SETUP #line 167 "flex_lexer.l" -TOKEN(AND) +TOKEN(ADD) YY_BREAK case 109: YY_RULE_SETUP #line 168 "flex_lexer.l" -TOKEN(ASC) +TOKEN(ALL) YY_BREAK case 110: YY_RULE_SETUP #line 169 "flex_lexer.l" -TOKEN(END) +TOKEN(AND) YY_BREAK case 111: YY_RULE_SETUP #line 170 "flex_lexer.l" -TOKEN(FOR) +TOKEN(ASC) YY_BREAK case 112: YY_RULE_SETUP #line 171 "flex_lexer.l" -TOKEN(INT) +TOKEN(END) YY_BREAK case 113: YY_RULE_SETUP #line 172 "flex_lexer.l" -TOKEN(KEY) +TOKEN(FOR) YY_BREAK case 114: YY_RULE_SETUP #line 173 "flex_lexer.l" -TOKEN(NOT) +TOKEN(INT) YY_BREAK case 115: YY_RULE_SETUP #line 174 "flex_lexer.l" -TOKEN(OFF) +TOKEN(KEY) YY_BREAK case 116: YY_RULE_SETUP #line 175 "flex_lexer.l" -TOKEN(SET) +TOKEN(NOT) YY_BREAK case 117: YY_RULE_SETUP #line 176 "flex_lexer.l" -TOKEN(TOP) +TOKEN(OFF) YY_BREAK case 118: YY_RULE_SETUP #line 177 "flex_lexer.l" -TOKEN(AS) +TOKEN(SET) YY_BREAK case 119: YY_RULE_SETUP #line 178 "flex_lexer.l" -TOKEN(BY) +TOKEN(TOP) YY_BREAK case 120: YY_RULE_SETUP #line 179 "flex_lexer.l" -TOKEN(IF) +TOKEN(AS) YY_BREAK case 121: YY_RULE_SETUP #line 180 "flex_lexer.l" -TOKEN(IN) +TOKEN(BY) YY_BREAK case 122: YY_RULE_SETUP #line 181 "flex_lexer.l" -TOKEN(IS) +TOKEN(IF) YY_BREAK case 123: YY_RULE_SETUP #line 182 "flex_lexer.l" -TOKEN(OF) +TOKEN(IN) YY_BREAK case 124: YY_RULE_SETUP #line 183 "flex_lexer.l" -TOKEN(ON) +TOKEN(IS) YY_BREAK case 125: YY_RULE_SETUP #line 184 "flex_lexer.l" -TOKEN(OR) +TOKEN(OF) YY_BREAK case 126: YY_RULE_SETUP #line 185 "flex_lexer.l" -TOKEN(TO) +TOKEN(ON) YY_BREAK case 127: YY_RULE_SETUP #line 186 "flex_lexer.l" -TOKEN(SECOND) +TOKEN(OR) YY_BREAK case 128: YY_RULE_SETUP #line 187 "flex_lexer.l" -TOKEN(MINUTE) +TOKEN(TO) YY_BREAK case 129: YY_RULE_SETUP #line 188 "flex_lexer.l" -TOKEN(HOUR) +TOKEN(SECOND) YY_BREAK case 130: YY_RULE_SETUP #line 189 "flex_lexer.l" -TOKEN(DAY) +TOKEN(MINUTE) YY_BREAK case 131: YY_RULE_SETUP #line 190 "flex_lexer.l" -TOKEN(MONTH) +TOKEN(HOUR) YY_BREAK case 132: YY_RULE_SETUP #line 191 "flex_lexer.l" -TOKEN(YEAR) +TOKEN(DAY) YY_BREAK case 133: YY_RULE_SETUP #line 192 "flex_lexer.l" -TOKEN(TRUE) +TOKEN(MONTH) YY_BREAK case 134: YY_RULE_SETUP #line 193 "flex_lexer.l" -TOKEN(FALSE) +TOKEN(YEAR) YY_BREAK case 135: YY_RULE_SETUP #line 194 "flex_lexer.l" -TOKEN(TRANSACTION) +TOKEN(TRUE) YY_BREAK case 136: YY_RULE_SETUP #line 195 "flex_lexer.l" -TOKEN(BEGIN) +TOKEN(FALSE) YY_BREAK case 137: YY_RULE_SETUP #line 196 "flex_lexer.l" -TOKEN(ROLLBACK) +TOKEN(TRANSACTION) YY_BREAK case 138: YY_RULE_SETUP #line 197 "flex_lexer.l" -TOKEN(COMMIT) +TOKEN(BEGIN) YY_BREAK -/* Allow =/== see https://sqlite.org/lang_expr.html#collateop */ case 139: YY_RULE_SETUP -#line 200 "flex_lexer.l" -TOKEN(EQUALS) +#line 198 "flex_lexer.l" +TOKEN(ROLLBACK) YY_BREAK case 140: YY_RULE_SETUP -#line 201 "flex_lexer.l" -TOKEN(NOTEQUALS) +#line 199 "flex_lexer.l" +TOKEN(COMMIT) YY_BREAK +/* Allow =/== see https://sqlite.org/lang_expr.html#collateop */ case 141: YY_RULE_SETUP #line 202 "flex_lexer.l" -TOKEN(NOTEQUALS) +TOKEN(EQUALS) YY_BREAK case 142: YY_RULE_SETUP #line 203 "flex_lexer.l" -TOKEN(LESSEQ) +TOKEN(NOTEQUALS) YY_BREAK case 143: YY_RULE_SETUP #line 204 "flex_lexer.l" -TOKEN(GREATEREQ) +TOKEN(NOTEQUALS) YY_BREAK case 144: YY_RULE_SETUP #line 205 "flex_lexer.l" -TOKEN(CONCAT) +TOKEN(LESSEQ) YY_BREAK case 145: YY_RULE_SETUP -#line 207 "flex_lexer.l" -{ return yytext[0]; } +#line 206 "flex_lexer.l" +TOKEN(GREATEREQ) YY_BREAK case 146: -#line 210 "flex_lexer.l" +YY_RULE_SETUP +#line 207 "flex_lexer.l" +TOKEN(CONCAT) + YY_BREAK case 147: YY_RULE_SETUP -#line 210 "flex_lexer.l" +#line 209 "flex_lexer.l" +{ return yytext[0]; } + YY_BREAK +case 148: +#line 212 "flex_lexer.l" +case 149: +YY_RULE_SETUP +#line 212 "flex_lexer.l" { yylval->fval = atof(yytext); return SQL_FLOATVAL; } YY_BREAK -case 148: +case 150: YY_RULE_SETUP -#line 215 "flex_lexer.l" +#line 217 "flex_lexer.l" { yylval->ival = atol(yytext); return SQL_INTVAL; } YY_BREAK -case 149: +case 151: YY_RULE_SETUP -#line 220 "flex_lexer.l" +#line 222 "flex_lexer.l" { // Crop the leading and trailing quote char yylval->sval = hsql::substr(yytext, 1, strlen(yytext)-1); return SQL_IDENTIFIER; } YY_BREAK -case 150: +case 152: YY_RULE_SETUP -#line 226 "flex_lexer.l" +#line 228 "flex_lexer.l" { yylval->sval = strdup(yytext); return SQL_IDENTIFIER; } YY_BREAK -case 151: -YY_RULE_SETUP -#line 231 "flex_lexer.l" -{ BEGIN singlequotedstring; strbuf = std::stringstream{}; } - YY_BREAK -case 152: -YY_RULE_SETUP -#line 232 "flex_lexer.l" -{ strbuf << '\''; } - YY_BREAK case 153: -/* rule 153 can match eol */ YY_RULE_SETUP #line 233 "flex_lexer.l" -{ strbuf << yytext; } +{ BEGIN singlequotedstring; strbuf = std::stringstream{}; } YY_BREAK case 154: YY_RULE_SETUP #line 234 "flex_lexer.l" -{ BEGIN 0; yylval->sval = strdup(strbuf.str().c_str()); return SQL_STRING; } - YY_BREAK -case YY_STATE_EOF(singlequotedstring): -#line 235 "flex_lexer.l" -{ fprintf(stderr, "[SQL-Lexer-Error] Unterminated string\n"); return 0; } +{ strbuf << '\''; } YY_BREAK case 155: +/* rule 155 can match eol */ YY_RULE_SETUP -#line 237 "flex_lexer.l" -{ fprintf(stderr, "[SQL-Lexer-Error] Unknown Character: %c\n", yytext[0]); return 0; } +#line 235 "flex_lexer.l" +{ strbuf << yytext; } YY_BREAK case 156: YY_RULE_SETUP -#line 240 "flex_lexer.l" +#line 236 "flex_lexer.l" +{ BEGIN 0; yylval->sval = strdup(strbuf.str().c_str()); return SQL_STRING; } + YY_BREAK +case YY_STATE_EOF(singlequotedstring): +#line 237 "flex_lexer.l" +{ fprintf(stderr, "[SQL-Lexer-Error] Unterminated string\n"); return 0; } + YY_BREAK +case 157: +YY_RULE_SETUP +#line 239 "flex_lexer.l" +{ fprintf(stderr, "[SQL-Lexer-Error] Unknown Character: %c\n", yytext[0]); return 0; } + YY_BREAK +case 158: +YY_RULE_SETUP +#line 242 "flex_lexer.l" ECHO; YY_BREAK -#line 3138 "flex_lexer.cpp" +#line 3147 "flex_lexer.cpp" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(COMMENT): yyterminate(); @@ -4291,7 +4301,7 @@ void yyfree (void * ptr , yyscan_t yyscanner) #define YYTABLES_NAME "yytables" -#line 240 "flex_lexer.l" +#line 242 "flex_lexer.l" /*************************** ** Section 3: User code diff --git a/src/parser/flex_lexer.h b/src/parser/flex_lexer.h index 41bb487..dbe1dd1 100644 --- a/src/parser/flex_lexer.h +++ b/src/parser/flex_lexer.h @@ -2,9 +2,9 @@ #define hsql_HEADER_H 1 #define hsql_IN_HEADER 1 -#line 6 "flex_lexer.h" +#line 5 "flex_lexer.h" -#line 8 "flex_lexer.h" +#line 7 "flex_lexer.h" #define YY_INT_ALIGNED short int @@ -730,9 +730,9 @@ extern int yylex \ #undef yyTABLES_NAME #endif -#line 240 "flex_lexer.l" +#line 242 "flex_lexer.l" -#line 737 "flex_lexer.h" +#line 736 "flex_lexer.h" #undef hsql_IN_HEADER #endif /* hsql_HEADER_H */ diff --git a/src/parser/flex_lexer.l b/src/parser/flex_lexer.l index cc338d6..b858a07 100644 --- a/src/parser/flex_lexer.l +++ b/src/parser/flex_lexer.l @@ -131,6 +131,8 @@ OUTER TOKEN(OUTER) RIGHT TOKEN(RIGHT) TABLE TOKEN(TABLE) UNION TOKEN(UNION) +INTERSECT TOKEN(INTERSECT) +EXCEPT TOKEN(EXCEPT) USING TOKEN(USING) WHERE TOKEN(WHERE) CALL TOKEN(CALL) diff --git a/src/sql/SelectStatement.h b/src/sql/SelectStatement.h index 2caa880..73dc145 100644 --- a/src/sql/SelectStatement.h +++ b/src/sql/SelectStatement.h @@ -11,6 +11,11 @@ namespace hsql { kOrderDesc }; + enum SetType { + kSetUnion, + kSetIntersect, + kSetExcept + }; // Description of the order by clause within a select statement. struct OrderDescription { @@ -46,8 +51,20 @@ namespace hsql { SelectStatement* select; }; + struct SetOperation { + SetOperation(); + virtual ~SetOperation(); + + SetType setType; + bool isAll; + + SelectStatement* nestedSelectStatement; + std::vector* resultOrder; + LimitDescription* resultLimit; + + }; + // Representation of a full SQL select statement. - // TODO: add union_order and union_limit. struct SelectStatement : SQLStatement { SelectStatement(); virtual ~SelectStatement(); @@ -58,7 +75,32 @@ namespace hsql { Expr* whereClause; GroupByDescription* groupBy; - SelectStatement* unionSelect; + // Note that a SetOperation is always connected to a + // different SelectStatement. This statement can itself + // have SetOperation connections to other SelectStatements. + // To evaluate the operations in the correct order: + // Iterate over the setOperations vector: + // 1. Fully evaluate the nestedSelectStatement within the SetOperation + // 2. Connect the original statement with the + // evaluated nestedSelectStatement + // 3. Apply the resultOrder and the resultLimit + // 4. The result now functions as the the original statement + // for the next iteration + // + // Example: + // + // (SELECT * FROM students INTERSECT SELECT * FROM students_2) UNION SELECT * FROM students_3 ORDER BY grade ASC; + // + // 1. We evaluate `Select * FROM students` + // 2. Then we iterate over the setOperations vector + // 3. We evalute the nestedSelectStatement of the first entry, which is: `SELECT * FROM students_2` + // 4. We connect the result of 1. with the results of 3. using the setType, which is INTERSECT + // 5. We continue the iteration of the setOperations vector + // 6. We evaluate the new nestedSelectStatement which is: `SELECT * FROM students_3` + // 7. We apply a Union-Operation to connect the results of 4. and 6. + // 8. Finally, we apply the resultOrder of the last SetOperation (ORDER BY grade ASC) + std::vector* setOperations; + std::vector* order; std::vector* withDescriptions; LimitDescription* limit; diff --git a/src/sql/statements.cpp b/src/sql/statements.cpp index 2dff34c..104a4d1 100755 --- a/src/sql/statements.cpp +++ b/src/sql/statements.cpp @@ -262,7 +262,7 @@ namespace hsql { selectList(nullptr), whereClause(nullptr), groupBy(nullptr), - unionSelect(nullptr), + setOperations(nullptr), order(nullptr), withDescriptions(nullptr), limit(nullptr) {}; @@ -271,7 +271,6 @@ namespace hsql { delete fromTable; delete whereClause; delete groupBy; - delete unionSelect; delete limit; // Delete each element in the select list. @@ -295,6 +294,13 @@ namespace hsql { } delete withDescriptions; } + + if (setOperations != nullptr) { + for (SetOperation* setOperation : *setOperations) { + delete setOperation; + } + delete setOperations; + } } // UpdateStatement @@ -381,4 +387,21 @@ namespace hsql { delete condition; } + SetOperation::SetOperation() : + nestedSelectStatement(nullptr), + resultOrder(nullptr), + resultLimit(nullptr) {} + + SetOperation::~SetOperation() { + delete nestedSelectStatement; + delete resultLimit; + + if (resultOrder != nullptr) { + for (OrderDescription* desc: *resultOrder) { + delete desc; + } + delete resultOrder; + } + } + } // namespace hsql diff --git a/src/util/sqlhelper.cpp b/src/util/sqlhelper.cpp index bb9dad4..74a5b4d 100755 --- a/src/util/sqlhelper.cpp +++ b/src/util/sqlhelper.cpp @@ -168,9 +168,41 @@ namespace hsql { } } - if (stmt->unionSelect != nullptr) { - inprint("Union:", numIndent + 1); - printSelectStatementInfo(stmt->unionSelect, numIndent + 2); + if (stmt->setOperations != nullptr) { + for (SetOperation* setOperation : *stmt->setOperations) { + switch (setOperation->setType) { + case SetType::kSetIntersect: + inprint("Intersect:", numIndent + 1); + break; + case SetType::kSetUnion: + inprint("Union:", numIndent + 1); + break; + case SetType::kSetExcept: + inprint("Except:", numIndent + 1); + break; + } + + printSelectStatementInfo(setOperation->nestedSelectStatement, numIndent + 2); + + if (setOperation->resultOrder != nullptr) { + inprint("SetResultOrderBy:", numIndent + 1); + printExpression(setOperation->resultOrder->at(0)->expr, numIndent + 2); + if (setOperation->resultOrder->at(0)->type == kOrderAsc) inprint("ascending", numIndent + 2); + else inprint("descending", numIndent + 2); + } + + if (setOperation->resultLimit != nullptr) { + if (setOperation->resultLimit->limit != nullptr) { + inprint("SetResultLimit:", numIndent + 1); + printExpression(setOperation->resultLimit->limit, numIndent + 2); + } + + if (setOperation->resultLimit->offset != nullptr) { + inprint("SetResultOffset:", numIndent + 1); + printExpression(setOperation->resultLimit->offset, numIndent + 2); + } + } + } } if (stmt->order != nullptr) { diff --git a/test/sql_tests.cpp b/test/sql_tests.cpp index 4a0a564..873f69e 100644 --- a/test/sql_tests.cpp +++ b/test/sql_tests.cpp @@ -105,7 +105,6 @@ TEST(UpdateStatementTest) { ASSERT_STREQ(stmt->where->expr2->name, "Max O'Mustermann"); } - TEST(InsertStatementTest) { TEST_PARSE_SINGLE_SQL( "INSERT INTO students VALUES ('Max Mustermann', 12345, 'Musterhausen', 2.0)", @@ -118,7 +117,6 @@ TEST(InsertStatementTest) { // TODO } - TEST(DropTableStatementTest) { TEST_PARSE_SINGLE_SQL( "DROP TABLE students", @@ -281,7 +279,6 @@ TEST(HintTest) { result, stmt); - ASSERT_NOTNULL(stmt->hints); ASSERT_EQ(2, stmt->hints->size()); ASSERT_STREQ("NO_CACHE", stmt->hints->at(0)->name); @@ -301,6 +298,190 @@ TEST(StringLengthTest) { ASSERT_EQ(result.getStatement(2)->stringLength, 21); } +TEST(ExceptOperatorTest) { + TEST_PARSE_SINGLE_SQL( + "SELECT * FROM students EXCEPT SELECT * FROM students_2;", + kStmtSelect, + SelectStatement, + result, + stmt); + + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); + ASSERT_STREQ(stmt->fromTable->name, "students"); + ASSERT_EQ(stmt->setOperations->back()->setType, kSetExcept); +} + +TEST(IntersectOperatorTest) { + TEST_PARSE_SINGLE_SQL( + "SELECT * FROM students INTERSECT SELECT * FROM students_2;", + kStmtSelect, + SelectStatement, + result, + stmt); + + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); + ASSERT_STREQ(stmt->fromTable->name, "students"); + ASSERT_EQ(stmt->setOperations->back()->setType, kSetIntersect); +} + +TEST(UnionOperatorTest) { + TEST_PARSE_SINGLE_SQL( + "SELECT * FROM students UNION SELECT * FROM students_2;", + kStmtSelect, + SelectStatement, + result, + stmt); + + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); + ASSERT_STREQ(stmt->fromTable->name, "students"); + ASSERT_EQ(stmt->setOperations->back()->setType, kSetUnion); + ASSERT_FALSE(stmt->setOperations->back()->isAll); +} + +TEST(UnionAllOperatorTest) { + TEST_PARSE_SINGLE_SQL( + "SELECT * FROM students UNION ALL SELECT * FROM students_2;", + kStmtSelect, + SelectStatement, + result, + stmt); + + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); + ASSERT_STREQ(stmt->fromTable->name, "students"); + ASSERT_TRUE(stmt->setOperations->back()->isAll); +} + +TEST(NestedSetOperationTest) { + TEST_PARSE_SINGLE_SQL( + "SELECT * FROM students INTERSECT SELECT grade FROM students_2 UNION SELECT * FROM employees;", + kStmtSelect, + SelectStatement, + result, + stmt); + + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->setOperations->back()->nestedSelectStatement->fromTable->name, "employees"); + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "students_2"); + ASSERT_STREQ(stmt->fromTable->name, "students"); + ASSERT_EQ(stmt->setOperations->back()->setType, kSetIntersect); + ASSERT_EQ(stmt->setOperations->back()->nestedSelectStatement->setOperations->back()->setType, kSetUnion); + ASSERT_FALSE(stmt->setOperations->back()->isAll); +} + +TEST(OrderByFullStatementTest) { + TEST_PARSE_SINGLE_SQL( + "SELECT * FROM students INTERSECT SELECT grade FROM students_2 UNION SELECT * FROM employees ORDER BY grade ASC;", + kStmtSelect, + SelectStatement, + result, + stmt); + + ASSERT_EQ(stmt->setOperations->back()->resultOrder->at(0)->type, kOrderAsc); + ASSERT_STREQ(stmt->setOperations->back()->resultOrder->at(0)->expr->name, "grade"); + ASSERT_FALSE(stmt->setOperations->back()->isAll); +} + +TEST(SetOperationSubQueryOrder) { + TEST_PARSE_SINGLE_SQL( + "(SELECT * FROM students ORDER BY name DESC) INTERSECT SELECT grade FROM students_2 UNION SELECT * FROM employees ORDER BY grade ASC;", + kStmtSelect, + SelectStatement, + result, + stmt); + + ASSERT_EQ(stmt->order->at(0)->type, kOrderDesc); + ASSERT_STREQ(stmt->order->at(0)->expr->name, "name"); + + ASSERT_EQ(stmt->setOperations->back()->resultOrder->at(0)->type, kOrderAsc); + ASSERT_STREQ(stmt->setOperations->back()->resultOrder->at(0)->expr->name, "grade"); + ASSERT_FALSE(stmt->setOperations->back()->isAll); +} + +TEST(SetOperationLastSubQueryOrder) { + TEST_PARSE_SINGLE_SQL( + "SELECT * FROM students INTERSECT SELECT grade FROM students_2 UNION (SELECT * FROM employees ORDER BY name DESC) ORDER BY grade ASC;", + kStmtSelect, + SelectStatement, + result, + stmt); + + ASSERT_EQ(stmt->setOperations->back()->nestedSelectStatement->setOperations->back()->nestedSelectStatement->order->at(0)->type, kOrderDesc); + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->setOperations->back()->nestedSelectStatement->order->at(0)->expr->name, "name"); + + ASSERT_EQ(stmt->setOperations->back()->resultOrder->at(0)->type, kOrderAsc); + ASSERT_STREQ(stmt->setOperations->back()->resultOrder->at(0)->expr->name, "grade"); + ASSERT_FALSE(stmt->setOperations->back()->isAll); +} + +TEST(NestedDifferentSetOperationsWithWithClause) { + + TEST_PARSE_SINGLE_SQL("WITH UNION_FIRST AS (SELECT * FROM A UNION SELECT * FROM B) SELECT * FROM UNION_FIRST EXCEPT SELECT * FROM C", + kStmtSelect, + SelectStatement, + result, + stmt); + + ASSERT_STREQ(stmt->withDescriptions->back()->alias, "UNION_FIRST"); + ASSERT_EQ(stmt->withDescriptions->back()->select->setOperations->back()->setType, kSetUnion); + ASSERT_STREQ(stmt->withDescriptions->back()->select->fromTable->name, "A"); + ASSERT_STREQ(stmt->withDescriptions->back()->select->setOperations->back()->nestedSelectStatement->fromTable->name, "B"); + + ASSERT_EQ(stmt->setOperations->back()->setType, kSetExcept); + ASSERT_STREQ(stmt->fromTable->name, "UNION_FIRST"); + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "C"); + +} + +TEST(NestedAllSetOperationsWithWithClause) { + + TEST_PARSE_SINGLE_SQL("WITH UNION_FIRST AS (SELECT * FROM A UNION SELECT * FROM B) SELECT * FROM UNION_FIRST EXCEPT SELECT * FROM (SELECT * FROM C INTERSECT SELECT * FROM D)", + kStmtSelect, + SelectStatement, + result, + stmt); + + ASSERT_STREQ(stmt->withDescriptions->back()->alias, "UNION_FIRST"); + ASSERT_EQ(stmt->withDescriptions->back()->select->setOperations->back()->setType, kSetUnion); + ASSERT_STREQ(stmt->withDescriptions->back()->select->fromTable->name, "A"); + ASSERT_STREQ(stmt->withDescriptions->back()->select->setOperations->back()->nestedSelectStatement->fromTable->name, "B"); + + ASSERT_EQ(stmt->setOperations->back()->setType, kSetExcept); + ASSERT_STREQ(stmt->fromTable->name, "UNION_FIRST"); + ASSERT_EQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->select->setOperations->back()->setType, kSetIntersect); + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->select->fromTable->name, "C"); + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->select->setOperations->back()->nestedSelectStatement->fromTable->name, "D"); + +} + +TEST(NestedSetOperationsWithMultipleWithClauses) { + + TEST_PARSE_SINGLE_SQL( + "WITH UNION_FIRST AS (SELECT * FROM A UNION SELECT * FROM B),INTERSECT_SECOND AS (SELECT * FROM UNION_FIRST INTERSECT SELECT * FROM C) SELECT * FROM UNION_FIRST EXCEPT SELECT * FROM INTERSECT_SECOND", + kStmtSelect, + SelectStatement, + result, + stmt); + + ASSERT_STREQ(stmt->withDescriptions->at(0)->alias, "UNION_FIRST"); + ASSERT_STREQ(stmt->withDescriptions->back()->alias, "INTERSECT_SECOND"); + + ASSERT_EQ(stmt->withDescriptions->at(0)->select->setOperations->back()->setType, kSetUnion); + ASSERT_STREQ(stmt->withDescriptions->at(0)->select->fromTable->name, "A"); + ASSERT_STREQ(stmt->withDescriptions->at(0)->select->setOperations->back()->nestedSelectStatement->fromTable->name, "B"); + + ASSERT_EQ(stmt->withDescriptions->back()->select->setOperations->back()->setType, kSetIntersect); + ASSERT_STREQ(stmt->withDescriptions->back()->select->fromTable->name, "UNION_FIRST"); + ASSERT_STREQ(stmt->withDescriptions->back()->select->setOperations->back()->nestedSelectStatement->fromTable->name, "C"); + + ASSERT_EQ(stmt->setOperations->back()->setType, kSetExcept); + ASSERT_STREQ(stmt->fromTable->name, "UNION_FIRST"); + ASSERT_STREQ(stmt->setOperations->back()->nestedSelectStatement->fromTable->name, "INTERSECT_SECOND"); +} + +TEST(WrongOrderByStatementTest) { + SQLParserResult res = parse_and_move("SELECT * FROM students ORDER BY name INTERSECT SELECT grade FROM students_2;"); + ASSERT_FALSE(res.isValid()); +} + TEST(BeginTransactionTest) { { TEST_PARSE_SINGLE_SQL(