From 9ce255461ffd5e7efb5e731264aedc3a0001c154 Mon Sep 17 00:00:00 2001 From: Affan Khan Date: Tue, 23 Jun 2026 11:34:37 -0400 Subject: [PATCH 1/7] Enhance ECSQL with IS and IS NOT operators for null-safe semantics - Added support for the `IS` and `IS NOT` operators in ECSQL to handle null-safe comparisons. - Updated the ECSQL parser to recognize new boolean expressions involving `IS` and `IS NOT`. - Modified the ECSQL version to 2.0.4.0 to reflect the addition of new features. - Added unit tests to validate the behavior of the new operators, ensuring correct handling of null values and type compatibility. - Updated existing tests to align with the new ECSQL version. --- iModelCore/ECDb/CHANGES.md | 9 +- iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp | 36 +- .../ECDb/ECDb/ECSql/Parser/SqlBison.cpp | 2256 +++++++++-------- iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y | 8 + iModelCore/ECDb/PublicAPI/ECDb/ECDb.h | 2 +- .../ECDb/Tests/NonPublished/ECDbTests.cpp | 2 +- .../NonPublished/ECSqlStatementTests.cpp | 45 + .../ECSqlToSqlGenerationTests.cpp | 58 + 8 files changed, 1283 insertions(+), 1133 deletions(-) diff --git a/iModelCore/ECDb/CHANGES.md b/iModelCore/ECDb/CHANGES.md index fb9df42843b..6214b2a57a6 100644 --- a/iModelCore/ECDb/CHANGES.md +++ b/iModelCore/ECDb/CHANGES.md @@ -5,7 +5,14 @@ This document including important changes to syntax or file format. | Module | Version | | ------- | --------- | | Profile | `4.0.0.5` | -| ECSQL | `2.0.3.2` | +| ECSQL | `2.0.4.0` | + +## ## `06/23/2026`: Added `IS` / `IS NOT` operator between operands +* ECSql version change `2.0.3.2` -> `2.0.4.0`. +* The `IS` and `IS NOT` operators can now be used between two operands, e.g. `prop1 IS [NOT] prop2`, where each operand may be a property or the `NULL` literal. These map to SQLite's null-safe comparison operators (`NULL IS NULL` is true, `1 IS NULL` is false). +* Previously `IS` / `IS NOT` only supported the right-hand operands `NULL`, the boolean literals `TRUE`/`FALSE`/`UNKNOWN`, and the class type predicate `IS (ClassName)`. Those forms are unchanged. +* For multi-column operands (e.g. `Point2d`/`Point3d` and navigation properties), the comparison is expanded column-wise: `IS` joins the per-column comparisons with `AND`, `IS NOT` joins them with `OR` (consistent with `=` and `<>`). +* Example: `SELECT * FROM bis.Element WHERE CodeValue IS NOT UserLabel` ## ## `04/24/2026`: Allow optional ON clause with CROSS JOIN * ECSql version change `2.0.3.1` -> `2.0.3.2`. diff --git a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp index 0b075f5cdb1..8c1cc9506a0 100644 --- a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp +++ b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp @@ -2434,20 +2434,42 @@ BentleyStatus ECSqlParser::ParseSearchCondition(std::unique_ptr& exp } case OSQLParseNode::boolean_test: { - std::unique_ptr op1 = nullptr; - if (SUCCESS != ParseSearchCondition(op1, parseNode->getChild(0/*boolean_primary*/))) - return ERROR; - bool isNot = false; if (SUCCESS != ParseNotToken(isNot, parseNode->getChild(2/*sql_not*/))) return ERROR; + const BooleanSqlOperator op = isNot ? BooleanSqlOperator::IsNot : BooleanSqlOperator::Is; + OSQLParseNode const* lhsNode = parseNode->getChild(0/*boolean_primary*/); + OSQLParseNode const* rhsNode = parseNode->getChild(3/*truth_value | column_ref*/); + + if (SQL_ISRULE(rhsNode, column_ref)) + { + // X IS [NOT] Y : both sides are value expressions compared with SQLite's null-safe IS operator. + // The left side is parsed as a value expression (not a boolean predicate) so that it keeps its real + // type. This matters for operands whose comparability depends on their type (e.g. points and + // navigation properties) and to detect a NULL literal operand for the column-wise expansion. + std::unique_ptr lhsValueExp = nullptr; + if (SUCCESS != ParseValueExp(lhsValueExp, lhsNode)) + return ERROR; + + std::unique_ptr rhsValueExp = nullptr; + if (SUCCESS != ParseValueExp(rhsValueExp, rhsNode)) + return ERROR; + + exp = std::make_unique(std::move(lhsValueExp), op, std::move(rhsValueExp)); + return SUCCESS; + } + + // X IS [NOT] NULL|TRUE|FALSE|UNKNOWN|(ClassName) : the left side is a boolean predicate. + std::unique_ptr op1 = nullptr; + if (SUCCESS != ParseSearchCondition(op1, lhsNode)) + return ERROR; + std::unique_ptr truthValueExp = nullptr; - if (SUCCESS != ParseTruthValue(truthValueExp, parseNode->getChild(3/*truth_value*/))) + if (SUCCESS != ParseValueExp(truthValueExp, rhsNode)) return ERROR; - // X IS [NOT] NULL|TRUE|FALSE|UNKNOWN - exp = std::make_unique(std::move(op1), isNot ? BooleanSqlOperator::IsNot : BooleanSqlOperator::Is, std::move(truthValueExp)); + exp = std::make_unique(std::move(op1), op, std::move(truthValueExp)); return SUCCESS; } case OSQLParseNode::boolean_primary: diff --git a/iModelCore/ECDb/ECDb/ECSql/Parser/SqlBison.cpp b/iModelCore/ECDb/ECDb/ECSql/Parser/SqlBison.cpp index 20c1dee249c..99d45ea2e4d 100644 --- a/iModelCore/ECDb/ECDb/ECSql/Parser/SqlBison.cpp +++ b/iModelCore/ECDb/ECDb/ECSql/Parser/SqlBison.cpp @@ -896,16 +896,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 31 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 3094 +#define YYLAST 3095 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 173 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 220 /* YYNRULES -- Number of rules. */ -#define YYNRULES 482 +#define YYNRULES 483 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 767 +#define YYNSTATES 768 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 405 @@ -983,41 +983,41 @@ static const yytype_int16 yyrline[] = 804, 805, 812, 813, 818, 826, 827, 834, 842, 850, 858, 862, 871, 872, 882, 883, 891, 892, 893, 894, 895, 898, 899, 900, 901, 902, 903, 904, 914, 915, - 925, 926, 934, 935, 944, 945, 955, 964, 969, 977, - 986, 987, 988, 989, 990, 991, 992, 993, 994, 1000, - 1007, 1014, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1053, - 1063, 1071, 1081, 1091, 1097, 1103, 1125, 1150, 1151, 1158, - 1167, 1173, 1189, 1193, 1201, 1210, 1216, 1232, 1241, 1250, - 1259, 1269, 1270, 1271, 1275, 1283, 1289, 1297, 1304, 1315, - 1320, 1327, 1331, 1332, 1333, 1334, 1335, 1337, 1349, 1361, - 1373, 1389, 1390, 1396, 1400, 1401, 1404, 1405, 1406, 1407, - 1410, 1422, 1423, 1424, 1425, 1432, 1440, 1452, 1453, 1457, - 1471, 1487, 1503, 1512, 1520, 1529, 1547, 1548, 1557, 1558, - 1559, 1560, 1561, 1562, 1566, 1571, 1576, 1583, 1591, 1592, - 1595, 1596, 1601, 1602, 1610, 1618, 1631, 1641, 1650, 1654, - 1665, 1672, 1679, 1680, 1681, 1682, 1683, 1687, 1698, 1699, - 1705, 1716, 1728, 1729, 1733, 1738, 1749, 1750, 1754, 1768, - 1769, 1779, 1783, 1784, 1788, 1793, 1794, 1803, 1806, 1812, - 1822, 1826, 1844, 1845, 1849, 1854, 1855, 1866, 1867, 1877, - 1880, 1886, 1896, 1897, 1904, 1910, 1916, 1927, 1928, 1929, - 1933, 1934, 1938, 1944, 1951, 1960, 1969, 1980, 1981, 1987, - 1991, 1992, 2001, 2002, 2011, 2020, 2021, 2022, 2023, 2028, - 2029, 2038, 2039, 2040, 2044, 2058, 2059, 2060, 2063, 2064, - 2067, 2079, 2080, 2084, 2087, 2091, 2092, 2093, 2094, 2095, - 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, - 2106, 2110, 2115, 2125, 2134, 2135, 2139, 2151, 2152, 2159, - 2160, 2168, 2169, 2170, 2171, 2172, 2173, 2174, 2181, 2185, - 2189, 2190, 2196, 2202, 2211, 2212, 2219, 2226, 2236, 2237, - 2244, 2254, 2255, 2262, 2269, 2276, 2286, 2293, 2298, 2303, - 2308, 2314, 2320, 2329, 2336, 2344, 2352, 2355, 2361, 2365, - 2370, 2378, 2379, 2380, 2384, 2388, 2389, 2392, 2399, 2409, - 2412, 2416, 2426, 2431, 2438, 2447, 2455, 2464, 2472, 2481, - 2489, 2494, 2499, 2507, 2516, 2517, 2527, 2528, 2536, 2541, - 2559, 2565, 2570, 2578, 2590, 2594, 2598, 2599, 2603, 2614, - 2624, 2629, 2636, 2646, 2649, 2654, 2655, 2656, 2657, 2658, - 2659, 2662, 2667, 2674, 2684, 2685, 2693, 2697, 2701, 2705, - 2711, 2719, 2722, 2732, 2733, 2737, 2746, 2751, 2759, 2765, - 2775, 2776, 2777 + 923, 933, 934, 942, 943, 952, 953, 963, 972, 977, + 985, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, + 1008, 1015, 1022, 1047, 1048, 1049, 1050, 1051, 1052, 1053, + 1061, 1071, 1079, 1089, 1099, 1105, 1111, 1133, 1158, 1159, + 1166, 1175, 1181, 1197, 1201, 1209, 1218, 1224, 1240, 1249, + 1258, 1267, 1277, 1278, 1279, 1283, 1291, 1297, 1305, 1312, + 1323, 1328, 1335, 1339, 1340, 1341, 1342, 1343, 1345, 1357, + 1369, 1381, 1397, 1398, 1404, 1408, 1409, 1412, 1413, 1414, + 1415, 1418, 1430, 1431, 1432, 1433, 1440, 1448, 1460, 1461, + 1465, 1479, 1495, 1511, 1520, 1528, 1537, 1555, 1556, 1565, + 1566, 1567, 1568, 1569, 1570, 1574, 1579, 1584, 1591, 1599, + 1600, 1603, 1604, 1609, 1610, 1618, 1626, 1639, 1649, 1658, + 1662, 1673, 1680, 1687, 1688, 1689, 1690, 1691, 1695, 1706, + 1707, 1713, 1724, 1736, 1737, 1741, 1746, 1757, 1758, 1762, + 1776, 1777, 1787, 1791, 1792, 1796, 1801, 1802, 1811, 1814, + 1820, 1830, 1834, 1852, 1853, 1857, 1862, 1863, 1874, 1875, + 1885, 1888, 1894, 1904, 1905, 1912, 1918, 1924, 1935, 1936, + 1937, 1941, 1942, 1946, 1952, 1959, 1968, 1977, 1988, 1989, + 1995, 1999, 2000, 2009, 2010, 2019, 2028, 2029, 2030, 2031, + 2036, 2037, 2046, 2047, 2048, 2052, 2066, 2067, 2068, 2071, + 2072, 2075, 2087, 2088, 2092, 2095, 2099, 2100, 2101, 2102, + 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, + 2113, 2114, 2118, 2123, 2133, 2142, 2143, 2147, 2159, 2160, + 2167, 2168, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2189, + 2193, 2197, 2198, 2204, 2210, 2219, 2220, 2227, 2234, 2244, + 2245, 2252, 2262, 2263, 2270, 2277, 2284, 2294, 2301, 2306, + 2311, 2316, 2322, 2328, 2337, 2344, 2352, 2360, 2363, 2369, + 2373, 2378, 2386, 2387, 2388, 2392, 2396, 2397, 2400, 2407, + 2417, 2420, 2424, 2434, 2439, 2446, 2455, 2463, 2472, 2480, + 2489, 2497, 2502, 2507, 2515, 2524, 2525, 2535, 2536, 2544, + 2549, 2567, 2573, 2578, 2586, 2598, 2602, 2606, 2607, 2611, + 2622, 2632, 2637, 2644, 2654, 2657, 2662, 2663, 2664, 2665, + 2666, 2667, 2670, 2675, 2682, 2692, 2693, 2701, 2705, 2709, + 2713, 2719, 2727, 2730, 2740, 2741, 2745, 2754, 2759, 2767, + 2773, 2783, 2784, 2785 }; #endif @@ -1161,12 +1161,12 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-583) +#define YYPACT_NINF (-587) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-461) +#define YYTABLE_NINF (-462) #define yytable_value_is_error(Yyn) \ 0 @@ -1175,83 +1175,83 @@ yysymbol_name (yysymbol_kind_t yysymbol) STATE-NUM. */ static const yytype_int16 yypact[] = { - 280, 87, 80, 75, 240, 82, 144, 143, 233, 206, - 284, -583, -583, -583, -583, -583, -583, -583, 34, -583, - 279, 82, 54, -583, -583, 2411, -583, -583, 285, 2561, - 48, -583, -583, -583, -583, -583, -583, 305, 113, -583, - 94, 285, 95, 285, 336, -583, -583, 1361, 320, -583, - -583, -583, -583, -583, 213, -583, -583, 348, 354, -583, - 356, 358, -583, -583, 372, -583, -583, -583, -583, 2861, - 381, -583, -583, -583, -583, 2111, -583, -583, 2561, 2561, - 2561, 383, 385, -583, -583, -583, -583, 388, -583, -583, - -583, -583, -583, 397, 2861, 2861, 139, 393, -583, 445, - -583, 67, -583, -583, -583, -583, 449, -583, 116, 463, - -583, 330, -583, -583, 483, -583, 485, -583, 488, -583, - -583, -583, -583, -583, 225, 65, 216, -583, -583, -583, - -583, -583, 28, -583, 328, -583, -583, -583, -583, 53, - -583, -583, -583, -583, -583, -583, -583, 427, -583, 362, - -583, -583, 342, 64, 64, 408, -583, -583, -583, 175, - 492, 517, 279, -583, 447, 497, 507, 336, 17, 451, - 532, 534, 537, 38, -583, -583, -583, 2561, 46, 240, - 240, 911, -583, 2561, 911, -583, 301, -583, 448, 342, - -583, -583, -583, 538, 2561, 2561, 240, -583, -583, 45, - -583, 447, 2561, -583, -583, -583, -583, 1511, 240, 541, - 429, 2561, 2561, 544, 2711, 2711, 2711, 2711, 2711, 2711, - 2711, 2711, 2711, -583, 527, 2561, -583, -583, 439, 17, - 17, -583, 17, -583, 2561, -583, -583, -583, -583, -583, - -583, -583, 548, -583, 530, 454, -583, -583, 373, 205, - -583, 911, 454, -583, -583, -583, 115, -583, -583, 451, - 535, 403, -583, -583, 2561, 432, -583, -583, -583, 524, - 342, 553, 2561, 2561, 2561, 611, 761, 558, 540, 558, - -583, -583, -583, -583, -583, -583, 246, 61, 509, -583, - -583, 412, 44, -583, -583, 2561, -583, -583, -583, -583, - -583, -583, -583, -583, -583, -583, -583, -583, 264, 430, - 2887, 251, 2909, 561, -3, 2561, -583, 475, 911, 478, - -583, 448, -583, 570, 342, -583, -583, 573, 2561, 556, - 576, 101, 41, 559, 506, -583, -583, -583, -583, 529, - -583, -583, 2561, -583, 435, 2561, 447, 212, 579, -583, - 597, -583, -583, -583, -583, 225, 225, 65, 65, 65, - 65, -583, -583, -583, -583, 291, 98, -583, 440, -583, - -583, -583, 319, 578, -583, -583, 572, 582, 532, 603, - -583, 456, -583, 497, -583, -583, 17, 438, -583, 607, - 2974, -583, 612, 450, 453, 39, 36, -583, -583, 207, - -583, 547, -583, 617, 2561, 193, 2261, -583, -583, -583, - -583, -583, -583, -583, 540, 911, 2561, 911, -583, 2561, - 2561, -583, -583, 57, 66, -583, 2561, -583, 616, 619, - 620, 68, -583, 526, -583, -583, 2561, 621, 45, -583, - -583, -583, 559, 312, 624, 312, 332, -583, 567, -583, - -583, -583, -583, 353, 557, 575, 602, 585, 636, -583, - 2561, 638, 639, 623, -583, -583, -583, -583, -583, 2561, - 641, -583, -583, -583, 17, 454, 2561, 625, 628, 484, - 578, -583, 650, -583, 651, -583, -583, 457, 2561, 642, - -583, -583, -583, -583, -583, -583, -583, -583, -583, -583, - -583, -583, -583, -583, -583, -583, 632, -583, 654, -583, - -583, -583, -583, -583, 1361, -583, -583, 357, 15, 2561, - 287, -583, -583, -583, -583, 558, 250, -583, 657, 412, - 621, -583, 71, 1211, 2561, -583, 655, 2561, 659, 506, - 312, -583, 640, 336, 2561, -583, 643, -583, 559, 559, - 45, 605, -583, 45, 2561, 911, 531, -583, -583, -583, - -583, -583, 536, -583, 663, -583, -583, -583, -583, 342, - -583, -583, 151, -583, 205, 465, 647, -583, -583, 468, - 342, 2561, -583, -583, 519, -583, -583, -583, -583, 33, - -583, -583, -583, -583, -583, -583, 2561, 670, 268, -583, - 2561, -583, -583, -583, -583, -583, -583, -583, -583, -583, - -583, -583, 471, 672, -583, -583, 476, 45, 404, 673, - 456, 623, 610, 648, 610, 2561, -583, -583, 67, -583, - 678, -583, -583, -583, 2561, 523, 2561, -583, 285, 477, - -583, 688, -583, 2561, -583, -583, 527, -583, 911, -583, - 506, 243, -583, -583, -583, -583, 689, -583, 662, 671, - 598, 17, 179, -583, -583, 342, -583, -583, -583, 33, - -583, 479, -583, 456, 527, 452, 312, 623, 704, 1061, - 2711, 454, -583, 703, -583, 563, -583, -583, -583, 706, - 1661, -583, -583, 527, 496, -583, -583, -583, -583, -583, - -583, 707, -583, 2863, 292, -21, -583, 17, -7, -583, - -583, 1811, 577, 574, 584, -583, -583, -57, -583, -583, - 1061, -583, -583, 680, 680, 2711, -583, -583, -583, -583, - -583, -583, 580, 581, -583, -583, 564, -583, 129, -583, - -583, 155, -583, -583, -583, 467, -583, -583, 216, -583, - -583, 1961, -583, -583, -583, -583, 589, 583, -583, -583, - -583, 588, -583, -583, -583, -583, -583 + 667, 76, 79, 89, 92, 74, 148, 161, 191, 146, + 249, -587, -587, -587, -587, -587, -587, -587, 169, -587, + 259, 74, 78, -587, -587, 2412, -587, -587, 268, 2562, + 49, -587, -587, -587, -587, -587, -587, 266, 96, -587, + 109, 268, 88, 268, 295, -587, -587, 1362, 279, -587, + -587, -587, -587, -587, 87, -587, -587, 306, 315, -587, + 326, 332, -587, -587, 341, -587, -587, -587, -587, 2862, + 346, -587, -587, -587, -587, 2112, -587, -587, 2562, 2562, + 2562, 349, 362, -587, -587, -587, -587, 364, -587, -587, + -587, -587, -587, 366, 2862, 2862, 236, 323, -587, 377, + -587, 57, -587, -587, -587, -587, 381, -587, -11, 383, + -587, 251, -587, -587, 385, -587, 395, -587, 399, -587, + -587, -587, -587, -587, 193, 176, 271, -587, -587, -587, + -587, -587, 40, -587, 248, -587, -587, -587, -587, 52, + -587, -587, -587, -587, -587, -587, -587, 343, -587, 367, + -587, -587, 254, 239, 239, 327, -587, -587, -587, 153, + 417, 455, 259, -587, 374, 438, 440, 295, 33, 393, + 487, 489, 491, 37, -587, -587, -587, 2562, 47, 92, + 92, 912, -587, 2562, 912, -587, 280, -587, 410, 254, + -587, -587, -587, 505, 2562, 2562, 92, -587, -587, 45, + -587, 374, 2562, -587, -587, -587, -587, 1512, 92, 508, + 407, 2562, 2562, 545, 2712, 2712, 2712, 2712, 2712, 2712, + 2712, 2712, 2712, -587, 527, 2562, -587, -587, 441, 33, + 33, -587, 33, -587, 2562, -587, -587, -587, -587, -587, + -587, -587, 553, -587, 542, 465, -587, -587, 391, 157, + -587, 912, 465, -587, -587, -587, 240, -587, -587, 393, + 544, 435, -587, -587, 2562, 443, -587, -587, -587, 540, + 254, 568, 2562, 2562, 2562, 612, 762, 571, 552, 571, + -587, -587, -587, -587, -587, -587, 114, 196, 520, -587, + -587, 427, 44, -587, -587, 2562, -587, -587, -587, -587, + -587, -587, -587, -587, -587, -587, -587, -587, 357, 376, + 2888, 163, 2910, 576, -7, 2562, -587, 486, 912, 485, + -587, 410, -587, 580, 254, -587, -587, 581, 2562, 561, + 582, 80, 43, 564, 353, -587, -587, -587, -587, 536, + -587, -587, 2562, -587, 445, 2562, 374, 230, 585, -587, + 587, -587, -587, -587, -587, 193, 193, 176, 176, 176, + 176, -587, -587, -587, -587, 120, 68, -587, 428, -587, + -587, -587, 262, 572, -587, -587, 567, 575, 487, 591, + -587, 451, -587, 438, -587, -587, 33, 448, -587, 597, + 2975, -587, 598, 450, 452, 38, 35, -587, -587, 65, + -587, 539, -587, 605, 2562, 53, 2262, -587, -587, -587, + -587, -587, -587, -587, 552, 912, 2562, 912, -587, 2562, + 2562, -587, -587, 127, 70, -587, 2562, -587, 604, 606, + 611, 75, -587, 526, -587, -587, 2562, 618, 45, -587, + -587, -587, 564, 289, 622, 289, 325, -587, 565, -587, + -587, -587, -587, 276, 555, 569, 593, 583, 625, -587, + 2562, 634, 636, 617, -587, -587, -587, -587, -587, 2562, + 639, -587, -587, -587, 33, 465, 2562, 620, 624, 482, + 572, -587, 646, -587, 645, -587, -587, 462, 2562, 640, + -587, -587, -587, -587, -587, -587, -587, -587, -587, -587, + -587, -587, -587, -587, -587, -587, 629, -587, 652, -587, + -587, -587, -587, -587, 1362, -587, -587, 267, 13, 2562, + 528, -587, -587, -587, -587, 571, 48, -587, 653, 427, + 618, -587, 77, 1212, 2562, -587, 655, 2562, 656, 353, + 289, -587, 633, 295, 2562, -587, 641, -587, 564, 564, + 45, 602, -587, 45, 2562, 912, 529, -587, -587, -587, + -587, -587, 531, -587, 659, -587, -587, -587, -587, 254, + -587, -587, 794, -587, 157, 464, 648, -587, -587, 477, + 254, 2562, -587, -587, 516, -587, -587, -587, -587, 34, + -587, -587, -587, -587, -587, -587, -587, 2562, 666, 242, + -587, 2562, -587, -587, -587, -587, -587, -587, -587, -587, + -587, -587, -587, 479, 670, -587, -587, 436, 45, 238, + 669, 451, 617, 613, 647, 613, 2562, -587, -587, 57, + -587, 671, -587, -587, -587, 2562, 524, 2562, -587, 268, + 481, -587, 679, -587, 2562, -587, -587, 527, -587, 912, + -587, 353, 282, -587, -587, -587, -587, 688, -587, 664, + 663, 608, 33, 201, -587, -587, 254, -587, -587, -587, + 34, -587, 497, -587, 451, 527, 502, 289, 617, 705, + 1062, 2712, 465, -587, 706, -587, 566, -587, -587, -587, + 709, 1662, -587, -587, 527, 549, -587, -587, -587, -587, + -587, -587, 710, -587, 311, 256, -14, -587, 33, 164, + -587, -587, 1812, 584, 573, 588, -587, -587, -56, -587, + -587, 1062, -587, -587, 674, 674, 2712, -587, -587, -587, + -587, -587, -587, 586, 592, -587, -587, 563, -587, 98, + -587, -587, 81, -587, -587, -587, 522, -587, -587, 271, + -587, -587, 1962, -587, -587, -587, -587, 595, 601, -587, + -587, -587, 589, -587, -587, -587, -587, -587 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1262,134 +1262,134 @@ static const yytype_int16 yydefact[] = 0, 25, 0, 0, 79, 107, 0, 0, 0, 2, 4, 63, 6, 62, 59, 60, 90, 61, 64, 26, 0, 107, 0, 80, 81, 0, 109, 108, 0, 0, - 10, 1, 3, 5, 68, 66, 67, 341, 0, 34, - 0, 0, 0, 0, 42, 423, 422, 0, 0, 470, - 206, 203, 204, 205, 436, 241, 238, 0, 0, 218, - 0, 0, 217, 243, 0, 242, 239, 219, 442, 0, - 0, 397, 399, 398, 240, 0, 202, 419, 0, 0, - 0, 0, 0, 272, 273, 276, 277, 0, 325, 326, - 327, 328, 228, 0, 0, 0, 441, 98, 343, 92, - 199, 215, 371, 214, 222, 372, 0, 223, 221, 0, - 376, 279, 263, 264, 0, 265, 0, 266, 0, 374, - 378, 379, 380, 384, 388, 391, 411, 403, 396, 404, - 405, 413, 211, 412, 414, 416, 420, 415, 201, 369, - 438, 373, 375, 445, 446, 447, 216, 0, 441, 0, - 75, 77, 78, 0, 0, 8, 11, 12, 342, 0, + 10, 1, 3, 5, 68, 66, 67, 342, 0, 34, + 0, 0, 0, 0, 42, 424, 423, 0, 0, 471, + 207, 204, 205, 206, 437, 242, 239, 0, 0, 219, + 0, 0, 218, 244, 0, 243, 240, 220, 443, 0, + 0, 398, 400, 399, 241, 0, 203, 420, 0, 0, + 0, 0, 0, 273, 274, 277, 278, 0, 326, 327, + 328, 329, 229, 0, 0, 0, 442, 98, 344, 92, + 200, 216, 372, 215, 223, 373, 0, 224, 222, 0, + 377, 280, 264, 265, 0, 266, 0, 267, 0, 375, + 379, 380, 381, 385, 389, 392, 412, 404, 397, 405, + 406, 414, 212, 413, 415, 417, 421, 416, 202, 370, + 439, 374, 376, 446, 447, 448, 217, 0, 442, 0, + 75, 77, 78, 0, 0, 8, 11, 12, 343, 0, 0, 0, 0, 35, 87, 0, 0, 42, 0, 0, - 0, 0, 0, 0, 469, 437, 440, 0, 79, 79, - 79, 57, 383, 0, 57, 468, 464, 461, 0, 0, - 400, 402, 401, 0, 0, 0, 79, 382, 381, 110, - 89, 87, 0, 209, 210, 208, 207, 0, 79, 0, + 0, 0, 0, 0, 470, 438, 441, 0, 79, 79, + 79, 57, 384, 0, 57, 469, 465, 462, 0, 0, + 401, 403, 402, 0, 0, 0, 79, 383, 382, 110, + 89, 87, 0, 210, 211, 209, 208, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 444, 0, 0, 421, 213, 0, 0, - 0, 443, 0, 74, 0, 15, 16, 17, 20, 21, - 19, 18, 0, 13, 0, 473, 65, 28, 0, 0, - 33, 57, 473, 88, 427, 426, 427, 424, 425, 0, - 436, 0, 39, 70, 0, 0, 198, 197, 377, 0, - 344, 0, 0, 0, 0, 57, 57, 0, 57, 0, - 166, 167, 163, 162, 165, 164, 0, 57, 138, 140, - 142, 144, 0, 131, 150, 0, 151, 175, 176, 157, - 181, 155, 186, 156, 152, 158, 153, 154, 132, 133, - 135, 136, 134, 0, 0, 0, 462, 0, 57, 464, - 450, 0, 261, 0, 467, 408, 466, 0, 0, 111, - 100, 0, 115, 0, 101, 258, 339, 338, 120, 122, - 200, 224, 0, 409, 0, 0, 0, 0, 268, 274, - 0, 260, 385, 386, 387, 389, 390, 394, 395, 392, - 393, 212, 418, 417, 439, 367, 87, 82, 0, 76, - 14, 22, 9, 0, 7, 474, 0, 0, 0, 0, - 29, 121, 69, 0, 71, 43, 0, 0, 196, 0, - 0, 233, 0, 0, 0, 0, 78, 58, 141, 0, - 194, 168, 195, 0, 0, 0, 0, 170, 173, 174, - 180, 185, 188, 189, 57, 57, 0, 57, 161, 0, - 0, 465, 449, 0, 77, 456, 0, 457, 175, 181, - 186, 0, 453, 0, 451, 267, 0, 236, 110, 114, - 113, 116, 0, 471, 434, 105, 429, 430, 0, 246, - 251, 244, 245, 250, 252, 0, 0, 124, 0, 225, - 0, 0, 0, 292, 281, 282, 259, 283, 284, 0, - 0, 275, 368, 370, 0, 473, 0, 0, 0, 478, - 475, 477, 0, 27, 30, 32, 38, 74, 0, 360, - 351, 350, 352, 353, 347, 348, 354, 349, 355, 359, - 345, 346, 356, 357, 358, 361, 364, 365, 0, 234, - 230, 231, 137, 179, 0, 184, 182, 177, 177, 0, - 0, 192, 191, 193, 160, 0, 0, 143, 0, 145, - 236, 463, 161, 57, 0, 448, 0, 0, 0, 102, - 105, 104, 0, 42, 0, 433, 0, 118, 0, 0, - 110, 0, 253, 110, 0, 57, 285, 226, 410, 232, - 280, 294, 295, 293, 269, 271, 83, 86, 84, 85, - 24, 23, 0, 476, 0, 0, 0, 363, 366, 0, - 406, 0, 172, 171, 0, 227, 190, 221, 187, 110, - 127, 129, 126, 128, 139, 130, 0, 0, 0, 455, - 0, 459, 460, 458, 454, 452, 278, 237, 235, 117, - 472, 119, 0, 40, 432, 431, 254, 110, 250, 123, - 125, 0, 44, 0, 44, 0, 481, 482, 480, 479, - 0, 72, 362, 183, 0, 178, 0, 111, 0, 0, - 147, 0, 229, 0, 159, 435, 0, 106, 57, 255, - 256, 0, 248, 257, 249, 290, 286, 288, 0, 0, - 93, 0, 297, 270, 31, 407, 169, 149, 146, 110, - 220, 0, 37, 247, 0, 335, 105, 0, 0, 57, - 0, 473, 94, 296, 300, 329, 308, 307, 309, 0, - 0, 148, 41, 0, 0, 336, 337, 334, 428, 287, - 289, 45, 46, 50, 50, 95, 99, 0, 0, 301, - 291, 0, 0, 0, 302, 310, 311, 0, 36, 340, - 57, 51, 52, 53, 53, 0, 97, 299, 331, 332, - 333, 330, 0, 0, 317, 320, 0, 319, 0, 312, - 314, 0, 298, 313, 47, 0, 49, 48, 96, 321, - 318, 0, 324, 315, 304, 305, 0, 0, 55, 56, - 54, 0, 322, 316, 306, 303, 323 + 0, 0, 0, 445, 0, 0, 422, 214, 0, 0, + 0, 444, 0, 74, 0, 15, 16, 17, 20, 21, + 19, 18, 0, 13, 0, 474, 65, 28, 0, 0, + 33, 57, 474, 88, 428, 427, 428, 425, 426, 0, + 437, 0, 39, 70, 0, 0, 199, 198, 378, 0, + 345, 0, 0, 0, 0, 57, 57, 0, 57, 0, + 167, 168, 164, 163, 166, 165, 0, 57, 138, 141, + 143, 145, 0, 131, 151, 0, 152, 176, 177, 158, + 182, 156, 187, 157, 153, 159, 154, 155, 132, 133, + 135, 136, 134, 0, 0, 0, 463, 0, 57, 465, + 451, 0, 262, 0, 468, 409, 467, 0, 0, 111, + 100, 0, 115, 0, 101, 259, 340, 339, 120, 122, + 201, 225, 0, 410, 0, 0, 0, 0, 269, 275, + 0, 261, 386, 387, 388, 390, 391, 395, 396, 393, + 394, 213, 419, 418, 440, 368, 87, 82, 0, 76, + 14, 22, 9, 0, 7, 475, 0, 0, 0, 0, + 29, 121, 69, 0, 71, 43, 0, 0, 197, 0, + 0, 234, 0, 0, 0, 0, 78, 58, 142, 0, + 195, 169, 196, 0, 0, 0, 0, 171, 174, 175, + 181, 186, 189, 190, 57, 57, 0, 57, 162, 0, + 0, 466, 450, 0, 77, 457, 0, 458, 176, 182, + 187, 0, 454, 0, 452, 268, 0, 237, 110, 114, + 113, 116, 0, 472, 435, 105, 430, 431, 0, 247, + 252, 245, 246, 251, 253, 0, 0, 124, 0, 226, + 0, 0, 0, 293, 282, 283, 260, 284, 285, 0, + 0, 276, 369, 371, 0, 474, 0, 0, 0, 479, + 476, 478, 0, 27, 30, 32, 38, 74, 0, 361, + 352, 351, 353, 354, 348, 349, 355, 350, 356, 360, + 346, 347, 357, 358, 359, 362, 365, 366, 0, 235, + 231, 232, 137, 180, 0, 185, 183, 178, 178, 0, + 0, 193, 192, 194, 161, 0, 0, 144, 0, 146, + 237, 464, 162, 57, 0, 449, 0, 0, 0, 102, + 105, 104, 0, 42, 0, 434, 0, 118, 0, 0, + 110, 0, 254, 110, 0, 57, 286, 227, 411, 233, + 281, 295, 296, 294, 270, 272, 83, 86, 84, 85, + 24, 23, 0, 477, 0, 0, 0, 364, 367, 0, + 407, 0, 173, 172, 0, 228, 191, 222, 188, 110, + 127, 129, 126, 128, 139, 130, 140, 0, 0, 0, + 456, 0, 460, 461, 459, 455, 453, 279, 238, 236, + 117, 473, 119, 0, 40, 433, 432, 255, 110, 251, + 123, 125, 0, 44, 0, 44, 0, 482, 483, 481, + 480, 0, 72, 363, 184, 0, 179, 0, 111, 0, + 0, 148, 0, 230, 0, 160, 436, 0, 106, 57, + 256, 257, 0, 249, 258, 250, 291, 287, 289, 0, + 0, 93, 0, 298, 271, 31, 408, 170, 150, 147, + 110, 221, 0, 37, 248, 0, 336, 105, 0, 0, + 57, 0, 474, 94, 297, 301, 330, 309, 308, 310, + 0, 0, 149, 41, 0, 0, 337, 338, 335, 429, + 288, 290, 45, 46, 50, 50, 95, 99, 0, 0, + 302, 292, 0, 0, 0, 303, 311, 312, 0, 36, + 341, 57, 51, 52, 53, 53, 0, 97, 300, 332, + 333, 334, 331, 0, 0, 318, 321, 0, 320, 0, + 313, 315, 0, 299, 314, 47, 0, 49, 48, 96, + 322, 319, 0, 325, 316, 305, 306, 0, 0, 55, + 56, 54, 0, 323, 317, 307, 304, 324 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -583, -583, -583, -583, -583, -583, -583, -583, 569, -583, - -583, -583, 147, 565, -583, 728, 58, -583, -583, -147, - 117, -583, 20, 40, 18, -583, -257, -583, 5, -583, - -583, -583, 365, -97, -248, -23, -74, 162, -583, 271, - -583, -583, -162, -583, -583, -583, -583, -583, -583, -583, - -583, 303, -484, 726, -583, -493, 416, -400, 405, -583, - -583, 177, -583, 474, 337, 340, -168, -583, -583, 89, - -582, -583, -583, -258, 473, -583, -253, 481, -583, 245, - -251, -583, -583, -250, -583, -583, -583, -583, -583, -583, - -583, -583, -252, -583, 586, 189, -583, -153, -583, -583, - -170, -583, -583, 258, 235, -583, -583, 148, -583, 333, - -583, -583, -583, -583, -583, -583, -583, -583, -583, -583, - -583, -583, -583, -277, -583, -583, -583, -583, 110, -583, - 111, -583, -583, -583, -583, -583, 83, -583, -583, -583, - -583, -583, -583, 42, -583, -583, -583, -583, -583, -583, - -583, -583, -583, -583, -583, -149, -583, -583, -583, -583, - -583, -583, -583, -583, 392, 183, 133, 289, 227, -580, - -583, -583, -583, -583, -583, 238, -148, -255, -25, -71, - -583, -583, -583, 571, 614, -26, -583, 637, 633, -583, - -409, -583, -30, -583, -583, 587, 590, -158, -129, -583, - -583, -583, -583, -583, 486, -583, 269, 618, -128, 489, - -291, -583, -583, -583, -583, -240, -583, -583, 324, -583 + -587, -587, -587, -587, -587, -587, -587, -587, 574, -587, + -587, -587, 149, 560, -587, 729, 69, -587, -587, -154, + 118, -587, 24, 41, 22, -587, -251, -587, 3, -587, + -587, -587, 370, -86, -239, -23, -74, 168, -587, 277, + -587, -587, -163, -587, -587, -587, -587, -587, -587, -587, + -587, 307, -484, 732, -587, -504, 426, -404, 413, -587, + -587, 189, -587, 488, 347, 350, -162, -587, -587, 117, + -584, -587, -587, -271, 492, -587, -259, 501, -587, 272, + -255, -587, -587, -252, -587, -587, -587, -587, -587, -587, + -587, -587, -248, -587, 596, 194, -587, -151, -587, -587, + -170, -587, -587, 269, 261, -587, -587, 174, -587, 351, + -587, -587, -587, -587, -587, -587, -587, -587, -587, -587, + -587, -587, -587, -279, -587, -587, -587, -587, 116, -587, + 121, -587, -587, -587, -587, -587, 91, -587, -587, -587, + -587, -587, -587, 51, -587, -587, -587, -587, -587, -587, + -587, -587, -587, -587, -587, -144, -587, -587, -587, -587, + -587, -587, -587, -587, 401, 129, 192, 345, 224, -586, + -587, -587, -587, -587, -587, 252, -150, -253, -25, -71, + -587, -587, -587, 579, 626, -26, -587, 642, 654, -587, + -418, -587, 16, -587, -587, 590, 594, -158, -127, -587, + -587, -587, -587, -587, 496, -587, 291, 637, -116, 503, + -297, -587, -587, -587, -587, -240, -587, -587, 330, -587 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { 0, 8, 9, 10, 245, 155, 156, 157, 242, 372, - 20, 248, 379, 39, 40, 171, 671, 261, 647, 169, - 660, 701, 702, 723, 746, 760, 286, 12, 172, 37, + 20, 248, 379, 39, 40, 171, 672, 261, 648, 169, + 661, 702, 703, 724, 747, 761, 286, 12, 172, 37, 14, 15, 265, 16, 149, 287, 151, 25, 366, 367, - 568, 17, 252, 18, 97, 681, 726, 682, 200, 201, + 568, 17, 252, 18, 97, 682, 727, 683, 200, 201, 330, 546, 547, 28, 331, 332, 333, 334, 253, 457, - 556, 594, 288, 289, 290, 291, 314, 595, 639, 640, + 556, 594, 288, 289, 290, 291, 314, 595, 640, 641, 293, 425, 294, 295, 427, 296, 297, 298, 299, 582, 300, 301, 515, 302, 303, 412, 304, 305, 413, 525, 306, 307, 98, 99, 100, 101, 226, 102, 103, 104, - 105, 106, 107, 108, 538, 109, 454, 649, 653, 455, + 105, 106, 107, 108, 538, 109, 454, 650, 654, 455, 335, 336, 110, 111, 112, 470, 113, 114, 348, 115, - 116, 117, 210, 655, 466, 467, 622, 656, 657, 658, - 468, 562, 563, 624, 689, 683, 684, 742, 690, 714, - 715, 734, 716, 735, 736, 763, 737, 118, 709, 731, - 337, 697, 338, 654, 159, 119, 269, 505, 506, 507, + 116, 117, 210, 656, 466, 467, 623, 657, 658, 659, + 468, 562, 563, 625, 690, 684, 685, 743, 691, 715, + 716, 735, 717, 736, 737, 764, 738, 118, 710, 732, + 337, 698, 338, 655, 159, 119, 269, 505, 506, 507, 508, 120, 473, 231, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 579, 343, 344, 324, 133, - 134, 135, 136, 137, 138, 44, 45, 46, 258, 675, - 445, 446, 447, 545, 176, 139, 140, 141, 672, 142, + 134, 135, 136, 137, 138, 44, 45, 46, 258, 676, + 445, 446, 447, 545, 176, 139, 140, 141, 673, 142, 143, 144, 145, 319, 320, 431, 432, 186, 187, 317, - 325, 326, 188, 146, 543, 374, 375, 480, 481, 629 + 325, 326, 188, 146, 543, 374, 375, 480, 481, 630 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1397,630 +1397,630 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 132, 185, 147, 227, 152, 13, 150, 190, 191, 192, - 262, 309, 382, 292, 309, 164, 387, 167, 393, 394, - 259, 401, 173, 312, 421, 400, 312, 402, 308, 406, - 405, 308, 310, 540, 408, 310, 410, 411, 539, 339, - 268, 260, 268, 512, 399, 163, 323, 327, -112, 416, - 152, 153, 223, 189, 189, 189, 609, -112, 316, 224, - 426, 423, 581, 349, 350, 428, 229, 429, 430, -112, - 465, -455, 263, 533, 368, 23, -159, 743, 42, 725, - 443, 309, 34, 381, 397, 235, 236, 203, 237, 204, - 24, 519, 420, 312, 35, 361, 638, 704, 308, 162, - 705, 165, 310, 474, 68, 309, 309, 395, 166, 728, - 225, 26, 403, 36, 238, 19, 160, 312, 312, 404, - 278, 165, 308, 308, 392, 528, 310, 310, 383, 531, - 439, 21, 239, 22, 219, 220, 221, 222, 704, -91, - 729, 730, 240, -91, 161, 748, -91, 29, 309, 417, - 616, 516, 270, 618, 589, 43, 311, 526, 132, 311, - 312, -455, 384, 534, 246, 308, -159, 30, 4, 310, - 50, 51, 52, 53, 205, 626, 638, 132, 241, 6, - 437, 206, -412, 27, 251, 148, 561, -91, -136, -136, - -91, 417, 698, 316, 458, 225, 417, 461, 637, -91, - 362, 590, 440, 225, 475, 225, 441, 230, 754, 152, - 329, 369, 154, 32, 271, 463, -227, 650, -91, 591, - 280, 281, 282, 283, 284, 285, 311, 519, 486, 592, - 217, 218, 593, 31, 1, 567, 464, -262, 175, 152, - 575, 150, 676, 605, 424, 309, 674, 309, 403, 4, - 396, 311, 182, 589, 380, 404, -78, 312, 76, 312, - 6, 752, 308, 753, 308, -262, 310, 444, 310, 23, - 152, 530, 418, 588, -78, 600, 598, 197, 198, 4, - 601, 4, 602, 603, 24, -78, 755, -371, 536, 612, - 378, 33, 170, 311, 756, 757, 225, 520, -371, 472, - 590, 403, 519, 38, 229, 641, -78, 1, 404, 42, - -78, 585, 558, -78, 686, 687, 368, 55, 591, -371, - 56, 564, 2, 403, 721, 477, -371, 58, 592, 688, - 643, 593, 478, 518, 158, 722, -103, 3, 548, 168, - 272, 273, 274, 541, 174, 549, -78, 352, 353, 354, - 586, 177, 60, 61, 4, -78, 63, 178, 328, 179, - 64, 180, 5, 65, 66, 6, 233, 234, -371, 342, - 345, 219, 220, 221, 222, 181, 70, 376, 377, 189, - 74, 152, 7, 524, 183, 309, 193, 620, 194, 607, - 311, 195, 311, 214, 215, 216, 611, 312, 184, 315, - 196, 152, 308, 532, 581, 449, 310, 385, 386, 450, - -78, -78, -78, -78, -78, -78, 451, 452, 225, -371, - -371, -371, -371, -371, -371, -371, -371, -371, -371, -371, - -371, -371, -371, -371, -371, 92, 388, 389, 93, 459, - 460, 706, 487, 234, 199, 448, 357, 358, 359, 360, - 202, 569, 207, -372, 510, 460, 449, 511, 460, 599, - 450, -73, -73, 152, -372, 150, 208, 451, 452, 631, - 234, 453, 633, 634, 648, 645, 460, 663, 309, 209, - 673, 668, 669, 692, 693, -372, 211, 651, 212, 580, - 312, 213, -372, 228, 152, 308, 584, 695, 696, 310, - 719, 693, 232, 685, 758, 759, 355, 356, 152, 225, - 635, 244, -379, -379, -379, -379, 247, 448, 614, 615, - 249, 254, -379, -379, -379, -379, -379, -379, 449, 580, - 311, 256, 450, 251, -372, 264, 6, -250, 266, 451, - 452, 267, 322, 453, 346, 318, 648, 448, 351, 685, - 347, 223, 370, 77, 371, 390, 189, 391, 449, 373, - 175, 399, 450, 397, 718, 415, 419, -250, 414, 451, - 452, 422, 518, 453, 435, 152, 315, 644, 436, 380, - -116, 438, 456, 444, 469, -372, -372, -372, -372, -372, - -372, -372, -372, -372, -372, -372, -372, -372, -372, -372, - -372, 471, 479, 482, 476, 703, 483, 485, 417, 665, - 488, 152, 667, 666, 275, 513, 509, 48, 189, 49, - 514, -459, 535, 311, -460, -458, 537, 544, 550, 552, - 50, 51, 52, 53, 276, 54, 553, 554, 1, 555, - 557, 55, 559, 560, 56, 565, 703, 464, 572, 570, - 57, 58, 571, 574, 152, 576, 389, 577, 578, 606, - 277, 59, 596, 608, 610, 717, 617, 613, 625, 621, - 278, 632, 636, 623, 642, 646, 60, 61, 634, 62, - 63, 659, 664, 661, 64, 4, 738, 65, 66, 67, - -412, 279, 670, 678, 677, 152, 170, 680, 68, 69, - 70, 71, 72, 73, 74, 75, 679, 463, 707, 708, - 710, 739, 720, 741, 749, 740, 745, 751, 76, 764, - 766, 630, 750, 243, 765, 77, 738, 250, 11, 78, - 79, 80, 694, 81, 82, 83, 84, 85, 86, 87, - 744, 662, 747, 484, 724, 566, 542, 41, 442, 627, - 398, 462, 527, 88, 89, 90, 91, 529, 691, 92, - 407, 628, 93, 583, 275, 597, 652, 48, 409, 49, - 280, 281, 282, 283, 284, 285, 94, 95, 587, 148, - 50, 51, 52, 53, 397, 54, 551, 699, 340, 700, - 727, 55, 619, 762, 56, -58, 517, 313, 255, 363, - 57, 58, 604, 257, 573, 0, 321, 434, 433, 0, - 277, 59, 0, 0, 0, 0, 0, 365, 0, 364, - 278, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 279, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, + 132, 185, 147, 13, 152, 227, 150, 190, 191, 192, + 262, 309, 382, 259, 309, 164, 406, 167, 421, 292, + 393, 394, 173, 312, 540, 387, 312, 401, 408, 400, + 308, 402, 410, 308, 539, 411, 405, 310, 339, 268, + 310, 268, 512, 163, 323, 327, 399, 426, -112, 416, + 152, 589, 153, 189, 189, 189, 610, 260, -112, 428, + 581, 349, 350, 429, 223, 229, 430, 423, 465, -112, + 316, 224, 260, 474, 368, -456, 23, 203, 744, 204, + 533, 309, -160, 263, 443, 639, 726, 519, 420, 381, + -228, 24, 1, 312, 165, 706, 705, 361, 590, 160, + 308, 166, 42, 26, 19, 309, 309, 310, 403, 439, + -263, 225, 175, 395, 162, 404, 591, 312, 312, 528, + 68, 23, 392, 531, 308, 308, 592, 161, 472, 593, + 21, 310, 310, 229, 755, 68, 24, 705, -263, 4, + 749, 219, 220, 221, 222, 417, 617, 22, 309, 619, + 170, 29, 270, 32, 251, 516, 311, 520, 132, 311, + 312, 519, 246, 526, 205, -456, 639, 308, -78, 403, + 534, 206, -160, 384, 310, 27, 404, 132, 437, 43, + -413, 440, 403, 4, 561, 30, -78, -136, -136, 404, + 417, 31, 458, 699, 6, 461, 417, -78, 182, 638, + 362, 148, 225, 475, 225, 316, 230, 225, 441, 152, + 329, 369, 756, 154, 651, 271, 148, 34, -78, 397, + 757, 758, -78, 197, 198, -78, 311, 4, 486, 35, + 753, 4, 754, 463, 677, 567, -91, 606, 6, 152, + -91, 150, 378, -91, 424, 309, 165, 309, 36, 575, + 396, 311, 380, 383, 464, 278, 33, 312, -78, 312, + 235, 236, 601, 237, 308, 225, 308, -78, 477, 530, + 152, 310, 418, 310, 602, 478, 519, 588, 603, 448, + 729, 604, 599, 38, -91, 675, 536, -91, 722, 238, + 449, 613, 42, 311, 450, 158, -91, 403, 168, 723, + 642, 451, 452, 174, 644, 453, 444, 239, 649, 177, + 558, 730, 731, -103, 581, -91, 368, 240, 178, 564, + 541, 652, -78, -78, -78, -78, -78, -78, 449, 179, + 225, 548, 450, 518, -77, 180, 687, 688, 549, 451, + 452, 217, 218, 722, 181, -77, 272, 273, 274, 183, + 586, 689, 193, 241, 723, 280, 281, 282, 283, 284, + 285, 214, 215, 216, 328, 194, -77, 195, 596, 196, + -77, 233, 234, -77, 199, 342, 345, 184, 315, 189, + -372, 152, 202, 524, 207, 309, 208, 608, 211, 612, + 311, -372, 311, 621, 448, 376, 377, 312, 212, -373, + 209, 152, 213, 532, 308, 449, 352, 353, 354, 450, + -373, 310, -372, 228, -251, -77, 451, 452, 232, -372, + 453, 225, -380, -380, -380, -380, 219, 220, 221, 222, + 244, -373, -380, -380, -380, -380, -380, -380, -373, 385, + 386, 247, 707, 357, 358, 359, 360, 388, 389, 459, + 460, 569, 487, 234, 510, 460, 511, 460, 249, 600, + 251, -372, 254, 152, 256, 150, -73, -73, 632, 234, + -77, -77, -77, -77, -77, -77, 664, 448, 6, 309, + -373, 634, 635, 646, 460, 669, 670, 674, 449, 580, + 264, 312, 450, 266, 152, 267, 584, -251, 308, 451, + 452, 693, 694, 453, 686, 310, 649, 318, 152, 322, + 636, 346, -372, -372, -372, -372, -372, -372, -372, -372, + -372, -372, -372, -372, -372, -372, -372, -372, 347, 580, + 311, -373, -373, -373, -373, -373, -373, -373, -373, -373, + -373, -373, -373, -373, -373, -373, -373, 696, 697, 351, + 686, 223, 585, 720, 694, 77, 189, 370, 55, 759, + 760, 56, 355, 356, 615, 616, 371, 719, 58, 175, + 373, 390, 391, 518, 399, 397, 152, 380, 645, 414, + 415, 419, 422, 315, 435, -116, 436, 438, 444, 456, + 469, 471, 476, 60, 61, 485, 479, 63, 482, 483, + 488, 64, 509, 417, 65, 66, 704, 513, 514, -460, + 666, -461, 152, 668, 667, 275, -459, 70, 48, 189, + 49, 74, 535, 537, 311, 544, 550, 552, 554, 557, + 553, 50, 51, 52, 53, 276, 54, 555, 559, 1, + 560, 464, 55, 565, 570, 56, 572, 704, 571, 574, + 389, 57, 58, 576, 577, 152, 578, 611, 597, 607, + 609, 277, 59, 618, 626, 614, 718, 622, 624, 637, + 643, 278, 633, 647, 635, 665, 92, 60, 61, 93, + 62, 63, 662, 671, 660, 64, 4, 739, 65, 66, + 67, -413, 279, 678, 1, 679, 152, 170, 680, 68, + 69, 70, 71, 72, 73, 74, 75, 681, 463, 2, + 746, 708, 709, 711, 741, 721, 752, 742, 740, 76, + 750, 767, 250, 631, 3, 765, 77, 739, 243, 11, + 78, 79, 80, 751, 81, 82, 83, 84, 85, 86, + 87, 4, 766, 663, 695, 745, 725, 748, 484, 5, + 542, 566, 6, 41, 88, 89, 90, 91, 442, 462, + 92, 628, 527, 93, 398, 275, 629, 529, 48, 7, + 49, 280, 281, 282, 283, 284, 285, 94, 95, 407, + 148, 50, 51, 52, 53, 397, 54, 692, 409, 587, + 583, 598, 55, 653, 700, 56, -58, 589, 340, 728, + 701, 57, 58, 763, 551, 517, 620, 363, 257, 313, + 573, 277, 59, 50, 51, 52, 53, 434, 627, 255, + 365, 278, 433, 364, 605, 321, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 279, 0, 590, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 591, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 592, 0, 0, 593, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 76, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 275, 0, 0, 48, 0, + 49, 280, 281, 282, 283, 284, 285, 94, 95, 0, + 148, 50, 51, 52, 53, 276, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 277, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 279, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 280, 281, 282, 283, 284, 285, 94, 95, 0, + 148, 50, 51, 52, 53, 397, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 277, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 279, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 280, 281, 282, 283, 284, 285, 94, 95, 0, + 148, 50, 51, 52, 53, 397, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 278, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 280, 281, 282, 283, 284, 285, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 1, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 4, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 170, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 341, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 23, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 24, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 712, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 713, 0, 0, 0, 0, + 0, 0, 714, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 733, 0, 0, 0, 0, + 0, 0, 734, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 762, 0, 0, 0, 0, + 0, 0, 734, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 521, 522, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 523, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 96, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 0, 0, 0, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 275, 0, 0, 48, 0, 49, - 280, 281, 282, 283, 284, 285, 94, 95, 0, 148, - 50, 51, 52, 53, 276, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 277, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 279, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, + 0, 0, 0, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, -375, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -375, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, -374, 0, 64, 0, 0, 65, 66, + 67, 0, 0, -375, -374, 0, 0, 0, 0, 68, + -375, 70, 0, 0, 0, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, -374, 0, 0, 0, 76, + 0, 0, -374, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 81, 82, 83, 84, 85, 86, + 87, 0, -375, 0, 0, 0, 0, 0, 0, 489, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, -374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 280, 281, 282, 283, 284, 285, 94, 95, 0, 148, - 50, 51, 52, 53, 397, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 277, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 279, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 280, 281, 282, 283, 284, 285, 94, 95, 0, 148, - 50, 51, 52, 53, 397, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 280, 281, 282, 283, 284, 285, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 1, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 4, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 170, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 341, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 23, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 24, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 711, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 712, 0, 0, 0, 0, 0, - 0, 713, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 732, 0, 0, 0, 0, 0, - 0, 733, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 761, 0, 0, 0, 0, 0, - 0, 733, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 184, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 521, 522, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 523, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 96, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, - 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, - 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, - 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, - 63, 0, 0, 0, 64, 0, 0, 65, 66, 67, - 0, 0, 0, 0, 0, 0, 0, 0, 68, 69, - 70, 0, 0, 0, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 81, 82, 83, 84, 85, 86, 87, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, - 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, - 50, 51, 52, 53, 0, 54, -77, 0, 0, 0, - 0, 55, 0, 0, 56, 721, 0, -77, 0, 0, - 57, 58, 0, 0, 0, 0, 722, 0, 0, 0, - -374, 59, 0, 0, 0, 0, 0, 0, -77, 0, - 0, -374, -77, 0, 0, -77, 60, 61, 0, 62, - 63, 0, -373, 0, 64, 0, 0, 65, 66, 67, - 0, 0, -374, -373, 0, 0, 0, 0, 68, -374, - 70, 0, 0, 0, 74, 75, 0, 0, 0, 0, - 0, 0, 0, 0, -373, 0, 0, -77, 76, 0, - 0, -373, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 81, 82, 83, 84, 85, 86, 87, - 0, -374, 0, 0, 0, 0, 0, 0, 489, 0, - 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, - 0, 0, 93, -373, 0, 0, 0, 0, 0, 0, - 0, 0, -77, -77, -77, -77, -77, -77, 0, 148, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -374, -374, -374, -374, -374, -374, -374, -374, - -374, -374, -374, -374, -374, -374, -374, -374, 0, 0, - 0, 0, 0, 0, -373, -373, -373, -373, -373, -373, - -373, -373, -373, -373, -373, -373, -373, -373, -373, -373, - 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504 + 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -375, -375, -375, -375, -375, -375, -375, + -375, -375, -375, -375, -375, -375, -375, -375, -375, 0, + 0, 0, 0, 0, 0, -374, -374, -374, -374, -374, + -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, + -374, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504 }; static const yytype_int16 yycheck[] = { - 25, 75, 28, 132, 29, 0, 29, 78, 79, 80, - 168, 181, 252, 181, 184, 41, 264, 43, 273, 274, - 167, 278, 47, 181, 315, 277, 184, 279, 181, 287, - 287, 184, 181, 442, 287, 184, 287, 287, 438, 201, - 4, 24, 4, 4, 3, 40, 194, 195, 3, 5, - 75, 3, 24, 78, 79, 80, 540, 24, 186, 31, - 318, 318, 47, 211, 212, 318, 13, 318, 318, 24, - 347, 5, 169, 5, 232, 29, 5, 134, 24, 100, - 332, 251, 48, 251, 23, 21, 22, 20, 24, 22, - 44, 34, 95, 251, 60, 224, 589, 679, 251, 5, - 680, 6, 251, 5, 87, 275, 276, 275, 13, 116, - 167, 29, 55, 79, 50, 28, 3, 275, 276, 62, - 59, 6, 275, 276, 272, 416, 275, 276, 13, 420, - 29, 51, 68, 58, 155, 156, 157, 158, 720, 0, - 147, 148, 78, 4, 31, 725, 7, 3, 318, 152, - 550, 403, 177, 553, 3, 101, 181, 414, 183, 184, - 318, 95, 259, 95, 159, 318, 95, 24, 74, 318, - 19, 20, 21, 22, 107, 24, 669, 202, 114, 85, - 328, 114, 167, 101, 86, 168, 463, 48, 152, 153, - 51, 152, 676, 321, 342, 167, 152, 345, 165, 60, - 225, 50, 101, 167, 366, 167, 165, 154, 53, 234, - 165, 234, 164, 7, 168, 3, 3, 617, 79, 68, - 159, 160, 161, 162, 163, 164, 251, 34, 386, 78, - 165, 166, 81, 0, 27, 475, 24, 121, 25, 264, - 488, 264, 651, 534, 318, 415, 3, 417, 55, 74, - 275, 276, 69, 3, 249, 62, 5, 415, 107, 417, - 85, 132, 415, 134, 417, 149, 415, 24, 417, 29, - 295, 419, 295, 525, 23, 533, 533, 94, 95, 74, - 533, 74, 533, 533, 44, 34, 131, 23, 436, 544, - 85, 7, 85, 318, 139, 140, 167, 104, 34, 8, - 50, 55, 34, 24, 13, 596, 55, 27, 62, 24, - 59, 24, 460, 62, 135, 136, 474, 30, 68, 55, - 33, 469, 42, 55, 32, 6, 62, 40, 78, 150, - 62, 81, 13, 404, 29, 43, 24, 57, 6, 3, - 178, 179, 180, 31, 24, 13, 95, 214, 215, 216, - 520, 3, 65, 66, 74, 104, 69, 3, 196, 3, - 73, 3, 82, 76, 77, 85, 4, 5, 104, 207, - 208, 155, 156, 157, 158, 3, 89, 4, 5, 404, - 93, 406, 102, 406, 3, 555, 3, 555, 3, 537, - 415, 3, 417, 168, 169, 170, 543, 555, 97, 98, - 3, 426, 555, 426, 47, 52, 555, 4, 5, 56, - 159, 160, 161, 162, 163, 164, 63, 64, 167, 155, - 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 148, 4, 5, 151, 4, - 5, 681, 4, 5, 51, 41, 219, 220, 221, 222, - 5, 476, 3, 23, 4, 5, 52, 4, 5, 533, - 56, 4, 5, 488, 34, 488, 3, 63, 64, 4, - 5, 67, 4, 5, 70, 4, 5, 625, 648, 149, - 648, 4, 5, 4, 5, 55, 3, 83, 3, 514, - 648, 3, 62, 165, 519, 648, 519, 45, 46, 648, - 4, 5, 75, 661, 37, 38, 217, 218, 533, 167, - 581, 103, 155, 156, 157, 158, 24, 41, 548, 549, - 3, 24, 165, 166, 167, 168, 169, 170, 52, 554, - 555, 24, 56, 86, 104, 3, 85, 61, 4, 63, - 64, 4, 4, 67, 3, 97, 70, 41, 4, 707, - 121, 24, 4, 114, 24, 31, 581, 4, 52, 105, - 25, 3, 56, 23, 693, 153, 5, 61, 59, 63, - 64, 96, 643, 67, 4, 600, 98, 600, 5, 574, - 24, 5, 53, 24, 5, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 4, 24, 31, 164, 679, 24, 4, 152, 634, - 3, 636, 638, 636, 3, 68, 4, 6, 643, 8, - 3, 5, 96, 648, 5, 5, 5, 3, 61, 72, - 19, 20, 21, 22, 23, 24, 61, 35, 27, 54, - 4, 30, 4, 4, 33, 4, 720, 24, 164, 24, - 39, 40, 24, 3, 679, 13, 5, 25, 4, 4, - 49, 50, 5, 4, 24, 690, 61, 24, 5, 138, - 59, 24, 153, 137, 4, 3, 65, 66, 5, 68, - 69, 71, 4, 35, 73, 74, 711, 76, 77, 78, - 167, 80, 4, 31, 5, 720, 85, 99, 87, 88, - 89, 90, 91, 92, 93, 94, 35, 3, 5, 146, - 4, 134, 5, 129, 134, 141, 36, 153, 107, 130, - 132, 574, 141, 154, 141, 114, 751, 162, 0, 118, - 119, 120, 674, 122, 123, 124, 125, 126, 127, 128, - 720, 624, 724, 378, 704, 474, 443, 21, 332, 572, - 276, 346, 415, 142, 143, 144, 145, 417, 669, 148, - 287, 572, 151, 518, 3, 530, 618, 6, 287, 8, - 159, 160, 161, 162, 163, 164, 165, 166, 520, 168, - 19, 20, 21, 22, 23, 24, 453, 677, 202, 678, - 707, 30, 554, 751, 33, 34, 404, 183, 165, 228, - 39, 40, 533, 166, 480, -1, 188, 321, 319, -1, - 49, 50, -1, -1, -1, -1, -1, 230, -1, 229, - 59, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, 80, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - 159, 160, 161, 162, 163, 164, 165, 166, -1, 168, - 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - 49, 50, -1, -1, -1, -1, -1, -1, -1, -1, - 59, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, 80, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - 159, 160, 161, 162, 163, 164, 165, 166, -1, 168, - 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - 49, 50, -1, -1, -1, -1, -1, -1, -1, -1, - 59, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, 80, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - 159, 160, 161, 162, 163, 164, 165, 166, -1, 168, - 19, 20, 21, 22, 23, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - 59, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - 159, 160, 161, 162, 163, 164, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, 27, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, 74, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, 85, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, 4, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - 29, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, 44, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, + 25, 75, 28, 0, 29, 132, 29, 78, 79, 80, + 168, 181, 252, 167, 184, 41, 287, 43, 315, 181, + 273, 274, 47, 181, 442, 264, 184, 278, 287, 277, + 181, 279, 287, 184, 438, 287, 287, 181, 201, 4, + 184, 4, 4, 40, 194, 195, 3, 318, 3, 5, + 75, 3, 3, 78, 79, 80, 540, 24, 24, 318, + 47, 211, 212, 318, 24, 13, 318, 318, 347, 24, + 186, 31, 24, 5, 232, 5, 29, 20, 134, 22, + 5, 251, 5, 169, 332, 589, 100, 34, 95, 251, + 3, 44, 27, 251, 6, 681, 680, 224, 50, 3, + 251, 13, 24, 29, 28, 275, 276, 251, 55, 29, + 121, 167, 25, 275, 5, 62, 68, 275, 276, 416, + 87, 29, 272, 420, 275, 276, 78, 31, 8, 81, + 51, 275, 276, 13, 53, 87, 44, 721, 149, 74, + 726, 155, 156, 157, 158, 152, 550, 58, 318, 553, + 85, 3, 177, 7, 86, 403, 181, 104, 183, 184, + 318, 34, 159, 414, 107, 95, 670, 318, 5, 55, + 95, 114, 95, 259, 318, 101, 62, 202, 328, 101, + 167, 101, 55, 74, 463, 24, 23, 152, 153, 62, + 152, 0, 342, 677, 85, 345, 152, 34, 69, 165, + 225, 168, 167, 366, 167, 321, 154, 167, 165, 234, + 165, 234, 131, 164, 618, 168, 168, 48, 55, 23, + 139, 140, 59, 94, 95, 62, 251, 74, 386, 60, + 132, 74, 134, 3, 652, 475, 0, 534, 85, 264, + 4, 264, 85, 7, 318, 415, 6, 417, 79, 488, + 275, 276, 249, 13, 24, 59, 7, 415, 95, 417, + 21, 22, 533, 24, 415, 167, 417, 104, 6, 419, + 295, 415, 295, 417, 533, 13, 34, 525, 533, 41, + 116, 533, 533, 24, 48, 3, 436, 51, 32, 50, + 52, 544, 24, 318, 56, 29, 60, 55, 3, 43, + 597, 63, 64, 24, 62, 67, 24, 68, 70, 3, + 460, 147, 148, 24, 47, 79, 474, 78, 3, 469, + 31, 83, 159, 160, 161, 162, 163, 164, 52, 3, + 167, 6, 56, 404, 23, 3, 135, 136, 13, 63, + 64, 165, 166, 32, 3, 34, 178, 179, 180, 3, + 520, 150, 3, 114, 43, 159, 160, 161, 162, 163, + 164, 168, 169, 170, 196, 3, 55, 3, 526, 3, + 59, 4, 5, 62, 51, 207, 208, 97, 98, 404, + 23, 406, 5, 406, 3, 555, 3, 537, 3, 543, + 415, 34, 417, 555, 41, 4, 5, 555, 3, 23, + 149, 426, 3, 426, 555, 52, 214, 215, 216, 56, + 34, 555, 55, 165, 61, 104, 63, 64, 75, 62, + 67, 167, 155, 156, 157, 158, 155, 156, 157, 158, + 103, 55, 165, 166, 167, 168, 169, 170, 62, 4, + 5, 24, 682, 219, 220, 221, 222, 4, 5, 4, + 5, 476, 4, 5, 4, 5, 4, 5, 3, 533, + 86, 104, 24, 488, 24, 488, 4, 5, 4, 5, + 159, 160, 161, 162, 163, 164, 626, 41, 85, 649, + 104, 4, 5, 4, 5, 4, 5, 649, 52, 514, + 3, 649, 56, 4, 519, 4, 519, 61, 649, 63, + 64, 4, 5, 67, 662, 649, 70, 97, 533, 4, + 581, 3, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 121, 554, + 555, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 45, 46, 4, + 708, 24, 24, 4, 5, 114, 581, 4, 30, 37, + 38, 33, 217, 218, 548, 549, 24, 694, 40, 25, + 105, 31, 4, 644, 3, 23, 601, 574, 601, 59, + 153, 5, 96, 98, 4, 24, 5, 5, 24, 53, + 5, 4, 164, 65, 66, 4, 24, 69, 31, 24, + 3, 73, 4, 152, 76, 77, 680, 68, 3, 5, + 635, 5, 637, 639, 637, 3, 5, 89, 6, 644, + 8, 93, 96, 5, 649, 3, 61, 72, 35, 4, + 61, 19, 20, 21, 22, 23, 24, 54, 4, 27, + 4, 24, 30, 4, 24, 33, 164, 721, 24, 3, + 5, 39, 40, 13, 25, 680, 4, 24, 5, 4, + 4, 49, 50, 61, 5, 24, 691, 138, 137, 153, + 4, 59, 24, 3, 5, 4, 148, 65, 66, 151, + 68, 69, 35, 4, 71, 73, 74, 712, 76, 77, + 78, 167, 80, 5, 27, 31, 721, 85, 35, 87, + 88, 89, 90, 91, 92, 93, 94, 99, 3, 42, + 36, 5, 146, 4, 141, 5, 153, 129, 134, 107, + 134, 132, 162, 574, 57, 130, 114, 752, 154, 0, + 118, 119, 120, 141, 122, 123, 124, 125, 126, 127, + 128, 74, 141, 625, 675, 721, 705, 725, 378, 82, + 443, 474, 85, 21, 142, 143, 144, 145, 332, 346, + 148, 572, 415, 151, 276, 3, 572, 417, 6, 102, + 8, 159, 160, 161, 162, 163, 164, 165, 166, 287, + 168, 19, 20, 21, 22, 23, 24, 670, 287, 520, + 518, 530, 30, 619, 678, 33, 34, 3, 202, 708, + 679, 39, 40, 752, 453, 404, 554, 228, 166, 183, + 480, 49, 50, 19, 20, 21, 22, 321, 24, 165, + 230, 59, 319, 229, 533, 188, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, 80, -1, 50, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, 68, -1, -1, -1, -1, -1, -1, 107, + -1, -1, 78, -1, -1, 81, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 107, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, 159, 160, 161, 162, 163, 164, 165, 166, -1, + 168, 19, 20, 21, 22, 23, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, 49, 50, -1, -1, -1, -1, -1, -1, -1, + -1, 59, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, 80, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, 159, 160, 161, 162, 163, 164, 165, 166, -1, + 168, 19, 20, 21, 22, 23, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, 49, 50, -1, -1, -1, -1, -1, -1, -1, + -1, 59, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, 80, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, 159, 160, 161, 162, 163, 164, 165, 166, -1, + 168, 19, 20, 21, 22, 23, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, 59, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, 159, 160, 161, 162, 163, 164, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, 27, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, 74, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, 85, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, 4, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, 29, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, 44, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, 34, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, 133, -1, -1, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, 133, -1, -1, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, 133, -1, -1, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, 97, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, 29, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, -1, -1, -1, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, 34, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, 133, -1, -1, -1, -1, -1, - -1, 140, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, 133, -1, -1, -1, -1, -1, - -1, 140, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, 133, -1, -1, -1, -1, -1, - -1, 140, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, 97, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, + -1, -1, -1, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, 23, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 34, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, 23, -1, 73, -1, -1, 76, 77, + 78, -1, -1, 55, 34, -1, -1, -1, -1, 87, + 62, 89, -1, -1, -1, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, 55, -1, -1, -1, 107, + -1, -1, 62, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 122, 123, 124, 125, 126, 127, + 128, -1, 104, -1, -1, -1, -1, -1, -1, 24, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - 29, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, - 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, 30, -1, -1, 33, -1, -1, -1, -1, -1, - 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 65, 66, -1, 68, - 69, -1, -1, -1, 73, -1, -1, 76, 77, 78, - -1, -1, -1, -1, -1, -1, -1, -1, 87, 88, - 89, -1, -1, -1, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 122, 123, 124, 125, 126, 127, 128, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, - -1, -1, -1, -1, -1, -1, 165, 166, -1, 168, - 19, 20, 21, 22, -1, 24, 23, -1, -1, -1, - -1, 30, -1, -1, 33, 32, -1, 34, -1, -1, - 39, 40, -1, -1, -1, -1, 43, -1, -1, -1, - 23, 50, -1, -1, -1, -1, -1, -1, 55, -1, - -1, 34, 59, -1, -1, 62, 65, 66, -1, 68, - 69, -1, 23, -1, 73, -1, -1, 76, 77, 78, - -1, -1, 55, 34, -1, -1, -1, -1, 87, 62, - 89, -1, -1, -1, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, 55, -1, -1, 104, 107, -1, - -1, 62, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 122, 123, 124, 125, 126, 127, 128, - -1, 104, -1, -1, -1, -1, -1, -1, 24, -1, - -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, - -1, -1, 151, 104, -1, -1, -1, -1, -1, -1, - -1, -1, 159, 160, 161, 162, 163, 164, -1, 168, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, -1, -1, - -1, -1, -1, -1, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120 + 168, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, -1, + -1, -1, -1, -1, -1, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of @@ -2086,24 +2086,24 @@ static const yytype_int16 yystos[] = 4, 296, 304, 305, 349, 4, 212, 388, 213, 351, 24, 24, 164, 391, 3, 207, 13, 25, 4, 348, 351, 47, 252, 252, 208, 24, 273, 276, 265, 3, - 50, 68, 78, 81, 234, 240, 5, 277, 199, 209, - 246, 249, 253, 256, 379, 383, 4, 349, 4, 225, - 24, 192, 350, 24, 365, 365, 230, 61, 230, 348, - 239, 138, 299, 137, 306, 5, 24, 234, 268, 392, - 185, 4, 24, 4, 5, 352, 153, 165, 228, 241, - 242, 383, 4, 62, 208, 4, 3, 191, 70, 280, - 230, 83, 280, 281, 326, 296, 300, 301, 302, 71, - 193, 35, 193, 349, 4, 351, 208, 358, 4, 5, - 4, 189, 371, 239, 3, 362, 363, 5, 31, 35, - 99, 218, 220, 308, 309, 370, 135, 136, 150, 307, - 311, 242, 4, 5, 189, 45, 46, 324, 225, 301, - 303, 194, 195, 209, 243, 342, 388, 5, 146, 321, - 4, 34, 133, 140, 312, 313, 315, 351, 371, 4, - 5, 32, 43, 196, 196, 100, 219, 309, 116, 147, - 148, 322, 133, 140, 314, 316, 317, 319, 351, 134, - 141, 129, 310, 134, 195, 36, 197, 197, 342, 134, - 141, 153, 132, 134, 53, 131, 139, 140, 37, 38, - 198, 133, 316, 318, 130, 141, 132 + 50, 68, 78, 81, 234, 240, 370, 5, 277, 199, + 209, 246, 249, 253, 256, 379, 383, 4, 349, 4, + 225, 24, 192, 350, 24, 365, 365, 230, 61, 230, + 348, 239, 138, 299, 137, 306, 5, 24, 234, 268, + 392, 185, 4, 24, 4, 5, 352, 153, 165, 228, + 241, 242, 383, 4, 62, 208, 4, 3, 191, 70, + 280, 230, 83, 280, 281, 326, 296, 300, 301, 302, + 71, 193, 35, 193, 349, 4, 351, 208, 358, 4, + 5, 4, 189, 371, 239, 3, 362, 363, 5, 31, + 35, 99, 218, 220, 308, 309, 370, 135, 136, 150, + 307, 311, 242, 4, 5, 189, 45, 46, 324, 225, + 301, 303, 194, 195, 209, 243, 342, 388, 5, 146, + 321, 4, 34, 133, 140, 312, 313, 315, 351, 371, + 4, 5, 32, 43, 196, 196, 100, 219, 309, 116, + 147, 148, 322, 133, 140, 314, 316, 317, 319, 351, + 134, 141, 129, 310, 134, 195, 36, 197, 197, 342, + 134, 141, 153, 132, 134, 53, 131, 139, 140, 37, + 38, 198, 133, 316, 318, 130, 141, 132 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ @@ -2123,41 +2123,41 @@ static const yytype_int16 yyr1[] = 227, 227, 228, 228, 228, 229, 229, 230, 230, 230, 230, 231, 232, 232, 233, 233, 234, 234, 234, 234, 234, 235, 235, 235, 235, 235, 235, 235, 236, 236, - 237, 237, 238, 238, 239, 239, 240, 241, 241, 242, - 243, 243, 243, 243, 243, 243, 243, 243, 243, 244, - 245, 245, 246, 246, 246, 246, 246, 246, 246, 247, - 248, 249, 250, 251, 251, 251, 251, 252, 252, 253, - 254, 254, 255, 255, 256, 257, 257, 258, 259, 260, - 261, 262, 262, 262, 263, 264, 265, 265, 265, 266, - 266, 267, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 269, 269, 269, 270, 270, 271, 271, 271, 271, - 272, 273, 273, 273, 273, 273, 273, 274, 274, 275, - 276, 276, 276, 276, 276, 276, 277, 277, 278, 278, - 278, 278, 278, 278, 279, 279, 279, 280, 281, 281, - 282, 282, 282, 282, 283, 283, 284, 284, 284, 285, - 286, 286, 286, 286, 286, 286, 286, 287, 288, 288, - 288, 289, 290, 290, 291, 292, 293, 293, 294, 295, - 295, 296, 297, 297, 298, 299, 299, 300, 300, 301, - 302, 303, 304, 304, 305, 306, 306, 307, 307, 308, - 308, 309, 310, 310, 310, 310, 310, 311, 311, 311, - 312, 312, 313, 313, 313, 314, 315, 316, 316, 316, - 317, 317, 318, 318, 319, 320, 320, 320, 320, 321, - 321, 322, 322, 322, 323, 324, 324, 324, 325, 325, - 326, 327, 327, 328, 329, 330, 330, 330, 330, 330, + 236, 237, 237, 238, 238, 239, 239, 240, 241, 241, + 242, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 244, 245, 245, 246, 246, 246, 246, 246, 246, 246, + 247, 248, 249, 250, 251, 251, 251, 251, 252, 252, + 253, 254, 254, 255, 255, 256, 257, 257, 258, 259, + 260, 261, 262, 262, 262, 263, 264, 265, 265, 265, + 266, 266, 267, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 269, 269, 269, 270, 270, 271, 271, 271, + 271, 272, 273, 273, 273, 273, 273, 273, 274, 274, + 275, 276, 276, 276, 276, 276, 276, 277, 277, 278, + 278, 278, 278, 278, 278, 279, 279, 279, 280, 281, + 281, 282, 282, 282, 282, 283, 283, 284, 284, 284, + 285, 286, 286, 286, 286, 286, 286, 286, 287, 288, + 288, 288, 289, 290, 290, 291, 292, 293, 293, 294, + 295, 295, 296, 297, 297, 298, 299, 299, 300, 300, + 301, 302, 303, 304, 304, 305, 306, 306, 307, 307, + 308, 308, 309, 310, 310, 310, 310, 310, 311, 311, + 311, 312, 312, 313, 313, 313, 314, 315, 316, 316, + 316, 317, 317, 318, 318, 319, 320, 320, 320, 320, + 321, 321, 322, 322, 322, 323, 324, 324, 324, 325, + 325, 326, 327, 327, 328, 329, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 331, 331, 332, 333, 333, 334, 335, 335, 336, - 336, 337, 337, 337, 337, 337, 337, 337, 337, 338, - 339, 339, 339, 339, 340, 340, 340, 340, 341, 341, - 341, 342, 342, 342, 342, 342, 343, 344, 344, 344, - 344, 344, 344, 345, 346, 347, 348, 348, 349, 350, - 350, 351, 351, 351, 352, 353, 353, 354, 354, 355, - 356, 357, 358, 358, 359, 360, 360, 361, 362, 363, - 364, 364, 364, 365, 366, 366, 367, 367, 368, 368, - 369, 369, 369, 370, 371, 372, 373, 373, 374, 375, - 376, 376, 377, 378, 378, 379, 379, 379, 379, 379, - 379, 380, 380, 381, 382, 382, 383, 384, 385, 386, - 386, 387, 387, 388, 388, 389, 390, 390, 391, 391, - 392, 392, 392 + 330, 330, 331, 331, 332, 333, 333, 334, 335, 335, + 336, 336, 337, 337, 337, 337, 337, 337, 337, 337, + 338, 339, 339, 339, 339, 340, 340, 340, 340, 341, + 341, 341, 342, 342, 342, 342, 342, 343, 344, 344, + 344, 344, 344, 344, 345, 346, 347, 348, 348, 349, + 350, 350, 351, 351, 351, 352, 353, 353, 354, 354, + 355, 356, 357, 358, 358, 359, 360, 360, 361, 362, + 363, 364, 364, 364, 365, 366, 366, 367, 367, 368, + 368, 369, 369, 369, 370, 371, 372, 373, 373, 374, + 375, 376, 376, 377, 378, 378, 379, 379, 379, 379, + 379, 379, 380, 380, 381, 382, 382, 383, 384, 385, + 386, 386, 387, 387, 388, 388, 389, 390, 390, 391, + 391, 392, 392, 392 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ @@ -2177,41 +2177,41 @@ static const yytype_int8 yyr2[] = 0, 1, 0, 2, 2, 0, 1, 4, 3, 4, 1, 2, 0, 3, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 4, - 1, 2, 1, 3, 1, 3, 3, 1, 3, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 3, 2, 1, 1, 1, 1, 1, 1, 2, 5, - 2, 4, 4, 2, 2, 1, 1, 0, 2, 3, - 2, 1, 1, 3, 3, 2, 1, 3, 2, 2, - 3, 1, 1, 1, 2, 2, 4, 3, 3, 1, - 3, 1, 1, 1, 1, 1, 1, 2, 2, 2, - 2, 0, 2, 1, 1, 1, 1, 1, 1, 1, - 8, 1, 1, 1, 3, 4, 5, 1, 1, 7, - 5, 5, 5, 4, 5, 6, 0, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, - 0, 1, 1, 2, 4, 5, 5, 5, 1, 4, - 3, 3, 1, 1, 1, 1, 1, 4, 0, 2, - 4, 5, 1, 1, 1, 4, 1, 1, 6, 0, - 4, 1, 1, 1, 1, 0, 2, 3, 1, 3, - 1, 6, 0, 1, 1, 0, 3, 0, 3, 3, - 1, 2, 0, 3, 2, 2, 3, 1, 1, 1, - 1, 1, 2, 2, 2, 2, 4, 1, 2, 1, - 1, 2, 1, 2, 2, 1, 1, 1, 1, 0, - 2, 1, 1, 1, 7, 0, 1, 1, 1, 1, - 4, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 4, 1, 2, 1, 3, 1, 3, 3, 1, 3, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 2, 1, 1, 1, 1, 1, 1, 2, + 5, 2, 4, 4, 2, 2, 1, 1, 0, 2, + 3, 2, 1, 1, 3, 3, 2, 1, 3, 2, + 2, 3, 1, 1, 1, 2, 2, 4, 3, 3, + 1, 3, 1, 1, 1, 1, 1, 1, 2, 2, + 2, 2, 0, 2, 1, 1, 1, 1, 1, 1, + 1, 8, 1, 1, 1, 3, 4, 5, 1, 1, + 7, 5, 5, 5, 4, 5, 6, 0, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 0, 1, 1, 2, 4, 5, 5, 5, 1, + 4, 3, 3, 1, 1, 1, 1, 1, 4, 0, + 2, 4, 5, 1, 1, 1, 4, 1, 1, 6, + 0, 4, 1, 1, 1, 1, 0, 2, 3, 1, + 3, 1, 6, 0, 1, 1, 0, 3, 0, 3, + 3, 1, 2, 0, 3, 2, 2, 3, 1, 1, + 1, 1, 1, 2, 2, 2, 2, 4, 1, 2, + 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, + 0, 2, 1, 1, 1, 7, 0, 1, 1, 1, + 1, 4, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 2, 1, 1, 6, 0, 1, 0, - 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, - 1, 2, 2, 2, 1, 3, 3, 3, 1, 3, - 3, 1, 3, 3, 3, 3, 1, 1, 1, 1, - 2, 2, 2, 1, 1, 1, 1, 3, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 3, 3, 1, - 1, 2, 1, 1, 3, 3, 3, 1, 2, 1, - 1, 3, 3, 2, 0, 3, 0, 1, 1, 3, - 2, 1, 1, 2, 1, 1, 1, 1, 5, 4, - 1, 2, 4, 1, 3, 1, 1, 1, 1, 1, - 1, 1, 2, 4, 0, 2, 1, 1, 1, 2, - 1, 0, 2, 0, 1, 2, 2, 1, 1, 3, - 1, 1, 1 + 1, 1, 1, 3, 2, 1, 1, 6, 0, 1, + 0, 3, 1, 1, 1, 1, 1, 1, 3, 1, + 1, 1, 2, 2, 2, 1, 3, 3, 3, 1, + 3, 3, 1, 3, 3, 3, 3, 1, 1, 1, + 1, 2, 2, 2, 1, 1, 1, 1, 3, 1, + 1, 3, 1, 1, 1, 1, 1, 1, 3, 3, + 1, 1, 2, 1, 1, 3, 3, 3, 1, 2, + 1, 1, 3, 3, 2, 0, 3, 0, 1, 1, + 3, 2, 1, 1, 2, 1, 1, 1, 1, 5, + 4, 1, 2, 4, 1, 3, 1, 1, 1, 1, + 1, 1, 1, 2, 4, 0, 2, 1, 1, 1, + 2, 1, 0, 2, 0, 1, 2, 2, 1, 1, + 3, 1, 1, 1 }; @@ -3325,7 +3325,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 141: /* boolean_factor: SQL_TOKEN_NOT boolean_test */ + case 140: /* boolean_test: boolean_primary SQL_TOKEN_IS sql_not column_ref */ + { + (yyval.pParseNode) = SQL_NEW_RULE; + (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); + (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); + (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); + (yyval.pParseNode)->append((yyvsp[0].pParseNode)); + } + break; + + case 142: /* boolean_factor: SQL_TOKEN_NOT boolean_test */ { // boolean_factor: rule 1 (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3333,7 +3343,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 143: /* boolean_term: boolean_term SQL_TOKEN_AND boolean_factor */ + case 144: /* boolean_term: boolean_term SQL_TOKEN_AND boolean_factor */ { (yyval.pParseNode) = SQL_NEW_RULE; // boolean_term: rule 1 (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3342,7 +3352,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 145: /* search_condition: search_condition SQL_TOKEN_OR boolean_term */ + case 146: /* search_condition: search_condition SQL_TOKEN_OR boolean_term */ { (yyval.pParseNode) = SQL_NEW_RULE; // search_condition (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3351,7 +3361,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 146: /* type_predicate: '(' type_list ')' */ + case 147: /* type_predicate: '(' type_list ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -3360,21 +3370,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 147: /* type_list: type_list_item */ + case 148: /* type_list: type_list_item */ { (yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 148: /* type_list: type_list ',' type_list_item */ + case 149: /* type_list: type_list ',' type_list_item */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 149: /* type_list_item: opt_only table_node */ + case 150: /* type_list_item: opt_only table_node */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3382,7 +3392,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 159: /* comparison_predicate_part_2: comparison row_value_constructor */ + case 160: /* comparison_predicate_part_2: comparison row_value_constructor */ { (yyval.pParseNode) = SQL_NEW_RULE; // comparison_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3390,7 +3400,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 160: /* comparison_predicate: row_value_constructor comparison row_value_constructor */ + case 161: /* comparison_predicate: row_value_constructor comparison row_value_constructor */ { (yyval.pParseNode) = SQL_NEW_RULE; // comparison_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3399,7 +3409,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 161: /* comparison_predicate: comparison row_value_constructor */ + case 162: /* comparison_predicate: comparison row_value_constructor */ { if(context->inPredicateCheck()) // comparison_predicate: rule 2 { @@ -3424,7 +3434,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 168: /* comparison: SQL_TOKEN_IS sql_not */ + case 169: /* comparison: SQL_TOKEN_IS sql_not */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3432,7 +3442,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 169: /* between_predicate_part_2: sql_not SQL_TOKEN_BETWEEN row_value_constructor SQL_TOKEN_AND row_value_constructor */ + case 170: /* between_predicate_part_2: sql_not SQL_TOKEN_BETWEEN row_value_constructor SQL_TOKEN_AND row_value_constructor */ { (yyval.pParseNode) = SQL_NEW_RULE; // between_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -3443,7 +3453,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 170: /* between_predicate: row_value_constructor between_predicate_part_2 */ + case 171: /* between_predicate: row_value_constructor between_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; // between_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3451,7 +3461,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 171: /* character_like_predicate_part_2: sql_not SQL_TOKEN_LIKE string_value_exp opt_escape */ + case 172: /* character_like_predicate_part_2: sql_not SQL_TOKEN_LIKE string_value_exp opt_escape */ { (yyval.pParseNode) = SQL_NEW_RULE; // like_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3461,7 +3471,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 172: /* other_like_predicate_part_2: sql_not SQL_TOKEN_LIKE value_exp_primary opt_escape */ + case 173: /* other_like_predicate_part_2: sql_not SQL_TOKEN_LIKE value_exp_primary opt_escape */ { (yyval.pParseNode) = SQL_NEW_RULE; // like_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3471,7 +3481,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 173: /* like_predicate: row_value_constructor character_like_predicate_part_2 */ + case 174: /* like_predicate: row_value_constructor character_like_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; // like_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3479,7 +3489,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 174: /* like_predicate: row_value_constructor other_like_predicate_part_2 */ + case 175: /* like_predicate: row_value_constructor other_like_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; // like_predicate: rule 3 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3487,7 +3497,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 175: /* like_predicate: character_like_predicate_part_2 */ + case 176: /* like_predicate: character_like_predicate_part_2 */ { if (context->inPredicateCheck()) // like_predicate: rule 5 { @@ -3511,7 +3521,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 176: /* like_predicate: other_like_predicate_part_2 */ + case 177: /* like_predicate: other_like_predicate_part_2 */ { if (context->inPredicateCheck()) // like_predicate: rule 6 { @@ -3535,17 +3545,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 177: /* opt_escape: %empty */ + case 178: /* opt_escape: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 178: /* opt_escape: SQL_TOKEN_ESCAPE string_value_exp */ + case 179: /* opt_escape: SQL_TOKEN_ESCAPE string_value_exp */ {(yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 179: /* null_predicate_part_2: SQL_TOKEN_IS sql_not SQL_TOKEN_NULL */ + case 180: /* null_predicate_part_2: SQL_TOKEN_IS sql_not SQL_TOKEN_NULL */ { (yyval.pParseNode) = SQL_NEW_RULE; // test_for_null: rule 1 (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3554,7 +3564,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 180: /* test_for_null: row_value_constructor null_predicate_part_2 */ + case 181: /* test_for_null: row_value_constructor null_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; // test_for_null: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3562,7 +3572,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 181: /* test_for_null: null_predicate_part_2 */ + case 182: /* test_for_null: null_predicate_part_2 */ { if (context->inPredicateCheck())// test_for_null: rule 2 { @@ -3578,13 +3588,13 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 182: /* in_predicate_value: subquery */ + case 183: /* in_predicate_value: subquery */ {(yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 183: /* in_predicate_value: '(' value_exp_commalist ')' */ + case 184: /* in_predicate_value: '(' value_exp_commalist ')' */ {(yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3592,7 +3602,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 184: /* in_predicate_part_2: sql_not SQL_TOKEN_IN in_predicate_value */ + case 185: /* in_predicate_part_2: sql_not SQL_TOKEN_IN in_predicate_value */ { (yyval.pParseNode) = SQL_NEW_RULE;// in_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3601,7 +3611,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 185: /* in_predicate: row_value_constructor in_predicate_part_2 */ + case 186: /* in_predicate: row_value_constructor in_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE;// in_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3609,7 +3619,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 186: /* in_predicate: in_predicate_part_2 */ + case 187: /* in_predicate: in_predicate_part_2 */ { if ( context->inPredicateCheck() )// in_predicate: rule 2 { @@ -3625,7 +3635,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 187: /* quantified_comparison_predicate_part_2: comparison any_all_some subquery */ + case 188: /* quantified_comparison_predicate_part_2: comparison any_all_some subquery */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3634,7 +3644,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 188: /* all_or_any_predicate: row_value_constructor quantified_comparison_predicate_part_2 */ + case 189: /* all_or_any_predicate: row_value_constructor quantified_comparison_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3642,7 +3652,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 189: /* rtreematch_predicate: row_value_constructor rtreematch_predicate_part_2 */ + case 190: /* rtreematch_predicate: row_value_constructor rtreematch_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3650,7 +3660,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 190: /* rtreematch_predicate_part_2: sql_not SQL_TOKEN_MATCH fct_spec */ + case 191: /* rtreematch_predicate_part_2: sql_not SQL_TOKEN_MATCH fct_spec */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3659,7 +3669,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 194: /* existence_test: SQL_TOKEN_EXISTS subquery */ + case 195: /* existence_test: SQL_TOKEN_EXISTS subquery */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3667,13 +3677,13 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 195: /* unique_test: SQL_TOKEN_UNIQUE subquery */ + case 196: /* unique_test: SQL_TOKEN_UNIQUE subquery */ {(yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 196: /* subquery: '(' SQL_TOKEN_VALUES values_commalist ')' */ + case 197: /* subquery: '(' SQL_TOKEN_VALUES values_commalist ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -3683,7 +3693,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 197: /* subquery: '(' select_statement ')' */ + case 198: /* subquery: '(' select_statement ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -3692,7 +3702,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 198: /* subquery: '(' cte ')' */ + case 199: /* subquery: '(' cte ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -3701,21 +3711,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 199: /* scalar_exp_commalist: select_sublist */ + case 200: /* scalar_exp_commalist: select_sublist */ { (yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 200: /* scalar_exp_commalist: scalar_exp_commalist ',' select_sublist */ + case 201: /* scalar_exp_commalist: scalar_exp_commalist ',' select_sublist */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 207: /* literal: literal SQL_TOKEN_STRING */ + case 208: /* literal: literal SQL_TOKEN_STRING */ { if (context->inPredicateCheck()) { @@ -3729,7 +3739,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 208: /* literal: literal SQL_TOKEN_INT */ + case 209: /* literal: literal SQL_TOKEN_INT */ { if (context->inPredicateCheck()) { @@ -3743,7 +3753,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 209: /* literal: literal SQL_TOKEN_REAL_NUM */ + case 210: /* literal: literal SQL_TOKEN_REAL_NUM */ { if (context->inPredicateCheck()) { @@ -3757,7 +3767,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 210: /* literal: literal SQL_TOKEN_APPROXNUM */ + case 211: /* literal: literal SQL_TOKEN_APPROXNUM */ { if (context->inPredicateCheck()) { @@ -3771,11 +3781,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 211: /* as_clause: %empty */ + case 212: /* as_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 212: /* as_clause: SQL_TOKEN_AS column */ + case 213: /* as_clause: SQL_TOKEN_AS column */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3783,7 +3793,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 220: /* iif_spec: SQL_TOKEN_IIF '(' search_condition ',' result ',' result ')' */ + case 221: /* iif_spec: SQL_TOKEN_IIF '(' search_condition ',' result ',' result ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-7].pParseNode)); @@ -3795,7 +3805,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 224: /* fct_spec: function_name '(' ')' */ + case 225: /* fct_spec: function_name '(' ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3804,7 +3814,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 225: /* fct_spec: function_name '(' function_args_commalist ')' */ + case 226: /* fct_spec: function_name '(' function_args_commalist ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3814,7 +3824,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 226: /* fct_spec: function_name '(' opt_all_distinct function_arg ')' */ + case 227: /* fct_spec: function_name '(' opt_all_distinct function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -3825,7 +3835,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 229: /* value_creation_fct: SQL_TOKEN_NAVIGATION_VALUE '(' derived_column ',' function_arg opt_function_arg ')' */ + case 230: /* value_creation_fct: SQL_TOKEN_NAVIGATION_VALUE '(' derived_column ',' function_arg opt_function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-6].pParseNode)); @@ -3838,7 +3848,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 230: /* aggregate_fct: SQL_TOKEN_MAX '(' opt_all_distinct function_args_commalist ')' */ + case 231: /* aggregate_fct: SQL_TOKEN_MAX '(' opt_all_distinct function_args_commalist ')' */ { if((yyvsp[-1].pParseNode)->count() != 1) { @@ -3856,7 +3866,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 231: /* aggregate_fct: SQL_TOKEN_MIN '(' opt_all_distinct function_args_commalist ')' */ + case 232: /* aggregate_fct: SQL_TOKEN_MIN '(' opt_all_distinct function_args_commalist ')' */ { if((yyvsp[-1].pParseNode)->count() != 1) { @@ -3874,7 +3884,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 232: /* aggregate_fct: set_fct_type '(' opt_all_distinct function_arg ')' */ + case 233: /* aggregate_fct: set_fct_type '(' opt_all_distinct function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -3885,7 +3895,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 233: /* aggregate_fct: SQL_TOKEN_COUNT '(' '*' ')' */ + case 234: /* aggregate_fct: SQL_TOKEN_COUNT '(' '*' ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3895,7 +3905,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 234: /* aggregate_fct: SQL_TOKEN_COUNT '(' opt_all_distinct function_arg ')' */ + case 235: /* aggregate_fct: SQL_TOKEN_COUNT '(' opt_all_distinct function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -3906,7 +3916,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 235: /* aggregate_fct: SQL_TOKEN_GROUP_CONCAT '(' opt_all_distinct function_arg opt_function_arg ')' */ + case 236: /* aggregate_fct: SQL_TOKEN_GROUP_CONCAT '(' opt_all_distinct function_arg opt_function_arg ')' */ { if ((yyvsp[-3].pParseNode)->isToken() && (yyvsp[-1].pParseNode)->count()!=0) { @@ -3923,11 +3933,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 236: /* opt_function_arg: %empty */ + case 237: /* opt_function_arg: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 237: /* opt_function_arg: ',' function_arg */ + case 238: /* opt_function_arg: ',' function_arg */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE(",", SQL_NODE_PUNCTUATION)); @@ -3935,28 +3945,28 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 244: /* outer_join_type: SQL_TOKEN_LEFT */ + case 245: /* outer_join_type: SQL_TOKEN_LEFT */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 245: /* outer_join_type: SQL_TOKEN_RIGHT */ + case 246: /* outer_join_type: SQL_TOKEN_RIGHT */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 246: /* outer_join_type: SQL_TOKEN_FULL */ + case 247: /* outer_join_type: SQL_TOKEN_FULL */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 247: /* join_condition: SQL_TOKEN_ON search_condition */ + case 248: /* join_condition: SQL_TOKEN_ON search_condition */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3964,18 +3974,18 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 250: /* join_type: %empty */ + case 251: /* join_type: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 251: /* join_type: SQL_TOKEN_INNER */ + case 252: /* join_type: SQL_TOKEN_INNER */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 253: /* join_type: outer_join_type SQL_TOKEN_OUTER */ + case 254: /* join_type: outer_join_type SQL_TOKEN_OUTER */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3983,7 +3993,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 254: /* cross_union: table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref */ + case 255: /* cross_union: table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3993,7 +4003,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 255: /* cross_union: table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref join_condition */ + case 256: /* cross_union: table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref join_condition */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4004,7 +4014,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 256: /* qualified_join: table_ref SQL_TOKEN_NATURAL join_type SQL_TOKEN_JOIN table_ref */ + case 257: /* qualified_join: table_ref SQL_TOKEN_NATURAL join_type SQL_TOKEN_JOIN table_ref */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4015,7 +4025,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 257: /* qualified_join: table_ref join_type SQL_TOKEN_JOIN table_ref join_spec */ + case 258: /* qualified_join: table_ref join_type SQL_TOKEN_JOIN table_ref join_spec */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4026,7 +4036,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 259: /* window_function: window_function_type opt_filter_clause SQL_TOKEN_OVER window_name_or_specification */ + case 260: /* window_function: window_function_type opt_filter_clause SQL_TOKEN_OVER window_name_or_specification */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4036,7 +4046,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 260: /* window_function_type: rank_function_type '(' ')' */ + case 261: /* window_function_type: rank_function_type '(' ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4045,7 +4055,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 261: /* window_function_type: SQL_TOKEN_ROW_NUMBER '(' ')' */ + case 262: /* window_function_type: SQL_TOKEN_ROW_NUMBER '(' ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4054,7 +4064,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 267: /* ntile_function: SQL_TOKEN_NTILE '(' function_arg ')' */ + case 268: /* ntile_function: SQL_TOKEN_NTILE '(' function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4064,11 +4074,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 268: /* opt_lead_or_lag_function: %empty */ + case 269: /* opt_lead_or_lag_function: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 269: /* opt_lead_or_lag_function: ',' function_arg */ + case 270: /* opt_lead_or_lag_function: ',' function_arg */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE(",", SQL_NODE_PUNCTUATION)); @@ -4076,7 +4086,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 270: /* opt_lead_or_lag_function: ',' function_arg ',' function_arg */ + case 271: /* opt_lead_or_lag_function: ',' function_arg ',' function_arg */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode) = CREATE_NODE(",", SQL_NODE_PUNCTUATION)); @@ -4086,7 +4096,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 271: /* lead_or_lag_function: lead_or_lag '(' lead_or_lag_extent opt_lead_or_lag_function ')' */ + case 272: /* lead_or_lag_function: lead_or_lag '(' lead_or_lag_extent opt_lead_or_lag_function ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4097,7 +4107,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 275: /* first_or_last_value_function: first_or_last_value '(' function_arg ')' */ + case 276: /* first_or_last_value_function: first_or_last_value '(' function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4107,7 +4117,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 278: /* nth_value_function: SQL_TOKEN_NTH_VALUE '(' function_arg ',' function_arg ')' */ + case 279: /* nth_value_function: SQL_TOKEN_NTH_VALUE '(' function_arg ',' function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-5].pParseNode)); @@ -4119,11 +4129,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 279: /* opt_filter_clause: %empty */ + case 280: /* opt_filter_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 280: /* opt_filter_clause: SQL_TOKEN_FILTER '(' where_clause ')' */ + case 281: /* opt_filter_clause: SQL_TOKEN_FILTER '(' where_clause ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4133,11 +4143,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 285: /* opt_window_clause: %empty */ + case 286: /* opt_window_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 286: /* opt_window_clause: SQL_TOKEN_WINDOW window_definition_list */ + case 287: /* opt_window_clause: SQL_TOKEN_WINDOW window_definition_list */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4145,17 +4155,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 287: /* window_definition_list: window_definition_list ',' window_definition */ + case 288: /* window_definition_list: window_definition_list ',' window_definition */ {(yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode);} break; - case 288: /* window_definition_list: window_definition */ + case 289: /* window_definition_list: window_definition */ {(yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 289: /* window_definition: new_window_name SQL_TOKEN_AS window_specification */ + case 290: /* window_definition: new_window_name SQL_TOKEN_AS window_specification */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4164,7 +4174,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 291: /* window_specification: '(' opt_existing_window_name opt_window_partition_clause opt_order_by_clause opt_window_frame_clause ')' */ + case 292: /* window_specification: '(' opt_existing_window_name opt_window_partition_clause opt_order_by_clause opt_window_frame_clause ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-5].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -4176,15 +4186,15 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 292: /* opt_existing_window_name: %empty */ + case 293: /* opt_existing_window_name: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 295: /* opt_window_partition_clause: %empty */ + case 296: /* opt_window_partition_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 296: /* opt_window_partition_clause: SQL_TOKEN_PARTITION SQL_TOKEN_BY window_partition_column_reference_list */ + case 297: /* opt_window_partition_clause: SQL_TOKEN_PARTITION SQL_TOKEN_BY window_partition_column_reference_list */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4193,11 +4203,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 297: /* opt_window_frame_clause: %empty */ + case 298: /* opt_window_frame_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 298: /* opt_window_frame_clause: window_frame_units window_frame_extent opt_window_frame_exclusion */ + case 299: /* opt_window_frame_clause: window_frame_units window_frame_extent opt_window_frame_exclusion */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4206,17 +4216,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 299: /* window_partition_column_reference_list: window_partition_column_reference_list ',' window_partition_column_reference */ + case 300: /* window_partition_column_reference_list: window_partition_column_reference_list ',' window_partition_column_reference */ {(yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode);} break; - case 300: /* window_partition_column_reference_list: window_partition_column_reference */ + case 301: /* window_partition_column_reference_list: window_partition_column_reference */ {(yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 301: /* window_partition_column_reference: column_ref opt_collate_clause */ + case 302: /* window_partition_column_reference: column_ref opt_collate_clause */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4224,11 +4234,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 302: /* opt_window_frame_exclusion: %empty */ + case 303: /* opt_window_frame_exclusion: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 303: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ + case 304: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4237,7 +4247,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 304: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_GROUP */ + case 305: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_GROUP */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4245,7 +4255,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 305: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_TIES */ + case 306: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_TIES */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4253,7 +4263,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 306: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_NO SQL_TOKEN_OTHERS */ + case 307: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_NO SQL_TOKEN_OTHERS */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4262,7 +4272,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 312: /* window_frame_start: SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING */ + case 313: /* window_frame_start: SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4270,7 +4280,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 313: /* window_frame_start: value_exp SQL_TOKEN_PRECEDING */ + case 314: /* window_frame_start: value_exp SQL_TOKEN_PRECEDING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4278,7 +4288,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 314: /* window_frame_start: SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ + case 315: /* window_frame_start: SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4286,7 +4296,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 315: /* window_frame_preceding: value_exp SQL_TOKEN_PRECEDING */ + case 316: /* window_frame_preceding: value_exp SQL_TOKEN_PRECEDING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4294,7 +4304,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 316: /* window_frame_between: SQL_TOKEN_BETWEEN window_frame_bound_1 SQL_TOKEN_AND window_frame_bound_2 */ + case 317: /* window_frame_between: SQL_TOKEN_BETWEEN window_frame_bound_1 SQL_TOKEN_AND window_frame_bound_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4304,7 +4314,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 318: /* window_frame_bound: SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ + case 319: /* window_frame_bound: SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4312,7 +4322,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 321: /* window_frame_bound_1: SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING */ + case 322: /* window_frame_bound_1: SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4320,7 +4330,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 323: /* window_frame_bound_2: SQL_TOKEN_UNBOUNDED SQL_TOKEN_FOLLOWING */ + case 324: /* window_frame_bound_2: SQL_TOKEN_UNBOUNDED SQL_TOKEN_FOLLOWING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4328,7 +4338,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 324: /* window_frame_following: value_exp SQL_TOKEN_FOLLOWING */ + case 325: /* window_frame_following: value_exp SQL_TOKEN_FOLLOWING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4336,11 +4346,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 329: /* opt_collate_clause: %empty */ + case 330: /* opt_collate_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 330: /* opt_collate_clause: SQL_TOKEN_COLLATE collating_function */ + case 331: /* opt_collate_clause: SQL_TOKEN_COLLATE collating_function */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4348,7 +4358,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 334: /* ecrelationship_join: table_ref join_type SQL_TOKEN_JOIN table_ref SQL_TOKEN_USING table_node_ref op_relationship_direction */ + case 335: /* ecrelationship_join: table_ref join_type SQL_TOKEN_JOIN table_ref SQL_TOKEN_USING table_node_ref op_relationship_direction */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-6].pParseNode)); @@ -4361,11 +4371,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 335: /* op_relationship_direction: %empty */ + case 336: /* op_relationship_direction: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 340: /* named_columns_join: SQL_TOKEN_USING '(' column_commalist ')' */ + case 341: /* named_columns_join: SQL_TOKEN_USING '(' column_commalist ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4375,18 +4385,18 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 341: /* all: %empty */ + case 342: /* all: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 361: /* cast_target_scalar: cast_target_primitive_type */ + case 362: /* cast_target_scalar: cast_target_primitive_type */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 362: /* cast_target_scalar: SQL_TOKEN_NAME '.' SQL_TOKEN_NAME */ + case 363: /* cast_target_scalar: SQL_TOKEN_NAME '.' SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4395,7 +4405,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 363: /* cast_target_array: cast_target_scalar SQL_TOKEN_ARRAY_INDEX */ + case 364: /* cast_target_array: cast_target_scalar SQL_TOKEN_ARRAY_INDEX */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4403,7 +4413,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 366: /* cast_spec: SQL_TOKEN_CAST '(' cast_operand SQL_TOKEN_AS cast_target ')' */ + case 367: /* cast_spec: SQL_TOKEN_CAST '(' cast_operand SQL_TOKEN_AS cast_target ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-5].pParseNode)); @@ -4415,22 +4425,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 367: /* opt_optional_prop: %empty */ + case 368: /* opt_optional_prop: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 368: /* opt_optional_prop: '?' */ + case 369: /* opt_optional_prop: '?' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode) = CREATE_NODE("?", SQL_NODE_PUNCTUATION)); } break; - case 369: /* opt_extract_value: %empty */ + case 370: /* opt_extract_value: %empty */ { (yyval.pParseNode) = SQL_NEW_RULE; } break; - case 370: /* opt_extract_value: SQL_ARROW property_path opt_optional_prop */ + case 371: /* opt_extract_value: SQL_ARROW property_path opt_optional_prop */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4438,7 +4448,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 377: /* value_exp_primary: '(' value_exp ')' */ + case 378: /* value_exp_primary: '(' value_exp ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -4447,7 +4457,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 381: /* factor: '-' num_primary */ + case 382: /* factor: '-' num_primary */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE("-", SQL_NODE_PUNCTUATION)); @@ -4455,7 +4465,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 382: /* factor: '+' num_primary */ + case 383: /* factor: '+' num_primary */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE("+", SQL_NODE_PUNCTUATION)); @@ -4463,7 +4473,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 383: /* factor: SQL_BITWISE_NOT num_primary */ + case 384: /* factor: SQL_BITWISE_NOT num_primary */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE("~", SQL_NODE_PUNCTUATION)); @@ -4471,7 +4481,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 385: /* term: term '*' factor */ + case 386: /* term: term '*' factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4480,7 +4490,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 386: /* term: term '/' factor */ + case 387: /* term: term '/' factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4489,7 +4499,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 387: /* term: term '%' factor */ + case 388: /* term: term '%' factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4498,7 +4508,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 389: /* term_add_sub: term_add_sub '+' term */ + case 390: /* term_add_sub: term_add_sub '+' term */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4507,7 +4517,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 390: /* term_add_sub: term_add_sub '-' term */ + case 391: /* term_add_sub: term_add_sub '-' term */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4516,7 +4526,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 392: /* num_value_exp: num_value_exp SQL_BITWISE_SHIFT_LEFT term_add_sub */ + case 393: /* num_value_exp: num_value_exp SQL_BITWISE_SHIFT_LEFT term_add_sub */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4525,7 +4535,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 393: /* num_value_exp: num_value_exp SQL_BITWISE_SHIFT_RIGHT term_add_sub */ + case 394: /* num_value_exp: num_value_exp SQL_BITWISE_SHIFT_RIGHT term_add_sub */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4534,7 +4544,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 394: /* num_value_exp: num_value_exp SQL_BITWISE_OR term_add_sub */ + case 395: /* num_value_exp: num_value_exp SQL_BITWISE_OR term_add_sub */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4543,7 +4553,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 395: /* num_value_exp: num_value_exp SQL_BITWISE_AND term_add_sub */ + case 396: /* num_value_exp: num_value_exp SQL_BITWISE_AND term_add_sub */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4552,35 +4562,35 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 396: /* datetime_primary: datetime_value_fct */ + case 397: /* datetime_primary: datetime_value_fct */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 397: /* datetime_value_fct: SQL_TOKEN_CURRENT_DATE */ + case 398: /* datetime_value_fct: SQL_TOKEN_CURRENT_DATE */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 398: /* datetime_value_fct: SQL_TOKEN_CURRENT_TIMESTAMP */ + case 399: /* datetime_value_fct: SQL_TOKEN_CURRENT_TIMESTAMP */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 399: /* datetime_value_fct: SQL_TOKEN_CURRENT_TIME */ + case 400: /* datetime_value_fct: SQL_TOKEN_CURRENT_TIME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 400: /* datetime_value_fct: SQL_TOKEN_DATE string_value_exp */ + case 401: /* datetime_value_fct: SQL_TOKEN_DATE string_value_exp */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4588,7 +4598,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 401: /* datetime_value_fct: SQL_TOKEN_TIMESTAMP string_value_exp */ + case 402: /* datetime_value_fct: SQL_TOKEN_TIMESTAMP string_value_exp */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4596,7 +4606,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 402: /* datetime_value_fct: SQL_TOKEN_TIME string_value_exp */ + case 403: /* datetime_value_fct: SQL_TOKEN_TIME string_value_exp */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4604,52 +4614,52 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 403: /* datetime_factor: datetime_primary */ + case 404: /* datetime_factor: datetime_primary */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 404: /* datetime_term: datetime_factor */ + case 405: /* datetime_term: datetime_factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 405: /* datetime_value_exp: datetime_term */ + case 406: /* datetime_value_exp: datetime_term */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 406: /* value_exp_commalist: value_exp */ + case 407: /* value_exp_commalist: value_exp */ {(yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 407: /* value_exp_commalist: value_exp_commalist ',' value_exp */ + case 408: /* value_exp_commalist: value_exp_commalist ',' value_exp */ {(yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode);} break; - case 409: /* function_args_commalist: function_arg */ + case 410: /* function_args_commalist: function_arg */ { (yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 410: /* function_args_commalist: function_args_commalist ',' function_arg */ + case 411: /* function_args_commalist: function_args_commalist ',' function_arg */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 417: /* concatenation: char_value_exp '+' char_factor */ + case 418: /* concatenation: char_value_exp '+' char_factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4658,7 +4668,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 418: /* concatenation: value_exp SQL_CONCAT value_exp */ + case 419: /* concatenation: value_exp SQL_CONCAT value_exp */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4667,7 +4677,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 421: /* derived_column: value_exp as_clause */ + case 422: /* derived_column: value_exp as_clause */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4675,21 +4685,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 422: /* table_node: qualified_class_name */ + case 423: /* table_node: qualified_class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 423: /* table_node: tablespace_qualified_class_name */ + case 424: /* table_node: tablespace_qualified_class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 424: /* tablespace_qualified_class_name: SQL_TOKEN_NAME '.' qualified_class_name */ + case 425: /* tablespace_qualified_class_name: SQL_TOKEN_NAME '.' qualified_class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4698,7 +4708,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 425: /* qualified_class_name: SQL_TOKEN_NAME '.' class_name */ + case 426: /* qualified_class_name: SQL_TOKEN_NAME '.' class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4707,7 +4717,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 426: /* qualified_class_name: SQL_TOKEN_NAME ':' class_name */ + case 427: /* qualified_class_name: SQL_TOKEN_NAME ':' class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4716,14 +4726,14 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 427: /* class_name: SQL_TOKEN_NAME */ + case 428: /* class_name: SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 428: /* table_node_ref: table_node_with_opt_member_func_call table_primary_as_range_column */ + case 429: /* table_node_ref: table_node_with_opt_member_func_call table_primary_as_range_column */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4731,35 +4741,35 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 429: /* table_node_with_opt_member_func_call: table_node_path */ + case 430: /* table_node_with_opt_member_func_call: table_node_path */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 430: /* table_node_path: table_node_path_entry */ + case 431: /* table_node_path: table_node_path_entry */ { (yyval.pParseNode) = SQL_NEW_DOTLISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 431: /* table_node_path: table_node_path '.' table_node_path_entry */ + case 432: /* table_node_path: table_node_path '.' table_node_path_entry */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 432: /* table_node_path: table_node_path ':' table_node_path_entry */ + case 433: /* table_node_path: table_node_path ':' table_node_path_entry */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 433: /* table_node_path_entry: SQL_TOKEN_NAME opt_member_function_args */ + case 434: /* table_node_path_entry: SQL_TOKEN_NAME opt_member_function_args */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4767,11 +4777,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 434: /* opt_member_function_args: %empty */ + case 435: /* opt_member_function_args: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 435: /* opt_member_function_args: '(' function_args_commalist ')' */ + case 436: /* opt_member_function_args: '(' function_args_commalist ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -4780,25 +4790,25 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 436: /* opt_column_array_idx: %empty */ + case 437: /* opt_column_array_idx: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 437: /* opt_column_array_idx: SQL_TOKEN_ARRAY_INDEX */ + case 438: /* opt_column_array_idx: SQL_TOKEN_ARRAY_INDEX */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 438: /* property_path: property_path_entry */ + case 439: /* property_path: property_path_entry */ { (yyval.pParseNode) = SQL_NEW_DOTLISTRULE; (yyval.pParseNode)->append ((yyvsp[0].pParseNode)); } break; - case 439: /* property_path: property_path '.' property_path_entry */ + case 440: /* property_path: property_path '.' property_path_entry */ { auto last = (yyvsp[-2].pParseNode)->getLast(); if (last) @@ -4815,7 +4825,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 440: /* property_path_entry: SQL_TOKEN_NAME opt_column_array_idx */ + case 441: /* property_path_entry: SQL_TOKEN_NAME opt_column_array_idx */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4823,21 +4833,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 441: /* property_path_entry: '*' */ + case 442: /* property_path_entry: '*' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode) = CREATE_NODE("*", SQL_NODE_PUNCTUATION)); } break; - case 442: /* property_path_entry: SQL_TOKEN_DOLLAR */ + case 443: /* property_path_entry: SQL_TOKEN_DOLLAR */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode) = CREATE_NODE("$", SQL_NODE_PUNCTUATION)); } break; - case 443: /* column_ref: property_path opt_extract_value */ + case 444: /* column_ref: property_path opt_extract_value */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4845,7 +4855,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 448: /* simple_case: SQL_TOKEN_CASE case_operand simple_when_clause_list else_clause SQL_TOKEN_END */ + case 449: /* simple_case: SQL_TOKEN_CASE case_operand simple_when_clause_list else_clause SQL_TOKEN_END */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4856,7 +4866,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 449: /* searched_case: SQL_TOKEN_CASE searched_when_clause_list else_clause SQL_TOKEN_END */ + case 450: /* searched_case: SQL_TOKEN_CASE searched_when_clause_list else_clause SQL_TOKEN_END */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4866,21 +4876,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 450: /* simple_when_clause_list: simple_when_clause */ + case 451: /* simple_when_clause_list: simple_when_clause */ { (yyval.pParseNode) = SQL_NEW_LISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 451: /* simple_when_clause_list: searched_when_clause_list simple_when_clause */ + case 452: /* simple_when_clause_list: searched_when_clause_list simple_when_clause */ { (yyvsp[-1].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-1].pParseNode); } break; - case 452: /* simple_when_clause: SQL_TOKEN_WHEN when_operand_list SQL_TOKEN_THEN result */ + case 453: /* simple_when_clause: SQL_TOKEN_WHEN when_operand_list SQL_TOKEN_THEN result */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4890,31 +4900,31 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 453: /* when_operand_list: when_operand */ + case 454: /* when_operand_list: when_operand */ {(yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 454: /* when_operand_list: when_operand_list ',' when_operand */ + case 455: /* when_operand_list: when_operand_list ',' when_operand */ {(yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode);} break; - case 461: /* searched_when_clause_list: searched_when_clause */ + case 462: /* searched_when_clause_list: searched_when_clause */ { (yyval.pParseNode) = SQL_NEW_LISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 462: /* searched_when_clause_list: searched_when_clause_list searched_when_clause */ + case 463: /* searched_when_clause_list: searched_when_clause_list searched_when_clause */ { (yyvsp[-1].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-1].pParseNode); } break; - case 463: /* searched_when_clause: SQL_TOKEN_WHEN search_condition SQL_TOKEN_THEN result */ + case 464: /* searched_when_clause: SQL_TOKEN_WHEN search_condition SQL_TOKEN_THEN result */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4924,11 +4934,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 464: /* else_clause: %empty */ + case 465: /* else_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 465: /* else_clause: SQL_TOKEN_ELSE result */ + case 466: /* else_clause: SQL_TOKEN_ELSE result */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4936,7 +4946,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 469: /* parameter: ':' SQL_TOKEN_NAME */ + case 470: /* parameter: ':' SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE(":", SQL_NODE_PUNCTUATION)); @@ -4944,20 +4954,20 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 470: /* parameter: '?' */ + case 471: /* parameter: '?' */ { (yyval.pParseNode) = SQL_NEW_RULE; // test (yyval.pParseNode)->append((yyvsp[0].pParseNode) = CREATE_NODE("?", SQL_NODE_PUNCTUATION)); } break; - case 471: /* range_variable: %empty */ + case 472: /* range_variable: %empty */ { (yyval.pParseNode) = SQL_NEW_RULE; } break; - case 472: /* range_variable: opt_as SQL_TOKEN_NAME */ + case 473: /* range_variable: opt_as SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4965,11 +4975,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 473: /* opt_ecsqloptions_clause: %empty */ + case 474: /* opt_ecsqloptions_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 475: /* ecsqloptions_clause: SQL_TOKEN_ECSQLOPTIONS ecsqloptions_list */ + case 476: /* ecsqloptions_clause: SQL_TOKEN_ECSQLOPTIONS ecsqloptions_list */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4977,28 +4987,28 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 476: /* ecsqloptions_list: ecsqloptions_list ecsqloption */ + case 477: /* ecsqloptions_list: ecsqloptions_list ecsqloption */ { (yyvsp[-1].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-1].pParseNode); } break; - case 477: /* ecsqloptions_list: ecsqloption */ + case 478: /* ecsqloptions_list: ecsqloption */ { (yyval.pParseNode) = SQL_NEW_LISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 478: /* ecsqloption: SQL_TOKEN_NAME */ + case 479: /* ecsqloption: SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 479: /* ecsqloption: SQL_TOKEN_NAME SQL_EQUAL ecsqloptionvalue */ + case 480: /* ecsqloption: SQL_TOKEN_NAME SQL_EQUAL ecsqloptionvalue */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); diff --git a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y index 4a86f59dbcf..c8e343622f1 100644 --- a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y +++ b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y @@ -920,6 +920,14 @@ boolean_test: $$->append($3); $$->append($4); } + | boolean_primary SQL_TOKEN_IS sql_not column_ref + { + $$ = SQL_NEW_RULE; + $$->append($1); + $$->append($2); + $$->append($3); + $$->append($4); + } ; boolean_factor: boolean_test diff --git a/iModelCore/ECDb/PublicAPI/ECDb/ECDb.h b/iModelCore/ECDb/PublicAPI/ECDb/ECDb.h index e2d8fee82a3..a5b46f08309 100644 --- a/iModelCore/ECDb/PublicAPI/ECDb/ECDb.h +++ b/iModelCore/ECDb/PublicAPI/ECDb/ECDb.h @@ -323,7 +323,7 @@ struct EXPORT_VTABLE_ATTRIBUTE ECDb : Db // e.g. Remove a sql function or change required argument or format of its return value. // Sub1: Backward compatible change to 'Syntax'. For example adding new syntax/functions but not breaking any existing. // Sub2: Backward compatible change to 'Runtime'. For example adding a new sql function. - static BeVersion GetECSqlVersion() { return BeVersion(2, 0, 3, 2); } + static BeVersion GetECSqlVersion() { return BeVersion(2, 0, 4, 0); } //! Gets the current version of the ECDb profile static ProfileVersion CurrentECDbProfileVersion() { return ProfileVersion(4, 0, 0, 5); } diff --git a/iModelCore/ECDb/Tests/NonPublished/ECDbTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECDbTests.cpp index dc5819276e3..6f69f748d94 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECDbTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECDbTests.cpp @@ -689,7 +689,7 @@ TEST_F(ECDbTestFixture, GetAndChangeGUIDForDb) //+---------------+---------------+---------------+---------------+---------------+------ TEST_F(ECDbTestFixture, CurrentECSqlVersion) { - BeVersion expectedVersion (2, 0, 3, 2); + BeVersion expectedVersion (2, 0, 4, 0); ASSERT_EQ(ECDb::GetECSqlVersion(), expectedVersion); } diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp index 53505a3b27b..0d94abbe58d 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp @@ -4207,6 +4207,51 @@ TEST_F(ECSqlStatementTestFixture, WrapWhereClauseInParams) ASSERT_TRUE(nativeSql.find("WHERE ([Customer].[Country]='USA' OR [Customer].[Country]='DUBAI' AND [Customer].[ContactTitle]='AM')") != nativeSql.npos); } +/*---------------------------------------------------------------------------------**//** +* @bsimethod ++---------------+---------------+---------------+---------------+---------------+------*/ +TEST_F(ECSqlStatementTestFixture, IsAndIsNotOperatorNullSafeSemantics) + { + ASSERT_EQ(BentleyStatus::SUCCESS, SetupECDb("IsOperatorSemantics.ecdb", SchemaItem( + R"xml( + + + + + + )xml"))); + + // (S1, S2): equal-nonnull, different, both-null, one-null, the-other-null + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2) VALUES('a','a')")); + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2) VALUES('a','b')")); + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2) VALUES(NULL,NULL)")); + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2) VALUES(NULL,'b')")); + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2) VALUES('a',NULL)")); + + auto count = [this](Utf8CP whereClause) -> int + { + ECSqlStatement stmt; + EXPECT_EQ(ECSqlStatus::Success, stmt.Prepare(m_ecdb, Utf8PrintfString("SELECT COUNT(*) FROM ts.Foo WHERE %s", whereClause).c_str())) << whereClause; + EXPECT_EQ(BE_SQLITE_ROW, stmt.Step()) << whereClause; + return stmt.GetValueInt(0); + }; + + // null-safe equality: matches ('a','a') and (NULL,NULL) + EXPECT_EQ(2, count("S1 IS S2")); + // null-safe inequality: matches ('a','b'), (NULL,'b'), ('a',NULL) + EXPECT_EQ(3, count("S1 IS NOT S2")); + // contrast: regular '=' treats NULL comparisons as unknown -> only ('a','a') + EXPECT_EQ(1, count("S1 = S2")); + // NULL literal operand on either side + EXPECT_EQ(2, count("S1 IS NULL")); + EXPECT_EQ(3, count("S1 IS NOT NULL")); + EXPECT_EQ(2, count("NULL IS S2")); + + // operands of incompatible types are rejected (string vs point) + ECSqlStatement bad; + EXPECT_NE(ECSqlStatus::Success, bad.Prepare(m_ecdb, "SELECT 1 FROM ts.Foo WHERE S1 IS P1")); + } + //--------------------------------------------------------------------------------------- // @bsimethod //+---------------+---------------+---------------+---------------+---------------+------ diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp index ebae5bb1413..5d7de3cb73b 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp @@ -1274,4 +1274,62 @@ TEST_F(ECSqlToSqlGenerationTests, SelectOnlyRequiredPropertiesOnSelfJoin) ASSERT_EQ(BE_SQLITE_ROW, sqlStmt.Step()); } } + +//--------------------------------------------------------------------------------------- +// @bsimethod +//+---------------+---------------+---------------+---------------+---------------+------ +TEST_F(ECSqlToSqlGenerationTests, IsAndIsNotOperatorBetweenOperands) + { + ASSERT_EQ(BentleyStatus::SUCCESS, SetupECDb("IsAndIsNotOperator.ecdb", SchemaItem( + R"xml( + + + + + + + + + + + + + + + + + + )xml"))); + + auto assertWhere = [this](Utf8CP ecsql, Utf8CP expectedWhereClause) + { + Utf8String sql = GetHelper().ECSqlToSql(ecsql); + EXPECT_TRUE(sql.Contains(expectedWhereClause)) << "ECSql: " << ecsql << "\nSql: " << sql.c_str() + << "\nExpected to contain: " << expectedWhereClause; + }; + + // single primitive column operands: IS -> "IS", IS NOT -> "IS NOT" (space wrapped) + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS S2", "WHERE [Foo].[S1] IS [Foo].[S2]"); + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS NOT S2", "WHERE [Foo].[S1] IS NOT [Foo].[S2]"); + + // NULL literal on either side (the new general path and the existing test_for_null path) + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS NULL", "WHERE [Foo].[S1] IS NULL"); + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS NOT NULL", "WHERE [Foo].[S1] IS NOT NULL"); + assertWhere("SELECT 1 FROM ts.Foo WHERE NULL IS S1", "WHERE NULL IS [Foo].[S1]"); + + // multi-column point operands: IS expands column-wise with AND, IS NOT with OR + assertWhere("SELECT 1 FROM ts.Foo WHERE P1 IS P2", + "WHERE ([Foo].[P1_X] IS [Foo].[P2_X] AND [Foo].[P1_Y] IS [Foo].[P2_Y] AND [Foo].[P1_Z] IS [Foo].[P2_Z])"); + assertWhere("SELECT 1 FROM ts.Foo WHERE P1 IS NOT P2", + "WHERE ([Foo].[P1_X] IS NOT [Foo].[P2_X] OR [Foo].[P1_Y] IS NOT [Foo].[P2_Y] OR [Foo].[P1_Z] IS NOT [Foo].[P2_Z])"); + + // multi-column navigation operands: IS expands column-wise with AND, IS NOT with OR + assertWhere("SELECT 1 FROM ts.Foo WHERE ParentA IS ParentB", + "WHERE ([Foo].[ParentAId] IS [Foo].[ParentBId] AND [Foo].[ParentARelECClassId] IS [Foo].[ParentBRelECClassId])"); + assertWhere("SELECT 1 FROM ts.Foo WHERE ParentA IS NOT ParentB", + "WHERE ([Foo].[ParentAId] IS NOT [Foo].[ParentBId] OR [Foo].[ParentARelECClassId] IS NOT [Foo].[ParentBRelECClassId])"); + + // regression: the existing IS (ClassName) type predicate is unaffected + EXPECT_TRUE(GetHelper().ECSqlToSql("SELECT 1 FROM ts.Foo WHERE ECClassId IS (ts.Foo)").Contains("ec_cache_ClassHierarchy")); + } END_ECDBUNITTESTS_NAMESPACE From 82446410a485eb65ff552b243f06b68e4fa3c0f5 Mon Sep 17 00:00:00 2001 From: Affan Khan Date: Tue, 23 Jun 2026 11:51:51 -0400 Subject: [PATCH 2/7] Refactor SQL parser build scripts to suppress known bison conflicts warnings --- iModelCore/ECDb/ECDb/ECSql/Parser/sqlflex.l | 4 ++-- iModelCore/ECDb/Scripts/BuildECSqlParser.bat | 4 +++- iModelCore/ECDb/Scripts/BuildECSqlParser.sh | 18 +++++++++++++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlflex.l b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlflex.l index 9068f2ee43a..b990de105f6 100644 --- a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlflex.l +++ b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlflex.l @@ -285,7 +285,7 @@ WINDOW {SQL_NEW_KEYWORD(SQL_TOKEN_WINDOW); } [-+*/%:(),.;?{}&|~] { return yytext[0]; } -[A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375_][A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375_0-9]* {return gatherName(yyscanner, yytext);} +(?-i:[A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375_][A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375_0-9]*) {return gatherName(yyscanner, yytext);} ([0-9]+) {SQL_NEW_INTNUM; } (0[Xx][0-9a-fA-F]+) {SQL_NEW_INTNUM; } @@ -296,7 +296,7 @@ WINDOW {SQL_NEW_KEYWORD(SQL_TOKEN_WINDOW); } [0-9]+"."[0-9]*[eE][+-]?[0-9]+ | "."[0-9]+[eE][+-]?[0-9]+ {SQL_NEW_APPROXNUM; } -[A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375][A-Za-z0-9_%.,*?\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375]* {return gatherNamePre(yyscanner,yytext);} +(?-i:[A-Za-z\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375][A-Za-z0-9_%.,*?\200-\277\300-\337\340-\357\360-\367\370-\373\374-\375]*) {return gatherNamePre(yyscanner,yytext);} ([0-9]+) {SQL_NEW_INTNUM; } ([0-9]{1,3}(","[0-9]{3})+) {SQL_NEW_INTNUM; } diff --git a/iModelCore/ECDb/Scripts/BuildECSqlParser.bat b/iModelCore/ECDb/Scripts/BuildECSqlParser.bat index fbde0437dc7..b87a9f1de24 100644 --- a/iModelCore/ECDb/Scripts/BuildECSqlParser.bat +++ b/iModelCore/ECDb/Scripts/BuildECSqlParser.bat @@ -38,5 +38,7 @@ ECHO Compiling Lexical Analyzer ... %flex_tool% -i -8 -PSQLyy -L -o%parse_dir%\SqlFlex.cpp %parse_dir%\SQLflex.l ECHO Compiling Parser ... -%bison_tool% -k -l -pSQLyy -bSql -o %parse_dir%\SqlBison.cpp --defines=%parse_dir%\SqlBison.h %parse_dir%\SQlbison.y +REM The inherited SQL grammar has many expected shift/reduce and reduce/reduce conflicts +REM that are resolved by bison defaults; -Wno-conflicts-sr/-rr silence those warnings. +%bison_tool% -k -l -pSQLyy -bSql -Wno-conflicts-sr -Wno-conflicts-rr -o %parse_dir%\SqlBison.cpp --defines=%parse_dir%\SqlBison.h %parse_dir%\SQlbison.y diff --git a/iModelCore/ECDb/Scripts/BuildECSqlParser.sh b/iModelCore/ECDb/Scripts/BuildECSqlParser.sh index a2a45e0ca32..f1421fe89f9 100755 --- a/iModelCore/ECDb/Scripts/BuildECSqlParser.sh +++ b/iModelCore/ECDb/Scripts/BuildECSqlParser.sh @@ -99,15 +99,23 @@ echo "Compiling Lexical Analyzer ..." # --------------------------------------------------------------------------- # Compile Parser (mirrors: win_bison -k -l -pSQLyy -bSql -o ... --defines=...) -# -l / --no-lines suppress #line directives -# -pSQLyy prefix all yy symbols with SQLyy -# -bSql file-prefix (not needed when -o/--defines are explicit, -# but kept for parity with the .bat) +# -l / --no-lines suppress #line directives +# -pSQLyy prefix all yy symbols with SQLyy +# -bSql file-prefix (not needed when -o/--defines are explicit, +# but kept for parity with the .bat) +# -Wno-conflicts-sr silence the grammar's known shift/reduce conflicts +# -Wno-conflicts-rr silence the grammar's known reduce/reduce conflicts # Note: -k (report conflicts as errors) was a very old flag; modern bison # ignores it, so it is omitted here. +# Note: this is an inherited (OpenOffice/LibreOffice) SQL grammar whose many +# shift/reduce and reduce/reduce conflicts are resolved by bison's default +# rules and are expected. They cannot be declared away with %expect / +# %expect-rr (%expect-rr is GLR-only, and %expect makes the reduce/reduce +# conflicts a hard error on this LALR parser), so the warnings are +# suppressed here without altering the generated parser tables. # --------------------------------------------------------------------------- echo "Compiling Parser ..." -"$BISON" -l -pSQLyy -bSql \ +"$BISON" -l -pSQLyy -bSql -Wno-conflicts-sr -Wno-conflicts-rr \ -o "$PARSE_DIR/SqlBison.cpp" \ --defines="$PARSE_DIR/SqlBison.h" \ "$PARSE_DIR/sqlbison.y" From 7c28090bd9c3576bca17c28ea5b3b2b0133822bf Mon Sep 17 00:00:00 2001 From: Affan Khan Date: Wed, 24 Jun 2026 12:05:18 -0400 Subject: [PATCH 3/7] Enhance ECSQL IS/IS NOT operator to support any value expression - Updated the ECSQL parser to allow the IS and IS NOT operators to accept any value expression on either side, not just NULL literals or column references. This includes support for string literals, function calls, and parameter bindings. - Modified existing tests to reflect the new behavior, ensuring that comparisons using the IS operator with various value expressions are handled correctly. - Adjusted SQL generation tests to confirm that the new semantics are correctly translated into SQL. --- iModelCore/ECDb/CHANGES.md | 5 +- iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp | 11 +- .../ECDb/ECDb/ECSql/Parser/SqlBison.cpp | 1471 +++++++++-------- iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y | 33 +- .../Tests/NonPublished/ECSqlPrepareTests.cpp | 41 +- .../NonPublished/ECSqlStatementTests.cpp | 26 + .../ECSqlToSqlGenerationTests.cpp | 5 + 7 files changed, 876 insertions(+), 716 deletions(-) diff --git a/iModelCore/ECDb/CHANGES.md b/iModelCore/ECDb/CHANGES.md index 6214b2a57a6..31e400706a9 100644 --- a/iModelCore/ECDb/CHANGES.md +++ b/iModelCore/ECDb/CHANGES.md @@ -9,10 +9,11 @@ This document including important changes to syntax or file format. ## ## `06/23/2026`: Added `IS` / `IS NOT` operator between operands * ECSql version change `2.0.3.2` -> `2.0.4.0`. -* The `IS` and `IS NOT` operators can now be used between two operands, e.g. `prop1 IS [NOT] prop2`, where each operand may be a property or the `NULL` literal. These map to SQLite's null-safe comparison operators (`NULL IS NULL` is true, `1 IS NULL` is false). -* Previously `IS` / `IS NOT` only supported the right-hand operands `NULL`, the boolean literals `TRUE`/`FALSE`/`UNKNOWN`, and the class type predicate `IS (ClassName)`. Those forms are unchanged. +* The `IS` and `IS NOT` operators can now be used between two operands, e.g. `prop1 IS [NOT] prop2`. Each operand may be any value expression — a property, the `NULL` literal, a constant, a parameter, a function call, an arithmetic expression, etc. These map to SQLite's null-safe comparison operators (`NULL IS NULL` is true, `1 IS NULL` is false). +* Previously `IS` / `IS NOT` only supported the right-hand operands `NULL`, the boolean literals `TRUE`/`FALSE`/`UNKNOWN`, and the class type predicate `IS (ClassName)`. Those forms are unchanged: a right-hand operand that is exactly `NULL`/`TRUE`/`FALSE`/`UNKNOWN`, or a parenthesized `(ClassName)`, keeps its original meaning. (Write a parenthesized value expression without the outer parentheses, e.g. `x IS y + 1` rather than `x IS (y + 1)`, when it could be mistaken for a type predicate.) * For multi-column operands (e.g. `Point2d`/`Point3d` and navigation properties), the comparison is expanded column-wise: `IS` joins the per-column comparisons with `AND`, `IS NOT` joins them with `OR` (consistent with `=` and `<>`). * Example: `SELECT * FROM bis.Element WHERE CodeValue IS NOT UserLabel` +* Example: `SELECT * FROM bis.Element WHERE CodeValue IS json_extract(JsonProperties, '$.code')` ## ## `04/24/2026`: Allow optional ON clause with CROSS JOIN * ECSql version change `2.0.3.1` -> `2.0.3.2`. diff --git a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp index 8c1cc9506a0..25aa056a060 100644 --- a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp +++ b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp @@ -2440,9 +2440,16 @@ BentleyStatus ECSqlParser::ParseSearchCondition(std::unique_ptr& exp const BooleanSqlOperator op = isNot ? BooleanSqlOperator::IsNot : BooleanSqlOperator::Is; OSQLParseNode const* lhsNode = parseNode->getChild(0/*boolean_primary*/); - OSQLParseNode const* rhsNode = parseNode->getChild(3/*truth_value | column_ref*/); + OSQLParseNode const* rhsNode = parseNode->getChild(3/*truth_value | value_exp*/); - if (SQL_ISRULE(rhsNode, column_ref)) + // The right-hand operand of 'X IS [NOT] ' is either a "truth value" + // (NULL/TRUE/FALSE/UNKNOWN or the (ClassName) type predicate), which keeps the original + // boolean-predicate semantics, or any other value expression, which is a null-safe comparison. + const bool rhsIsTruthValue = SQL_ISRULE(rhsNode, type_predicate) + || SQL_ISTOKEN(rhsNode, NULL) || SQL_ISTOKEN(rhsNode, TRUE) + || SQL_ISTOKEN(rhsNode, FALSE) || SQL_ISTOKEN(rhsNode, UNKNOWN); + + if (!rhsIsTruthValue) { // X IS [NOT] Y : both sides are value expressions compared with SQLite's null-safe IS operator. // The left side is parsed as a value expression (not a boolean predicate) so that it keeps its real diff --git a/iModelCore/ECDb/ECDb/ECSql/Parser/SqlBison.cpp b/iModelCore/ECDb/ECDb/ECSql/Parser/SqlBison.cpp index 99d45ea2e4d..561f168d1fe 100644 --- a/iModelCore/ECDb/ECDb/ECSql/Parser/SqlBison.cpp +++ b/iModelCore/ECDb/ECDb/ECSql/Parser/SqlBison.cpp @@ -896,16 +896,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 31 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 3095 +#define YYLAST 3430 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 173 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 220 /* YYNRULES -- Number of rules. */ -#define YYNRULES 483 +#define YYNRULES 485 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 768 +#define YYNSTATES 778 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 405 @@ -982,42 +982,42 @@ static const yytype_int16 yyrline[] = 754, 764, 767, 773, 774, 778, 781, 791, 792, 797, 804, 805, 812, 813, 818, 826, 827, 834, 842, 850, 858, 862, 871, 872, 882, 883, 891, 892, 893, 894, - 895, 898, 899, 900, 901, 902, 903, 904, 914, 915, - 923, 933, 934, 942, 943, 952, 953, 963, 972, 977, - 985, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, - 1008, 1015, 1022, 1047, 1048, 1049, 1050, 1051, 1052, 1053, - 1061, 1071, 1079, 1089, 1099, 1105, 1111, 1133, 1158, 1159, - 1166, 1175, 1181, 1197, 1201, 1209, 1218, 1224, 1240, 1249, - 1258, 1267, 1277, 1278, 1279, 1283, 1291, 1297, 1305, 1312, - 1323, 1328, 1335, 1339, 1340, 1341, 1342, 1343, 1345, 1357, - 1369, 1381, 1397, 1398, 1404, 1408, 1409, 1412, 1413, 1414, - 1415, 1418, 1430, 1431, 1432, 1433, 1440, 1448, 1460, 1461, - 1465, 1479, 1495, 1511, 1520, 1528, 1537, 1555, 1556, 1565, - 1566, 1567, 1568, 1569, 1570, 1574, 1579, 1584, 1591, 1599, - 1600, 1603, 1604, 1609, 1610, 1618, 1626, 1639, 1649, 1658, - 1662, 1673, 1680, 1687, 1688, 1689, 1690, 1691, 1695, 1706, - 1707, 1713, 1724, 1736, 1737, 1741, 1746, 1757, 1758, 1762, - 1776, 1777, 1787, 1791, 1792, 1796, 1801, 1802, 1811, 1814, - 1820, 1830, 1834, 1852, 1853, 1857, 1862, 1863, 1874, 1875, - 1885, 1888, 1894, 1904, 1905, 1912, 1918, 1924, 1935, 1936, - 1937, 1941, 1942, 1946, 1952, 1959, 1968, 1977, 1988, 1989, - 1995, 1999, 2000, 2009, 2010, 2019, 2028, 2029, 2030, 2031, - 2036, 2037, 2046, 2047, 2048, 2052, 2066, 2067, 2068, 2071, - 2072, 2075, 2087, 2088, 2092, 2095, 2099, 2100, 2101, 2102, - 2103, 2104, 2105, 2106, 2107, 2108, 2109, 2110, 2111, 2112, - 2113, 2114, 2118, 2123, 2133, 2142, 2143, 2147, 2159, 2160, - 2167, 2168, 2176, 2177, 2178, 2179, 2180, 2181, 2182, 2189, - 2193, 2197, 2198, 2204, 2210, 2219, 2220, 2227, 2234, 2244, - 2245, 2252, 2262, 2263, 2270, 2277, 2284, 2294, 2301, 2306, - 2311, 2316, 2322, 2328, 2337, 2344, 2352, 2360, 2363, 2369, - 2373, 2378, 2386, 2387, 2388, 2392, 2396, 2397, 2400, 2407, - 2417, 2420, 2424, 2434, 2439, 2446, 2455, 2463, 2472, 2480, - 2489, 2497, 2502, 2507, 2515, 2524, 2525, 2535, 2536, 2544, - 2549, 2567, 2573, 2578, 2586, 2598, 2602, 2606, 2607, 2611, - 2622, 2632, 2637, 2644, 2654, 2657, 2662, 2663, 2664, 2665, - 2666, 2667, 2670, 2675, 2682, 2692, 2693, 2701, 2705, 2709, - 2713, 2719, 2727, 2730, 2740, 2741, 2745, 2754, 2759, 2767, - 2773, 2783, 2784, 2785 + 895, 898, 899, 900, 901, 902, 903, 904, 914, 916, + 928, 938, 939, 947, 948, 957, 958, 968, 977, 982, + 994, 1000, 1009, 1021, 1022, 1023, 1024, 1025, 1026, 1027, + 1028, 1029, 1035, 1042, 1049, 1074, 1075, 1076, 1077, 1078, + 1079, 1080, 1088, 1098, 1106, 1116, 1126, 1132, 1138, 1160, + 1185, 1186, 1193, 1202, 1208, 1224, 1228, 1236, 1245, 1251, + 1267, 1276, 1285, 1294, 1304, 1305, 1306, 1310, 1318, 1324, + 1332, 1339, 1350, 1355, 1362, 1366, 1367, 1368, 1369, 1370, + 1372, 1384, 1396, 1408, 1424, 1425, 1431, 1435, 1436, 1439, + 1440, 1441, 1442, 1445, 1457, 1458, 1459, 1460, 1467, 1475, + 1487, 1488, 1492, 1506, 1522, 1538, 1547, 1555, 1564, 1582, + 1583, 1592, 1593, 1594, 1595, 1596, 1597, 1601, 1606, 1611, + 1618, 1626, 1627, 1630, 1631, 1636, 1637, 1645, 1653, 1666, + 1676, 1685, 1689, 1700, 1707, 1714, 1715, 1716, 1717, 1718, + 1722, 1733, 1734, 1740, 1751, 1763, 1764, 1768, 1773, 1784, + 1785, 1789, 1803, 1804, 1814, 1818, 1819, 1823, 1828, 1829, + 1838, 1841, 1847, 1857, 1861, 1879, 1880, 1884, 1889, 1890, + 1901, 1902, 1912, 1915, 1921, 1931, 1932, 1939, 1945, 1951, + 1962, 1963, 1964, 1968, 1969, 1973, 1979, 1986, 1995, 2004, + 2015, 2016, 2022, 2026, 2027, 2036, 2037, 2046, 2055, 2056, + 2057, 2058, 2063, 2064, 2073, 2074, 2075, 2079, 2093, 2094, + 2095, 2098, 2099, 2102, 2114, 2115, 2119, 2122, 2126, 2127, + 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, + 2138, 2139, 2140, 2141, 2145, 2150, 2160, 2169, 2170, 2174, + 2186, 2187, 2194, 2195, 2203, 2204, 2205, 2206, 2207, 2208, + 2209, 2216, 2220, 2224, 2225, 2231, 2237, 2246, 2247, 2254, + 2261, 2271, 2272, 2279, 2289, 2290, 2297, 2304, 2311, 2321, + 2328, 2333, 2338, 2343, 2349, 2355, 2364, 2371, 2379, 2387, + 2390, 2396, 2400, 2405, 2413, 2414, 2415, 2419, 2423, 2424, + 2427, 2434, 2444, 2447, 2451, 2461, 2466, 2473, 2482, 2490, + 2499, 2507, 2516, 2524, 2529, 2534, 2542, 2551, 2552, 2562, + 2563, 2571, 2576, 2594, 2600, 2605, 2613, 2625, 2629, 2633, + 2634, 2638, 2649, 2659, 2664, 2671, 2681, 2684, 2689, 2690, + 2691, 2692, 2693, 2694, 2697, 2702, 2709, 2719, 2720, 2728, + 2732, 2736, 2740, 2746, 2754, 2757, 2767, 2768, 2772, 2781, + 2786, 2794, 2800, 2810, 2811, 2812 }; #endif @@ -1161,12 +1161,12 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-587) +#define YYPACT_NINF (-608) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-462) +#define YYTABLE_NINF (-464) #define yytable_value_is_error(Yyn) \ 0 @@ -1175,83 +1175,84 @@ yysymbol_name (yysymbol_kind_t yysymbol) STATE-NUM. */ static const yytype_int16 yypact[] = { - 667, 76, 79, 89, 92, 74, 148, 161, 191, 146, - 249, -587, -587, -587, -587, -587, -587, -587, 169, -587, - 259, 74, 78, -587, -587, 2412, -587, -587, 268, 2562, - 49, -587, -587, -587, -587, -587, -587, 266, 96, -587, - 109, 268, 88, 268, 295, -587, -587, 1362, 279, -587, - -587, -587, -587, -587, 87, -587, -587, 306, 315, -587, - 326, 332, -587, -587, 341, -587, -587, -587, -587, 2862, - 346, -587, -587, -587, -587, 2112, -587, -587, 2562, 2562, - 2562, 349, 362, -587, -587, -587, -587, 364, -587, -587, - -587, -587, -587, 366, 2862, 2862, 236, 323, -587, 377, - -587, 57, -587, -587, -587, -587, 381, -587, -11, 383, - -587, 251, -587, -587, 385, -587, 395, -587, 399, -587, - -587, -587, -587, -587, 193, 176, 271, -587, -587, -587, - -587, -587, 40, -587, 248, -587, -587, -587, -587, 52, - -587, -587, -587, -587, -587, -587, -587, 343, -587, 367, - -587, -587, 254, 239, 239, 327, -587, -587, -587, 153, - 417, 455, 259, -587, 374, 438, 440, 295, 33, 393, - 487, 489, 491, 37, -587, -587, -587, 2562, 47, 92, - 92, 912, -587, 2562, 912, -587, 280, -587, 410, 254, - -587, -587, -587, 505, 2562, 2562, 92, -587, -587, 45, - -587, 374, 2562, -587, -587, -587, -587, 1512, 92, 508, - 407, 2562, 2562, 545, 2712, 2712, 2712, 2712, 2712, 2712, - 2712, 2712, 2712, -587, 527, 2562, -587, -587, 441, 33, - 33, -587, 33, -587, 2562, -587, -587, -587, -587, -587, - -587, -587, 553, -587, 542, 465, -587, -587, 391, 157, - -587, 912, 465, -587, -587, -587, 240, -587, -587, 393, - 544, 435, -587, -587, 2562, 443, -587, -587, -587, 540, - 254, 568, 2562, 2562, 2562, 612, 762, 571, 552, 571, - -587, -587, -587, -587, -587, -587, 114, 196, 520, -587, - -587, 427, 44, -587, -587, 2562, -587, -587, -587, -587, - -587, -587, -587, -587, -587, -587, -587, -587, 357, 376, - 2888, 163, 2910, 576, -7, 2562, -587, 486, 912, 485, - -587, 410, -587, 580, 254, -587, -587, 581, 2562, 561, - 582, 80, 43, 564, 353, -587, -587, -587, -587, 536, - -587, -587, 2562, -587, 445, 2562, 374, 230, 585, -587, - 587, -587, -587, -587, -587, 193, 193, 176, 176, 176, - 176, -587, -587, -587, -587, 120, 68, -587, 428, -587, - -587, -587, 262, 572, -587, -587, 567, 575, 487, 591, - -587, 451, -587, 438, -587, -587, 33, 448, -587, 597, - 2975, -587, 598, 450, 452, 38, 35, -587, -587, 65, - -587, 539, -587, 605, 2562, 53, 2262, -587, -587, -587, - -587, -587, -587, -587, 552, 912, 2562, 912, -587, 2562, - 2562, -587, -587, 127, 70, -587, 2562, -587, 604, 606, - 611, 75, -587, 526, -587, -587, 2562, 618, 45, -587, - -587, -587, 564, 289, 622, 289, 325, -587, 565, -587, - -587, -587, -587, 276, 555, 569, 593, 583, 625, -587, - 2562, 634, 636, 617, -587, -587, -587, -587, -587, 2562, - 639, -587, -587, -587, 33, 465, 2562, 620, 624, 482, - 572, -587, 646, -587, 645, -587, -587, 462, 2562, 640, - -587, -587, -587, -587, -587, -587, -587, -587, -587, -587, - -587, -587, -587, -587, -587, -587, 629, -587, 652, -587, - -587, -587, -587, -587, 1362, -587, -587, 267, 13, 2562, - 528, -587, -587, -587, -587, 571, 48, -587, 653, 427, - 618, -587, 77, 1212, 2562, -587, 655, 2562, 656, 353, - 289, -587, 633, 295, 2562, -587, 641, -587, 564, 564, - 45, 602, -587, 45, 2562, 912, 529, -587, -587, -587, - -587, -587, 531, -587, 659, -587, -587, -587, -587, 254, - -587, -587, 794, -587, 157, 464, 648, -587, -587, 477, - 254, 2562, -587, -587, 516, -587, -587, -587, -587, 34, - -587, -587, -587, -587, -587, -587, -587, 2562, 666, 242, - -587, 2562, -587, -587, -587, -587, -587, -587, -587, -587, - -587, -587, -587, 479, 670, -587, -587, 436, 45, 238, - 669, 451, 617, 613, 647, 613, 2562, -587, -587, 57, - -587, 671, -587, -587, -587, 2562, 524, 2562, -587, 268, - 481, -587, 679, -587, 2562, -587, -587, 527, -587, 912, - -587, 353, 282, -587, -587, -587, -587, 688, -587, 664, - 663, 608, 33, 201, -587, -587, 254, -587, -587, -587, - 34, -587, 497, -587, 451, 527, 502, 289, 617, 705, - 1062, 2712, 465, -587, 706, -587, 566, -587, -587, -587, - 709, 1662, -587, -587, 527, 549, -587, -587, -587, -587, - -587, -587, 710, -587, 311, 256, -14, -587, 33, 164, - -587, -587, 1812, 584, 573, 588, -587, -587, -56, -587, - -587, 1062, -587, -587, 674, 674, 2712, -587, -587, -587, - -587, -587, -587, 586, 592, -587, -587, 563, -587, 98, - -587, -587, 81, -587, -587, -587, 522, -587, -587, 271, - -587, -587, 1962, -587, -587, -587, -587, 595, 601, -587, - -587, -587, 589, -587, -587, -587, -587, -587 + 68, 87, 41, 103, 72, 78, 145, 147, 167, 183, + 221, -608, -608, -608, -608, -608, -608, -608, 175, -608, + 201, 78, 82, -608, -608, 2762, -608, -608, 237, 2912, + 56, -608, -608, -608, -608, -608, -608, 224, 100, -608, + 69, 237, 92, 237, 262, -608, -608, 1412, 261, -608, + -608, -608, -608, -608, 143, -608, -608, 278, 292, -608, + 315, 337, -608, -608, 367, -608, -608, -608, -608, 3212, + 371, -608, -608, -608, -608, 2312, -608, -608, 2912, 2912, + 2912, 375, 382, -608, -608, -608, -608, 388, -608, -608, + -608, -608, -608, 391, 3212, 3212, 324, 276, -608, 327, + -608, 58, -608, -608, -608, -608, 395, -608, 2, 402, + -608, 260, -608, -608, 404, -608, 408, -608, 411, -608, + -608, -608, -608, -608, 284, 164, 335, -608, -608, -608, + -608, -608, 45, -608, 255, -608, -608, -608, -608, 64, + -608, -608, -608, -608, -608, -608, -608, 348, -608, 384, + -608, -608, 267, 67, 67, 334, -608, -608, -608, 173, + 417, 445, 201, -608, 364, 435, 455, 262, 47, 396, + 496, 499, 503, 36, -608, -608, -608, 2912, 46, 72, + 72, 962, -608, 2912, 962, -608, 329, -608, 414, 267, + -608, -608, -608, 511, 2912, 2912, 72, -608, -608, 48, + -608, 364, 2912, -608, -608, -608, -608, 1562, 72, 515, + 399, 2912, 2912, 521, 3062, 3062, 3062, 3062, 3062, 3062, + 3062, 3062, 3062, -608, 527, 2912, -608, -608, 449, 47, + 47, -608, 47, -608, 2912, -608, -608, -608, -608, -608, + -608, -608, 551, -608, 560, 498, -608, -608, 425, 238, + -608, 962, 498, -608, -608, -608, 308, -608, -608, 396, + 579, 441, -608, -608, 2912, 457, -608, -608, -608, 574, + 267, 602, 2912, 2912, 2912, 662, 812, 604, 585, 604, + -608, -608, -608, -608, -608, -608, 169, 182, 553, -608, + -608, 460, 55, -608, -608, 2912, -608, -608, -608, -608, + -608, -608, -608, -608, -608, -608, -608, -608, 193, 376, + 3238, 139, 3260, 613, 5, 2912, -608, 514, 962, 525, + -608, 414, -608, 615, 267, -608, -608, 619, 2912, 596, + 622, 90, 54, 611, 580, -608, -608, -608, -608, 575, + -608, -608, 2912, -608, 479, 2912, 364, 235, 624, -608, + 634, -608, -608, -608, -608, 284, 284, 164, 164, 164, + 164, -608, -608, -608, -608, 281, 74, -608, 475, -608, + -608, -608, 358, 618, -608, -608, 614, 625, 496, 642, + -608, 500, -608, 435, -608, -608, 47, 483, -608, 645, + 480, -608, 646, 492, 505, 59, 35, -608, -608, 222, + -608, 583, -608, 650, 2912, 218, 2462, -608, -608, -608, + -608, -608, -608, -608, 585, 962, 2912, 962, -608, 2912, + 2912, -608, -608, 229, 79, -608, 2912, -608, 649, 651, + 652, 81, -608, 559, -608, -608, 2912, 656, 48, -608, + -608, -608, 611, 349, 659, 349, 370, -608, 603, -608, + -608, -608, -608, 380, 594, 606, 636, 621, 665, -608, + 2912, 668, 669, 653, -608, -608, -608, -608, -608, 2912, + 672, -608, -608, -608, 47, 498, 2912, 654, 655, 516, + 618, -608, 684, -608, 683, -608, -608, 509, 2912, 677, + -608, -608, -608, -608, -608, -608, -608, -608, -608, -608, + -608, -608, -608, -608, -608, -608, 666, -608, 689, -608, + -608, -608, -608, -608, 1412, -608, -608, 300, 18, 2912, + 409, -608, -608, -608, -608, 604, 2612, -608, 691, 460, + 656, -608, 89, 1262, 2912, -608, 690, 2912, 694, 580, + 349, -608, 675, 262, 2912, -608, 676, -608, 611, 611, + 48, 643, -608, 48, 2912, 962, 565, -608, -608, -608, + -608, -608, 568, -608, 702, -608, -608, -608, -608, 267, + -608, -608, 502, -608, 238, 523, 685, -608, -608, 549, + 267, 2912, -608, -608, 555, -608, -608, -608, -608, 1712, + 605, 698, 755, -608, -608, -608, 267, 2912, 706, 258, + -608, 2912, -608, -608, -608, -608, -608, -608, -608, -608, + -608, -608, -608, 554, 710, -608, -608, 570, 48, 352, + 709, 500, 653, 644, 681, 644, 2912, 57, -608, -608, + -608, -608, -608, 58, -608, 713, -608, -608, -608, 2912, + 552, 2912, 415, 3212, 120, 557, -608, -608, 714, -608, + 2912, -608, -608, 527, -608, 962, -608, 580, 285, -608, + -608, -608, -608, 715, -608, 692, 687, 626, 47, 140, + -608, -608, -608, 267, -608, 237, 237, -608, 57, -608, + 561, -608, 500, 527, 522, 349, 653, 721, 1112, 3062, + 498, -608, 724, -608, 586, -608, -608, -608, 722, 1862, + -608, -608, -608, -608, 527, 567, -608, -608, -608, -608, + -608, -608, 728, -608, 174, 283, 211, -608, 47, -7, + -608, -608, 2012, 600, 607, 612, -608, -608, -49, -608, + -608, 1112, -608, -608, 707, 707, 3062, -608, -608, -608, + -608, -608, -608, 610, 616, -608, -608, 592, -608, -20, + -608, -608, 177, -608, -608, -608, 537, -608, -608, 335, + -608, -608, 2162, -608, -608, -608, -608, 628, 623, -608, + -608, -608, 627, -608, -608, -608, -608, -608 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -1262,134 +1263,135 @@ static const yytype_int16 yydefact[] = 0, 25, 0, 0, 79, 107, 0, 0, 0, 2, 4, 63, 6, 62, 59, 60, 90, 61, 64, 26, 0, 107, 0, 80, 81, 0, 109, 108, 0, 0, - 10, 1, 3, 5, 68, 66, 67, 342, 0, 34, - 0, 0, 0, 0, 42, 424, 423, 0, 0, 471, - 207, 204, 205, 206, 437, 242, 239, 0, 0, 219, - 0, 0, 218, 244, 0, 243, 240, 220, 443, 0, - 0, 398, 400, 399, 241, 0, 203, 420, 0, 0, - 0, 0, 0, 273, 274, 277, 278, 0, 326, 327, - 328, 329, 229, 0, 0, 0, 442, 98, 344, 92, - 200, 216, 372, 215, 223, 373, 0, 224, 222, 0, - 377, 280, 264, 265, 0, 266, 0, 267, 0, 375, - 379, 380, 381, 385, 389, 392, 412, 404, 397, 405, - 406, 414, 212, 413, 415, 417, 421, 416, 202, 370, - 439, 374, 376, 446, 447, 448, 217, 0, 442, 0, - 75, 77, 78, 0, 0, 8, 11, 12, 343, 0, + 10, 1, 3, 5, 68, 66, 67, 344, 0, 34, + 0, 0, 0, 0, 42, 426, 425, 0, 0, 473, + 209, 206, 207, 208, 439, 244, 241, 0, 0, 221, + 0, 0, 220, 246, 0, 245, 242, 222, 445, 0, + 0, 400, 402, 401, 243, 0, 205, 422, 0, 0, + 0, 0, 0, 275, 276, 279, 280, 0, 328, 329, + 330, 331, 231, 0, 0, 0, 444, 98, 346, 92, + 202, 218, 374, 217, 225, 375, 0, 226, 224, 0, + 379, 282, 266, 267, 0, 268, 0, 269, 0, 377, + 381, 382, 383, 387, 391, 394, 414, 406, 399, 407, + 408, 416, 214, 415, 417, 419, 423, 418, 204, 372, + 441, 376, 378, 448, 449, 450, 219, 0, 444, 0, + 75, 77, 78, 0, 0, 8, 11, 12, 345, 0, 0, 0, 0, 35, 87, 0, 0, 42, 0, 0, - 0, 0, 0, 0, 470, 438, 441, 0, 79, 79, - 79, 57, 384, 0, 57, 469, 465, 462, 0, 0, - 401, 403, 402, 0, 0, 0, 79, 383, 382, 110, - 89, 87, 0, 210, 211, 209, 208, 0, 79, 0, + 0, 0, 0, 0, 472, 440, 443, 0, 79, 79, + 79, 57, 386, 0, 57, 471, 467, 464, 0, 0, + 403, 405, 404, 0, 0, 0, 79, 385, 384, 110, + 89, 87, 0, 212, 213, 211, 210, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 445, 0, 0, 422, 214, 0, 0, - 0, 444, 0, 74, 0, 15, 16, 17, 20, 21, - 19, 18, 0, 13, 0, 474, 65, 28, 0, 0, - 33, 57, 474, 88, 428, 427, 428, 425, 426, 0, - 437, 0, 39, 70, 0, 0, 199, 198, 378, 0, - 345, 0, 0, 0, 0, 57, 57, 0, 57, 0, - 167, 168, 164, 163, 166, 165, 0, 57, 138, 141, - 143, 145, 0, 131, 151, 0, 152, 176, 177, 158, - 182, 156, 187, 157, 153, 159, 154, 155, 132, 133, - 135, 136, 134, 0, 0, 0, 463, 0, 57, 465, - 451, 0, 262, 0, 468, 409, 467, 0, 0, 111, - 100, 0, 115, 0, 101, 259, 340, 339, 120, 122, - 201, 225, 0, 410, 0, 0, 0, 0, 269, 275, - 0, 261, 386, 387, 388, 390, 391, 395, 396, 393, - 394, 213, 419, 418, 440, 368, 87, 82, 0, 76, - 14, 22, 9, 0, 7, 475, 0, 0, 0, 0, - 29, 121, 69, 0, 71, 43, 0, 0, 197, 0, - 0, 234, 0, 0, 0, 0, 78, 58, 142, 0, - 195, 169, 196, 0, 0, 0, 0, 171, 174, 175, - 181, 186, 189, 190, 57, 57, 0, 57, 162, 0, - 0, 466, 450, 0, 77, 457, 0, 458, 176, 182, - 187, 0, 454, 0, 452, 268, 0, 237, 110, 114, - 113, 116, 0, 472, 435, 105, 430, 431, 0, 247, - 252, 245, 246, 251, 253, 0, 0, 124, 0, 226, - 0, 0, 0, 293, 282, 283, 260, 284, 285, 0, - 0, 276, 369, 371, 0, 474, 0, 0, 0, 479, - 476, 478, 0, 27, 30, 32, 38, 74, 0, 361, - 352, 351, 353, 354, 348, 349, 355, 350, 356, 360, - 346, 347, 357, 358, 359, 362, 365, 366, 0, 235, - 231, 232, 137, 180, 0, 185, 183, 178, 178, 0, - 0, 193, 192, 194, 161, 0, 0, 144, 0, 146, - 237, 464, 162, 57, 0, 449, 0, 0, 0, 102, - 105, 104, 0, 42, 0, 434, 0, 118, 0, 0, - 110, 0, 254, 110, 0, 57, 286, 227, 411, 233, - 281, 295, 296, 294, 270, 272, 83, 86, 84, 85, - 24, 23, 0, 477, 0, 0, 0, 364, 367, 0, - 407, 0, 173, 172, 0, 228, 191, 222, 188, 110, + 0, 0, 0, 447, 0, 0, 424, 216, 0, 0, + 0, 446, 0, 74, 0, 15, 16, 17, 20, 21, + 19, 18, 0, 13, 0, 476, 65, 28, 0, 0, + 33, 57, 476, 88, 430, 429, 430, 427, 428, 0, + 439, 0, 39, 70, 0, 0, 201, 200, 380, 0, + 347, 0, 0, 0, 0, 57, 57, 0, 57, 0, + 169, 170, 166, 165, 168, 167, 0, 57, 138, 141, + 143, 145, 0, 131, 153, 0, 154, 178, 179, 160, + 184, 158, 189, 159, 155, 161, 156, 157, 132, 133, + 135, 136, 134, 0, 0, 0, 465, 0, 57, 467, + 453, 0, 264, 0, 470, 411, 469, 0, 0, 111, + 100, 0, 115, 0, 101, 261, 342, 341, 120, 122, + 203, 227, 0, 412, 0, 0, 0, 0, 271, 277, + 0, 263, 388, 389, 390, 392, 393, 397, 398, 395, + 396, 215, 421, 420, 442, 370, 87, 82, 0, 76, + 14, 22, 9, 0, 7, 477, 0, 0, 0, 0, + 29, 121, 69, 0, 71, 43, 0, 0, 199, 0, + 0, 236, 0, 0, 0, 0, 78, 58, 142, 0, + 197, 171, 198, 0, 0, 0, 0, 173, 176, 177, + 183, 188, 191, 192, 57, 57, 0, 57, 164, 0, + 0, 468, 452, 0, 77, 459, 0, 460, 178, 184, + 189, 0, 456, 0, 454, 270, 0, 239, 110, 114, + 113, 116, 0, 474, 437, 105, 432, 433, 0, 249, + 254, 247, 248, 253, 255, 0, 0, 124, 0, 228, + 0, 0, 0, 295, 284, 285, 262, 286, 287, 0, + 0, 278, 371, 373, 0, 476, 0, 0, 0, 481, + 478, 480, 0, 27, 30, 32, 38, 74, 0, 363, + 354, 353, 355, 356, 350, 351, 357, 352, 358, 362, + 348, 349, 359, 360, 361, 364, 367, 368, 0, 237, + 233, 234, 137, 182, 0, 187, 185, 180, 180, 0, + 0, 195, 194, 196, 163, 0, 0, 144, 0, 146, + 239, 466, 164, 57, 0, 451, 0, 0, 0, 102, + 105, 104, 0, 42, 0, 436, 0, 118, 0, 0, + 110, 0, 256, 110, 0, 57, 288, 229, 413, 235, + 283, 297, 298, 296, 272, 274, 83, 86, 84, 85, + 24, 23, 0, 479, 0, 0, 0, 366, 369, 0, + 409, 0, 175, 174, 0, 230, 193, 224, 190, 110, 127, 129, 126, 128, 139, 130, 140, 0, 0, 0, - 456, 0, 460, 461, 459, 455, 453, 279, 238, 236, - 117, 473, 119, 0, 40, 433, 432, 255, 110, 251, - 123, 125, 0, 44, 0, 44, 0, 482, 483, 481, - 480, 0, 72, 363, 184, 0, 179, 0, 111, 0, - 0, 148, 0, 230, 0, 160, 436, 0, 106, 57, - 256, 257, 0, 249, 258, 250, 291, 287, 289, 0, - 0, 93, 0, 298, 271, 31, 408, 170, 150, 147, - 110, 221, 0, 37, 248, 0, 336, 105, 0, 0, - 57, 0, 474, 94, 297, 301, 330, 309, 308, 310, - 0, 0, 149, 41, 0, 0, 337, 338, 335, 429, - 288, 290, 45, 46, 50, 50, 95, 99, 0, 0, - 302, 292, 0, 0, 0, 303, 311, 312, 0, 36, - 341, 57, 51, 52, 53, 53, 0, 97, 300, 332, - 333, 334, 331, 0, 0, 318, 321, 0, 320, 0, - 313, 315, 0, 299, 314, 47, 0, 49, 48, 96, - 322, 319, 0, 325, 316, 305, 306, 0, 0, 55, - 56, 54, 0, 323, 317, 307, 304, 324 + 458, 0, 462, 463, 461, 457, 455, 281, 240, 238, + 117, 475, 119, 0, 40, 435, 434, 257, 110, 253, + 123, 125, 0, 44, 0, 44, 0, 110, 484, 127, + 129, 126, 485, 483, 482, 0, 72, 365, 186, 0, + 181, 0, 439, 111, 0, 0, 148, 150, 0, 232, + 0, 162, 438, 0, 106, 57, 258, 259, 0, 251, + 260, 252, 293, 289, 291, 0, 0, 93, 0, 300, + 273, 111, 31, 410, 172, 0, 0, 147, 110, 223, + 0, 37, 250, 0, 338, 105, 0, 0, 57, 0, + 476, 94, 299, 303, 332, 311, 310, 312, 0, 0, + 152, 151, 149, 41, 0, 0, 339, 340, 337, 431, + 290, 292, 45, 46, 50, 50, 95, 99, 0, 0, + 304, 294, 0, 0, 0, 305, 313, 314, 0, 36, + 343, 57, 51, 52, 53, 53, 0, 97, 302, 334, + 335, 336, 333, 0, 0, 320, 323, 0, 322, 0, + 315, 317, 0, 301, 316, 47, 0, 49, 48, 96, + 324, 321, 0, 327, 318, 307, 308, 0, 0, 55, + 56, 54, 0, 325, 319, 309, 306, 326 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -587, -587, -587, -587, -587, -587, -587, -587, 574, -587, - -587, -587, 149, 560, -587, 729, 69, -587, -587, -154, - 118, -587, 24, 41, 22, -587, -251, -587, 3, -587, - -587, -587, 370, -86, -239, -23, -74, 168, -587, 277, - -587, -587, -163, -587, -587, -587, -587, -587, -587, -587, - -587, 307, -484, 732, -587, -504, 426, -404, 413, -587, - -587, 189, -587, 488, 347, 350, -162, -587, -587, 117, - -584, -587, -587, -271, 492, -587, -259, 501, -587, 272, - -255, -587, -587, -252, -587, -587, -587, -587, -587, -587, - -587, -587, -248, -587, 596, 194, -587, -151, -587, -587, - -170, -587, -587, 269, 261, -587, -587, 174, -587, 351, - -587, -587, -587, -587, -587, -587, -587, -587, -587, -587, - -587, -587, -587, -279, -587, -587, -587, -587, 116, -587, - 121, -587, -587, -587, -587, -587, 91, -587, -587, -587, - -587, -587, -587, 51, -587, -587, -587, -587, -587, -587, - -587, -587, -587, -587, -587, -144, -587, -587, -587, -587, - -587, -587, -587, -587, 401, 129, 192, 345, 224, -586, - -587, -587, -587, -587, -587, 252, -150, -253, -25, -71, - -587, -587, -587, 579, 626, -26, -587, 642, 654, -587, - -418, -587, 16, -587, -587, 590, 594, -158, -127, -587, - -587, -587, -587, -587, 496, -587, 291, 637, -116, 503, - -297, -587, -587, -587, -587, -240, -587, -587, 330, -587 + -608, -608, -608, -608, -608, -608, -608, -608, 629, -608, + -608, -608, 172, 617, -608, 765, 83, -608, -608, -157, + 142, -608, 37, 62, 43, -608, -250, -608, 7, -608, + -608, -608, 413, -70, -244, -24, -73, 217, -608, 318, + -608, -608, -170, -608, -608, -608, -608, -608, -608, -608, + -608, 350, -492, 773, -523, -608, 463, -414, 450, -608, + -608, 225, -608, 524, 383, 385, -178, -608, -608, 121, + -601, -608, -608, -276, 529, -608, -269, 530, -608, 290, + -266, -608, -608, -251, -608, -608, -608, -608, -608, -608, + -608, -608, -221, -608, 599, 231, -608, -143, -608, -608, + -155, -608, -608, 289, 282, -608, -608, 192, -608, 366, + -608, -608, -608, -608, -608, -608, -608, -608, -608, -608, + -608, -608, -608, -277, -608, -608, -608, -608, 128, -608, + 150, -608, -608, -608, -608, -608, 111, -608, -608, -608, + -608, -608, -608, 76, -608, -608, -608, -608, -608, -608, + -608, -608, -608, -608, -608, -138, -608, -608, -608, -608, + -608, -608, -608, -608, 436, -61, 257, 361, 328, -607, + -608, -608, -608, -608, -608, 287, -150, -257, -25, -65, + -608, -608, -608, 620, 660, -16, -608, 673, 679, -608, + -412, -608, 53, -608, -608, 630, 640, -149, -131, -608, + -608, -608, -608, -608, 526, -608, 316, 670, -122, 531, + -292, -608, -608, -608, -608, -243, -608, -608, 377, -608 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { 0, 8, 9, 10, 245, 155, 156, 157, 242, 372, - 20, 248, 379, 39, 40, 171, 672, 261, 648, 169, - 661, 702, 703, 724, 747, 761, 286, 12, 172, 37, + 20, 248, 379, 39, 40, 171, 680, 261, 654, 169, + 667, 712, 713, 734, 757, 771, 286, 12, 172, 37, 14, 15, 265, 16, 149, 287, 151, 25, 366, 367, - 568, 17, 252, 18, 97, 682, 727, 683, 200, 201, + 568, 17, 252, 18, 97, 690, 737, 691, 200, 201, 330, 546, 547, 28, 331, 332, 333, 334, 253, 457, - 556, 594, 288, 289, 290, 291, 314, 595, 640, 641, + 556, 594, 288, 289, 290, 291, 314, 595, 645, 646, 293, 425, 294, 295, 427, 296, 297, 298, 299, 582, 300, 301, 515, 302, 303, 412, 304, 305, 413, 525, 306, 307, 98, 99, 100, 101, 226, 102, 103, 104, - 105, 106, 107, 108, 538, 109, 454, 650, 654, 455, + 105, 106, 107, 108, 538, 109, 454, 656, 660, 455, 335, 336, 110, 111, 112, 470, 113, 114, 348, 115, - 116, 117, 210, 656, 466, 467, 623, 657, 658, 659, - 468, 562, 563, 625, 690, 684, 685, 743, 691, 715, - 716, 735, 717, 736, 737, 764, 738, 118, 710, 732, - 337, 698, 338, 655, 159, 119, 269, 505, 506, 507, + 116, 117, 210, 662, 466, 467, 623, 663, 664, 665, + 468, 562, 563, 625, 698, 692, 693, 753, 699, 725, + 726, 745, 727, 746, 747, 774, 748, 118, 720, 742, + 337, 708, 338, 661, 159, 119, 269, 505, 506, 507, 508, 120, 473, 231, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 579, 343, 344, 324, 133, - 134, 135, 136, 137, 138, 44, 45, 46, 258, 676, - 445, 446, 447, 545, 176, 139, 140, 141, 673, 142, + 134, 135, 136, 137, 138, 647, 45, 46, 258, 684, + 445, 446, 447, 545, 176, 139, 140, 141, 681, 142, 143, 144, 145, 319, 320, 431, 432, 186, 187, 317, - 325, 326, 188, 146, 543, 374, 375, 480, 481, 630 + 325, 326, 188, 146, 543, 374, 375, 480, 481, 634 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -1397,97 +1399,102 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 132, 185, 147, 13, 152, 227, 150, 190, 191, 192, - 262, 309, 382, 259, 309, 164, 406, 167, 421, 292, - 393, 394, 173, 312, 540, 387, 312, 401, 408, 400, - 308, 402, 410, 308, 539, 411, 405, 310, 339, 268, - 310, 268, 512, 163, 323, 327, 399, 426, -112, 416, - 152, 589, 153, 189, 189, 189, 610, 260, -112, 428, - 581, 349, 350, 429, 223, 229, 430, 423, 465, -112, - 316, 224, 260, 474, 368, -456, 23, 203, 744, 204, - 533, 309, -160, 263, 443, 639, 726, 519, 420, 381, - -228, 24, 1, 312, 165, 706, 705, 361, 590, 160, - 308, 166, 42, 26, 19, 309, 309, 310, 403, 439, - -263, 225, 175, 395, 162, 404, 591, 312, 312, 528, - 68, 23, 392, 531, 308, 308, 592, 161, 472, 593, - 21, 310, 310, 229, 755, 68, 24, 705, -263, 4, - 749, 219, 220, 221, 222, 417, 617, 22, 309, 619, - 170, 29, 270, 32, 251, 516, 311, 520, 132, 311, - 312, 519, 246, 526, 205, -456, 639, 308, -78, 403, - 534, 206, -160, 384, 310, 27, 404, 132, 437, 43, - -413, 440, 403, 4, 561, 30, -78, -136, -136, 404, - 417, 31, 458, 699, 6, 461, 417, -78, 182, 638, - 362, 148, 225, 475, 225, 316, 230, 225, 441, 152, - 329, 369, 756, 154, 651, 271, 148, 34, -78, 397, - 757, 758, -78, 197, 198, -78, 311, 4, 486, 35, - 753, 4, 754, 463, 677, 567, -91, 606, 6, 152, - -91, 150, 378, -91, 424, 309, 165, 309, 36, 575, - 396, 311, 380, 383, 464, 278, 33, 312, -78, 312, - 235, 236, 601, 237, 308, 225, 308, -78, 477, 530, - 152, 310, 418, 310, 602, 478, 519, 588, 603, 448, - 729, 604, 599, 38, -91, 675, 536, -91, 722, 238, - 449, 613, 42, 311, 450, 158, -91, 403, 168, 723, - 642, 451, 452, 174, 644, 453, 444, 239, 649, 177, - 558, 730, 731, -103, 581, -91, 368, 240, 178, 564, - 541, 652, -78, -78, -78, -78, -78, -78, 449, 179, - 225, 548, 450, 518, -77, 180, 687, 688, 549, 451, - 452, 217, 218, 722, 181, -77, 272, 273, 274, 183, - 586, 689, 193, 241, 723, 280, 281, 282, 283, 284, - 285, 214, 215, 216, 328, 194, -77, 195, 596, 196, - -77, 233, 234, -77, 199, 342, 345, 184, 315, 189, - -372, 152, 202, 524, 207, 309, 208, 608, 211, 612, - 311, -372, 311, 621, 448, 376, 377, 312, 212, -373, - 209, 152, 213, 532, 308, 449, 352, 353, 354, 450, - -373, 310, -372, 228, -251, -77, 451, 452, 232, -372, - 453, 225, -380, -380, -380, -380, 219, 220, 221, 222, - 244, -373, -380, -380, -380, -380, -380, -380, -373, 385, - 386, 247, 707, 357, 358, 359, 360, 388, 389, 459, - 460, 569, 487, 234, 510, 460, 511, 460, 249, 600, - 251, -372, 254, 152, 256, 150, -73, -73, 632, 234, - -77, -77, -77, -77, -77, -77, 664, 448, 6, 309, - -373, 634, 635, 646, 460, 669, 670, 674, 449, 580, - 264, 312, 450, 266, 152, 267, 584, -251, 308, 451, - 452, 693, 694, 453, 686, 310, 649, 318, 152, 322, - 636, 346, -372, -372, -372, -372, -372, -372, -372, -372, - -372, -372, -372, -372, -372, -372, -372, -372, 347, 580, - 311, -373, -373, -373, -373, -373, -373, -373, -373, -373, - -373, -373, -373, -373, -373, -373, -373, 696, 697, 351, - 686, 223, 585, 720, 694, 77, 189, 370, 55, 759, - 760, 56, 355, 356, 615, 616, 371, 719, 58, 175, - 373, 390, 391, 518, 399, 397, 152, 380, 645, 414, - 415, 419, 422, 315, 435, -116, 436, 438, 444, 456, - 469, 471, 476, 60, 61, 485, 479, 63, 482, 483, - 488, 64, 509, 417, 65, 66, 704, 513, 514, -460, - 666, -461, 152, 668, 667, 275, -459, 70, 48, 189, - 49, 74, 535, 537, 311, 544, 550, 552, 554, 557, - 553, 50, 51, 52, 53, 276, 54, 555, 559, 1, - 560, 464, 55, 565, 570, 56, 572, 704, 571, 574, - 389, 57, 58, 576, 577, 152, 578, 611, 597, 607, - 609, 277, 59, 618, 626, 614, 718, 622, 624, 637, - 643, 278, 633, 647, 635, 665, 92, 60, 61, 93, - 62, 63, 662, 671, 660, 64, 4, 739, 65, 66, - 67, -413, 279, 678, 1, 679, 152, 170, 680, 68, - 69, 70, 71, 72, 73, 74, 75, 681, 463, 2, - 746, 708, 709, 711, 741, 721, 752, 742, 740, 76, - 750, 767, 250, 631, 3, 765, 77, 739, 243, 11, - 78, 79, 80, 751, 81, 82, 83, 84, 85, 86, - 87, 4, 766, 663, 695, 745, 725, 748, 484, 5, - 542, 566, 6, 41, 88, 89, 90, 91, 442, 462, - 92, 628, 527, 93, 398, 275, 629, 529, 48, 7, - 49, 280, 281, 282, 283, 284, 285, 94, 95, 407, - 148, 50, 51, 52, 53, 397, 54, 692, 409, 587, - 583, 598, 55, 653, 700, 56, -58, 589, 340, 728, - 701, 57, 58, 763, 551, 517, 620, 363, 257, 313, - 573, 277, 59, 50, 51, 52, 53, 434, 627, 255, - 365, 278, 433, 364, 605, 321, 0, 60, 61, 0, + 132, 227, 185, 292, 152, 150, 44, 13, 182, 382, + 259, 406, 147, 190, 191, 192, 393, 394, 408, 262, + 387, 410, 173, 421, 539, 164, 309, 167, 401, 309, + 540, 339, 312, 197, 198, 312, 411, 405, 308, 268, + 268, 308, 426, 310, 323, 327, 310, 163, 610, 428, + 152, -112, 429, 189, 189, 189, 400, 399, 402, 153, + 416, 349, 350, 512, 316, 581, 644, 430, 423, 223, + 465, 260, -112, 381, 162, 23, 224, 229, 203, 474, + 204, 42, 716, 368, -458, 754, 533, 715, 235, 236, + 24, 237, 21, 361, -162, 1, 309, 395, 165, 263, + 420, 23, 312, 160, 644, 166, 42, 26, 308, 739, + 2, 443, 763, 310, 764, 19, 24, 238, 225, 439, + 309, 309, 392, -265, 528, 3, 312, 312, 531, 759, + 715, 161, 308, 308, 68, 239, 617, 310, 310, 619, + 740, 741, 4, 4, -78, 240, -230, 225, 29, 675, + 5, -265, 270, 6, 6, 644, 311, 417, 132, 311, + 251, 22, -78, 309, 526, 205, 246, 31, 175, 312, + 7, 30, 206, -78, -458, 308, 534, 132, 437, 27, + 310, 241, 516, 43, -162, -415, 561, -136, -136, 384, + 32, 440, 458, 709, -78, 461, 475, -77, -78, 316, + 362, -78, 225, 225, 657, 397, 732, 417, -77, 152, + 369, 417, 225, 329, 271, 148, -374, 733, 230, 441, + 154, 676, 671, 34, 403, 38, 311, -374, 33, -77, + 765, 404, 567, -77, -78, 35, -77, 486, 463, 152, + 150, 278, 606, -78, 575, 424, 685, 4, -374, 1, + 396, 311, 519, 158, 36, -374, 380, 601, 6, 464, + 309, 42, 309, 519, 602, 168, 312, 603, 312, 530, + 152, 418, 308, 403, 308, 695, 696, 310, -77, 310, + 404, 177, 604, 599, 403, 174, 536, 613, 683, 472, + 697, 404, 519, 311, 229, 178, 4, -374, -78, -78, + -78, -78, -78, -78, 588, 648, 225, 170, 766, 444, + 558, 736, 4, 403, 165, 732, 767, 768, 179, 564, + 650, 383, 520, 378, -91, 368, 733, 199, -91, 217, + 218, -91, 202, -77, -77, -77, -77, -77, -77, 518, + 180, 280, 281, 282, 283, 284, 285, 581, -374, -374, + -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, + -374, -374, -374, -374, 477, 586, 219, 220, 221, 222, + 181, 478, -91, -103, 183, -91, 548, 621, 193, 189, + 541, 152, 524, 549, -91, 194, 612, 608, 233, 234, + 311, 195, 311, 448, 196, 272, 273, 274, 207, -375, + 309, 152, 532, -91, 449, 208, 312, 211, 450, 209, + -375, 212, 308, 328, 213, 451, 452, 310, -230, 453, + 228, 165, 655, 232, 342, 345, 184, 315, 166, 376, + 377, -375, 449, 585, 225, 658, 450, 244, -375, 55, + 175, 247, 56, 451, 452, 385, 386, 717, 249, 58, + 251, 569, 214, 215, 216, -382, -382, -382, -382, 254, + 600, 388, 389, 152, 150, -382, -382, -382, -382, -382, + -382, 352, 353, 354, 60, 61, 670, 682, 63, 256, + -375, 6, 64, 459, 460, 65, 66, 487, 234, 580, + 219, 220, 221, 222, 152, 584, 510, 460, 70, 264, + 309, 596, 74, 266, 489, 627, 312, 267, 152, 511, + 460, 318, 308, -73, -73, 322, 640, 310, 346, 694, + 347, 50, 51, 52, 53, 351, 628, 636, 234, 580, + 311, -375, -375, -375, -375, -375, -375, -375, -375, -375, + -375, -375, -375, -375, -375, -375, -375, 357, 358, 359, + 360, 223, 629, 638, 639, 370, 189, 92, 652, 460, + 93, 677, 678, 77, 173, 703, 704, 706, 707, 694, + 630, 730, 704, 729, 769, 770, 152, 651, 355, 356, + 631, 380, 197, 593, 371, 518, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 615, 616, 373, 175, 390, 391, 399, 397, 76, + 422, 448, 414, 415, 673, 714, 152, 674, 419, 435, + -116, 448, 449, 315, 436, 189, 450, 438, 456, 469, + 311, -253, 449, 451, 452, 444, 450, 453, 471, 476, + 655, -253, 479, 451, 452, 482, 485, 453, 488, 483, + 509, 513, 417, 514, -462, 535, -463, -461, 714, 700, + 701, 537, 544, 152, 550, 275, 552, 553, 48, 557, + 49, 554, 559, 560, 728, 555, 565, 464, 570, 571, + 572, 50, 51, 52, 53, 276, 54, 574, 389, 1, + 576, 577, 55, 578, 607, 56, 597, 749, 609, 611, + 614, 57, 58, 622, 618, 624, 152, 626, 641, 637, + 649, 277, 59, 653, 639, 666, 668, 672, 679, -415, + 686, 278, 688, 687, 463, 689, 721, 60, 61, 718, + 62, 63, 719, 731, 750, 64, 4, 749, 65, 66, + 67, 752, 279, 756, 760, 762, 635, 170, 751, 68, + 69, 70, 71, 72, 73, 74, 75, 761, 775, 777, + -221, -221, -221, -221, 776, 11, 705, 669, 755, 76, + -221, -221, -221, -221, -221, -221, 77, 735, 758, 250, + 78, 79, 80, 243, 81, 82, 83, 84, 85, 86, + 87, 484, 566, 542, 41, 442, 462, 632, 527, 702, + 398, 340, 529, 633, 88, 89, 90, 91, 583, 587, + 92, 659, 598, 93, 710, 275, 407, 409, 48, 551, + 49, 280, 281, 282, 283, 284, 285, 94, 95, 738, + 148, 50, 51, 52, 53, 397, 54, 711, 773, 257, + 517, 620, 55, 313, 255, 56, -58, 434, 363, 605, + 433, 57, 58, -220, -220, -220, -220, 573, 321, 0, + 365, 277, 59, -220, -220, -220, -220, -220, -220, 364, + 0, 278, 0, 0, 0, 0, 0, 60, 61, 0, 62, 63, 0, 0, 0, 64, 0, 0, 65, 66, - 67, 0, 279, 0, 590, 0, 0, 0, 0, 68, + 67, 0, 279, 0, 0, 0, 0, 0, 0, 68, 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, - 0, 0, 591, 0, 0, 0, 0, 0, 0, 76, - 0, 0, 592, 0, 0, 593, 77, 0, 0, 0, + -222, -222, -222, -222, 0, 0, 0, 0, 0, 76, + -222, -222, -222, -222, -222, -222, 77, 0, 0, 0, 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 76, 0, 0, 88, 89, 90, 91, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, 0, 0, 93, 0, 275, 0, 0, 48, 0, 49, 280, 281, 282, 283, 284, 285, 94, 95, 0, 148, 50, 51, 52, 53, 276, 54, 0, 0, 0, @@ -1565,8 +1572,23 @@ static const yytype_int16 yytable[] = 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 642, 0, 0, 1, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, 0, 0, 64, 4, 0, 65, 66, + 67, 0, 0, 0, 0, 0, 0, 170, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 643, 95, 0, 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, - 0, 0, 55, 0, 0, 56, 712, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 722, 0, 0, 0, 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, @@ -1576,8 +1598,8 @@ static const yytype_int16 yytable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, - 87, 0, 0, 0, 0, 713, 0, 0, 0, 0, - 0, 0, 714, 0, 88, 89, 90, 91, 0, 0, + 87, 0, 0, 0, 0, 723, 0, 0, 0, 0, + 0, 0, 724, 0, 88, 89, 90, 91, 0, 0, 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, @@ -1591,8 +1613,8 @@ static const yytype_int16 yytable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, - 87, 0, 0, 0, 0, 733, 0, 0, 0, 0, - 0, 0, 734, 0, 88, 89, 90, 91, 0, 0, + 87, 0, 0, 0, 0, 743, 0, 0, 0, 0, + 0, 0, 744, 0, 88, 89, 90, 91, 0, 0, 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, @@ -1606,8 +1628,8 @@ static const yytype_int16 yytable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, - 87, 0, 0, 0, 0, 762, 0, 0, 0, 0, - 0, 0, 734, 0, 88, 89, 90, 91, 0, 0, + 87, 0, 0, 0, 0, 772, 0, 0, 0, 0, + 0, 0, 744, 0, 88, 89, 90, 91, 0, 0, 92, 0, 0, 93, 0, 47, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, @@ -1632,6 +1654,21 @@ static const yytype_int16 yytable[] = 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, 62, 63, 0, 0, 0, 64, 0, 0, 523, 66, 67, 0, 0, 0, 0, 0, 0, 0, 0, 68, + 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, + 78, 79, 80, 0, 81, 82, 83, 84, 85, 86, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, + 92, 0, 0, 93, 0, 589, 0, 0, 48, 0, + 49, 0, 0, 0, 0, 0, 0, 94, 95, 0, + 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, + 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, + 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 590, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, + 591, 63, 0, 0, 0, 64, 0, 0, 65, 66, + 592, 0, 0, 593, 0, 0, 0, 0, 0, 68, 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, @@ -1688,120 +1725,124 @@ static const yytype_int16 yytable[] = 148, 50, 51, 52, 53, 0, 54, 0, 0, 0, 0, 0, 55, 0, 0, 56, 0, 0, 0, 0, 0, 57, 58, 0, 0, 0, 0, 0, 0, 0, - 0, -375, 59, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -375, 0, 0, 0, 0, 60, 61, 0, - 62, 63, 0, -374, 0, 64, 0, 0, 65, 66, - 67, 0, 0, -375, -374, 0, 0, 0, 0, 68, - -375, 70, 0, 0, 0, 74, 75, 0, 0, 0, - 0, 0, 0, 0, 0, -374, 0, 0, 0, 76, - 0, 0, -374, 0, 0, 0, 0, 0, 0, 0, + 0, -377, 59, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -377, 0, 0, 0, 0, 60, 61, 0, + 62, 63, 0, -376, 0, 64, 0, 0, 65, 66, + 67, 0, 0, -377, -376, 0, 0, 0, 0, 68, + -377, 70, 0, 0, 0, 74, 75, 0, 0, 0, + 0, 0, 0, 0, 0, -376, 0, 0, 0, 76, + 0, 0, -376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 82, 83, 84, 85, 86, - 87, 0, -375, 0, 0, 0, 0, 0, 0, 489, + 87, 0, -377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 0, 0, - 92, 0, 0, 93, -374, 0, 0, 0, 0, 0, + 92, 0, 0, 93, -376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -375, -375, -375, -375, -375, -375, -375, - -375, -375, -375, -375, -375, -375, -375, -375, -375, 0, - 0, 0, 0, 0, 0, -374, -374, -374, -374, -374, - -374, -374, -374, -374, -374, -374, -374, -374, -374, -374, - -374, 490, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504 + 0, 0, 0, -377, -377, -377, -377, -377, -377, -377, + -377, -377, -377, -377, -377, -377, -377, -377, -377, 0, + 0, 0, 0, 0, 0, -376, -376, -376, -376, -376, + -376, -376, -376, -376, -376, -376, -376, -376, -376, -376, + -376 }; static const yytype_int16 yycheck[] = { - 25, 75, 28, 0, 29, 132, 29, 78, 79, 80, - 168, 181, 252, 167, 184, 41, 287, 43, 315, 181, - 273, 274, 47, 181, 442, 264, 184, 278, 287, 277, - 181, 279, 287, 184, 438, 287, 287, 181, 201, 4, - 184, 4, 4, 40, 194, 195, 3, 318, 3, 5, - 75, 3, 3, 78, 79, 80, 540, 24, 24, 318, - 47, 211, 212, 318, 24, 13, 318, 318, 347, 24, - 186, 31, 24, 5, 232, 5, 29, 20, 134, 22, - 5, 251, 5, 169, 332, 589, 100, 34, 95, 251, - 3, 44, 27, 251, 6, 681, 680, 224, 50, 3, - 251, 13, 24, 29, 28, 275, 276, 251, 55, 29, - 121, 167, 25, 275, 5, 62, 68, 275, 276, 416, - 87, 29, 272, 420, 275, 276, 78, 31, 8, 81, - 51, 275, 276, 13, 53, 87, 44, 721, 149, 74, - 726, 155, 156, 157, 158, 152, 550, 58, 318, 553, - 85, 3, 177, 7, 86, 403, 181, 104, 183, 184, - 318, 34, 159, 414, 107, 95, 670, 318, 5, 55, - 95, 114, 95, 259, 318, 101, 62, 202, 328, 101, - 167, 101, 55, 74, 463, 24, 23, 152, 153, 62, - 152, 0, 342, 677, 85, 345, 152, 34, 69, 165, - 225, 168, 167, 366, 167, 321, 154, 167, 165, 234, - 165, 234, 131, 164, 618, 168, 168, 48, 55, 23, - 139, 140, 59, 94, 95, 62, 251, 74, 386, 60, - 132, 74, 134, 3, 652, 475, 0, 534, 85, 264, - 4, 264, 85, 7, 318, 415, 6, 417, 79, 488, - 275, 276, 249, 13, 24, 59, 7, 415, 95, 417, - 21, 22, 533, 24, 415, 167, 417, 104, 6, 419, - 295, 415, 295, 417, 533, 13, 34, 525, 533, 41, - 116, 533, 533, 24, 48, 3, 436, 51, 32, 50, - 52, 544, 24, 318, 56, 29, 60, 55, 3, 43, - 597, 63, 64, 24, 62, 67, 24, 68, 70, 3, - 460, 147, 148, 24, 47, 79, 474, 78, 3, 469, - 31, 83, 159, 160, 161, 162, 163, 164, 52, 3, - 167, 6, 56, 404, 23, 3, 135, 136, 13, 63, - 64, 165, 166, 32, 3, 34, 178, 179, 180, 3, - 520, 150, 3, 114, 43, 159, 160, 161, 162, 163, - 164, 168, 169, 170, 196, 3, 55, 3, 526, 3, - 59, 4, 5, 62, 51, 207, 208, 97, 98, 404, - 23, 406, 5, 406, 3, 555, 3, 537, 3, 543, - 415, 34, 417, 555, 41, 4, 5, 555, 3, 23, - 149, 426, 3, 426, 555, 52, 214, 215, 216, 56, - 34, 555, 55, 165, 61, 104, 63, 64, 75, 62, - 67, 167, 155, 156, 157, 158, 155, 156, 157, 158, - 103, 55, 165, 166, 167, 168, 169, 170, 62, 4, - 5, 24, 682, 219, 220, 221, 222, 4, 5, 4, - 5, 476, 4, 5, 4, 5, 4, 5, 3, 533, - 86, 104, 24, 488, 24, 488, 4, 5, 4, 5, - 159, 160, 161, 162, 163, 164, 626, 41, 85, 649, - 104, 4, 5, 4, 5, 4, 5, 649, 52, 514, - 3, 649, 56, 4, 519, 4, 519, 61, 649, 63, - 64, 4, 5, 67, 662, 649, 70, 97, 533, 4, - 581, 3, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, 121, 554, + 25, 132, 75, 181, 29, 29, 22, 0, 69, 252, + 167, 287, 28, 78, 79, 80, 273, 274, 287, 168, + 264, 287, 47, 315, 438, 41, 181, 43, 278, 184, + 442, 201, 181, 94, 95, 184, 287, 287, 181, 4, + 4, 184, 318, 181, 194, 195, 184, 40, 540, 318, + 75, 3, 318, 78, 79, 80, 277, 3, 279, 3, + 5, 211, 212, 4, 186, 47, 589, 318, 318, 24, + 347, 24, 24, 251, 5, 29, 31, 13, 20, 5, + 22, 24, 689, 232, 5, 134, 5, 688, 21, 22, + 44, 24, 51, 224, 5, 27, 251, 275, 6, 169, + 95, 29, 251, 3, 627, 13, 24, 29, 251, 116, + 42, 332, 132, 251, 134, 28, 44, 50, 167, 29, + 275, 276, 272, 121, 416, 57, 275, 276, 420, 736, + 731, 31, 275, 276, 87, 68, 550, 275, 276, 553, + 147, 148, 74, 74, 5, 78, 3, 167, 3, 29, + 82, 149, 177, 85, 85, 678, 181, 152, 183, 184, + 86, 58, 23, 318, 414, 107, 159, 0, 25, 318, + 102, 24, 114, 34, 95, 318, 95, 202, 328, 101, + 318, 114, 403, 101, 95, 167, 463, 152, 153, 259, + 7, 101, 342, 685, 55, 345, 366, 23, 59, 321, + 225, 62, 167, 167, 618, 23, 32, 152, 34, 234, + 234, 152, 167, 165, 168, 168, 23, 43, 154, 165, + 164, 101, 165, 48, 55, 24, 251, 34, 7, 55, + 53, 62, 475, 59, 95, 60, 62, 386, 3, 264, + 264, 59, 534, 104, 488, 318, 658, 74, 55, 27, + 275, 276, 34, 29, 79, 62, 249, 533, 85, 24, + 415, 24, 417, 34, 533, 3, 415, 533, 417, 419, + 295, 295, 415, 55, 417, 135, 136, 415, 104, 417, + 62, 3, 533, 533, 55, 24, 436, 544, 3, 8, + 150, 62, 34, 318, 13, 3, 74, 104, 159, 160, + 161, 162, 163, 164, 525, 597, 167, 85, 131, 24, + 460, 100, 74, 55, 6, 32, 139, 140, 3, 469, + 62, 13, 104, 85, 0, 474, 43, 51, 4, 165, + 166, 7, 5, 159, 160, 161, 162, 163, 164, 404, + 3, 159, 160, 161, 162, 163, 164, 47, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 6, 520, 155, 156, 157, 158, + 3, 13, 48, 24, 3, 51, 6, 555, 3, 404, + 31, 406, 406, 13, 60, 3, 543, 537, 4, 5, + 415, 3, 417, 41, 3, 178, 179, 180, 3, 23, + 555, 426, 426, 79, 52, 3, 555, 3, 56, 149, + 34, 3, 555, 196, 3, 63, 64, 555, 3, 67, + 165, 6, 70, 75, 207, 208, 97, 98, 13, 4, + 5, 55, 52, 24, 167, 83, 56, 103, 62, 30, + 25, 24, 33, 63, 64, 4, 5, 690, 3, 40, + 86, 476, 168, 169, 170, 155, 156, 157, 158, 24, + 533, 4, 5, 488, 488, 165, 166, 167, 168, 169, + 170, 214, 215, 216, 65, 66, 626, 655, 69, 24, + 104, 85, 73, 4, 5, 76, 77, 4, 5, 514, + 155, 156, 157, 158, 519, 519, 4, 5, 89, 3, + 655, 526, 93, 4, 24, 3, 655, 4, 533, 4, + 5, 97, 655, 4, 5, 4, 581, 655, 3, 668, + 121, 19, 20, 21, 22, 4, 24, 4, 5, 554, 555, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 45, 46, 4, - 708, 24, 24, 4, 5, 114, 581, 4, 30, 37, - 38, 33, 217, 218, 548, 549, 24, 694, 40, 25, - 105, 31, 4, 644, 3, 23, 601, 574, 601, 59, - 153, 5, 96, 98, 4, 24, 5, 5, 24, 53, - 5, 4, 164, 65, 66, 4, 24, 69, 31, 24, - 3, 73, 4, 152, 76, 77, 680, 68, 3, 5, - 635, 5, 637, 639, 637, 3, 5, 89, 6, 644, - 8, 93, 96, 5, 649, 3, 61, 72, 35, 4, - 61, 19, 20, 21, 22, 23, 24, 54, 4, 27, - 4, 24, 30, 4, 24, 33, 164, 721, 24, 3, - 5, 39, 40, 13, 25, 680, 4, 24, 5, 4, - 4, 49, 50, 61, 5, 24, 691, 138, 137, 153, - 4, 59, 24, 3, 5, 4, 148, 65, 66, 151, - 68, 69, 35, 4, 71, 73, 74, 712, 76, 77, - 78, 167, 80, 5, 27, 31, 721, 85, 35, 87, - 88, 89, 90, 91, 92, 93, 94, 99, 3, 42, - 36, 5, 146, 4, 141, 5, 153, 129, 134, 107, - 134, 132, 162, 574, 57, 130, 114, 752, 154, 0, - 118, 119, 120, 141, 122, 123, 124, 125, 126, 127, - 128, 74, 141, 625, 675, 721, 705, 725, 378, 82, - 443, 474, 85, 21, 142, 143, 144, 145, 332, 346, - 148, 572, 415, 151, 276, 3, 572, 417, 6, 102, - 8, 159, 160, 161, 162, 163, 164, 165, 166, 287, - 168, 19, 20, 21, 22, 23, 24, 670, 287, 520, - 518, 530, 30, 619, 678, 33, 34, 3, 202, 708, - 679, 39, 40, 752, 453, 404, 554, 228, 166, 183, - 480, 49, 50, 19, 20, 21, 22, 321, 24, 165, - 230, 59, 319, 229, 533, 188, -1, 65, 66, -1, + 164, 165, 166, 167, 168, 169, 170, 219, 220, 221, + 222, 24, 50, 4, 5, 4, 581, 148, 4, 5, + 151, 4, 5, 114, 589, 4, 5, 45, 46, 718, + 68, 4, 5, 704, 37, 38, 601, 601, 217, 218, + 78, 574, 643, 81, 24, 650, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 548, 549, 105, 25, 31, 4, 3, 23, 107, + 96, 41, 59, 153, 639, 688, 641, 641, 5, 4, + 24, 41, 52, 98, 5, 650, 56, 5, 53, 5, + 655, 61, 52, 63, 64, 24, 56, 67, 4, 164, + 70, 61, 24, 63, 64, 31, 4, 67, 3, 24, + 4, 68, 152, 3, 5, 96, 5, 5, 731, 675, + 676, 5, 3, 688, 61, 3, 72, 61, 6, 4, + 8, 35, 4, 4, 699, 54, 4, 24, 24, 24, + 164, 19, 20, 21, 22, 23, 24, 3, 5, 27, + 13, 25, 30, 4, 4, 33, 5, 722, 4, 24, + 24, 39, 40, 138, 61, 137, 731, 5, 153, 24, + 4, 49, 50, 3, 5, 71, 35, 4, 4, 167, + 5, 59, 35, 31, 3, 99, 4, 65, 66, 5, + 68, 69, 146, 5, 134, 73, 74, 762, 76, 77, + 78, 129, 80, 36, 134, 153, 574, 85, 141, 87, + 88, 89, 90, 91, 92, 93, 94, 141, 130, 132, + 155, 156, 157, 158, 141, 0, 683, 625, 731, 107, + 165, 166, 167, 168, 169, 170, 114, 715, 735, 162, + 118, 119, 120, 154, 122, 123, 124, 125, 126, 127, + 128, 378, 474, 443, 21, 332, 346, 572, 415, 678, + 276, 202, 417, 572, 142, 143, 144, 145, 518, 520, + 148, 619, 530, 151, 686, 3, 287, 287, 6, 453, + 8, 159, 160, 161, 162, 163, 164, 165, 166, 718, + 168, 19, 20, 21, 22, 23, 24, 687, 762, 166, + 404, 554, 30, 183, 165, 33, 34, 321, 228, 533, + 319, 39, 40, 155, 156, 157, 158, 480, 188, -1, + 230, 49, 50, 165, 166, 167, 168, 169, 170, 229, + -1, 59, -1, -1, -1, -1, -1, 65, 66, -1, 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, - 78, -1, 80, -1, 50, -1, -1, -1, -1, 87, + 78, -1, 80, -1, -1, -1, -1, -1, -1, 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, - -1, -1, 68, -1, -1, -1, -1, -1, -1, 107, - -1, -1, 78, -1, -1, 81, 114, -1, -1, -1, + 155, 156, 157, 158, -1, -1, -1, -1, -1, 107, + 165, 166, 167, 168, 169, 170, 114, -1, -1, -1, 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 107, -1, -1, 142, 143, 144, 145, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, 8, 159, 160, 161, 162, 163, 164, 165, 166, -1, 168, 19, 20, 21, 22, 23, 24, -1, -1, -1, @@ -1875,6 +1916,21 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, 27, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, 74, -1, 76, 77, + 78, -1, -1, -1, -1, -1, -1, 85, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, @@ -1950,6 +2006,21 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, + 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, + 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, + 8, -1, -1, -1, -1, -1, -1, 165, 166, -1, + 168, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, 30, -1, -1, 33, -1, -1, -1, -1, + -1, 39, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 50, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 65, 66, -1, + 68, 69, -1, -1, -1, 73, -1, -1, 76, 77, + 78, -1, -1, 81, -1, -1, -1, -1, -1, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 107, + -1, -1, -1, -1, -1, -1, 114, -1, -1, -1, + 118, 119, 120, -1, 122, 123, 124, 125, 126, 127, 128, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, -1, -1, 151, -1, 3, -1, -1, 6, -1, @@ -2010,7 +2081,7 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, 55, -1, -1, -1, 107, -1, -1, 62, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 122, 123, 124, 125, 126, 127, - 128, -1, 104, -1, -1, -1, -1, -1, -1, 24, + 128, -1, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 142, 143, 144, 145, -1, -1, 148, -1, -1, 151, 104, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -2019,8 +2090,7 @@ static const yytype_int16 yycheck[] = 162, 163, 164, 165, 166, 167, 168, 169, 170, -1, -1, -1, -1, -1, -1, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, - 170, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120 + 170 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of @@ -2086,17 +2156,18 @@ static const yytype_int16 yystos[] = 4, 296, 304, 305, 349, 4, 212, 388, 213, 351, 24, 24, 164, 391, 3, 207, 13, 25, 4, 348, 351, 47, 252, 252, 208, 24, 273, 276, 265, 3, - 50, 68, 78, 81, 234, 240, 370, 5, 277, 199, + 50, 68, 78, 81, 234, 240, 351, 5, 277, 199, 209, 246, 249, 253, 256, 379, 383, 4, 349, 4, 225, 24, 192, 350, 24, 365, 365, 230, 61, 230, - 348, 239, 138, 299, 137, 306, 5, 24, 234, 268, - 392, 185, 4, 24, 4, 5, 352, 153, 165, 228, - 241, 242, 383, 4, 62, 208, 4, 3, 191, 70, - 280, 230, 83, 280, 281, 326, 296, 300, 301, 302, - 71, 193, 35, 193, 349, 4, 351, 208, 358, 4, - 5, 4, 189, 371, 239, 3, 362, 363, 5, 31, - 35, 99, 218, 220, 308, 309, 370, 135, 136, 150, - 307, 311, 242, 4, 5, 189, 45, 46, 324, 225, + 348, 239, 138, 299, 137, 306, 5, 3, 24, 50, + 68, 78, 234, 268, 392, 185, 4, 24, 4, 5, + 352, 153, 24, 165, 227, 241, 242, 358, 383, 4, + 62, 208, 4, 3, 191, 70, 280, 230, 83, 280, + 281, 326, 296, 300, 301, 302, 71, 193, 35, 193, + 349, 165, 4, 351, 208, 29, 101, 4, 5, 4, + 189, 371, 239, 3, 362, 363, 5, 31, 35, 99, + 218, 220, 308, 309, 370, 135, 136, 150, 307, 311, + 358, 358, 242, 4, 5, 189, 45, 46, 324, 225, 301, 303, 194, 195, 209, 243, 342, 388, 5, 146, 321, 4, 34, 133, 140, 312, 313, 315, 351, 371, 4, 5, 32, 43, 196, 196, 100, 219, 309, 116, @@ -2124,40 +2195,40 @@ static const yytype_int16 yyr1[] = 230, 231, 232, 232, 233, 233, 234, 234, 234, 234, 234, 235, 235, 235, 235, 235, 235, 235, 236, 236, 236, 237, 237, 238, 238, 239, 239, 240, 241, 241, - 242, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 244, 245, 245, 246, 246, 246, 246, 246, 246, 246, - 247, 248, 249, 250, 251, 251, 251, 251, 252, 252, - 253, 254, 254, 255, 255, 256, 257, 257, 258, 259, - 260, 261, 262, 262, 262, 263, 264, 265, 265, 265, - 266, 266, 267, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 269, 269, 269, 270, 270, 271, 271, 271, - 271, 272, 273, 273, 273, 273, 273, 273, 274, 274, - 275, 276, 276, 276, 276, 276, 276, 277, 277, 278, - 278, 278, 278, 278, 278, 279, 279, 279, 280, 281, - 281, 282, 282, 282, 282, 283, 283, 284, 284, 284, - 285, 286, 286, 286, 286, 286, 286, 286, 287, 288, - 288, 288, 289, 290, 290, 291, 292, 293, 293, 294, - 295, 295, 296, 297, 297, 298, 299, 299, 300, 300, - 301, 302, 303, 304, 304, 305, 306, 306, 307, 307, - 308, 308, 309, 310, 310, 310, 310, 310, 311, 311, - 311, 312, 312, 313, 313, 313, 314, 315, 316, 316, - 316, 317, 317, 318, 318, 319, 320, 320, 320, 320, - 321, 321, 322, 322, 322, 323, 324, 324, 324, 325, - 325, 326, 327, 327, 328, 329, 330, 330, 330, 330, + 242, 242, 242, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 244, 245, 245, 246, 246, 246, 246, 246, + 246, 246, 247, 248, 249, 250, 251, 251, 251, 251, + 252, 252, 253, 254, 254, 255, 255, 256, 257, 257, + 258, 259, 260, 261, 262, 262, 262, 263, 264, 265, + 265, 265, 266, 266, 267, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 269, 269, 269, 270, 270, 271, + 271, 271, 271, 272, 273, 273, 273, 273, 273, 273, + 274, 274, 275, 276, 276, 276, 276, 276, 276, 277, + 277, 278, 278, 278, 278, 278, 278, 279, 279, 279, + 280, 281, 281, 282, 282, 282, 282, 283, 283, 284, + 284, 284, 285, 286, 286, 286, 286, 286, 286, 286, + 287, 288, 288, 288, 289, 290, 290, 291, 292, 293, + 293, 294, 295, 295, 296, 297, 297, 298, 299, 299, + 300, 300, 301, 302, 303, 304, 304, 305, 306, 306, + 307, 307, 308, 308, 309, 310, 310, 310, 310, 310, + 311, 311, 311, 312, 312, 313, 313, 313, 314, 315, + 316, 316, 316, 317, 317, 318, 318, 319, 320, 320, + 320, 320, 321, 321, 322, 322, 322, 323, 324, 324, + 324, 325, 325, 326, 327, 327, 328, 329, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 330, 331, 331, 332, 333, 333, 334, 335, 335, - 336, 336, 337, 337, 337, 337, 337, 337, 337, 337, - 338, 339, 339, 339, 339, 340, 340, 340, 340, 341, - 341, 341, 342, 342, 342, 342, 342, 343, 344, 344, - 344, 344, 344, 344, 345, 346, 347, 348, 348, 349, - 350, 350, 351, 351, 351, 352, 353, 353, 354, 354, - 355, 356, 357, 358, 358, 359, 360, 360, 361, 362, - 363, 364, 364, 364, 365, 366, 366, 367, 367, 368, - 368, 369, 369, 369, 370, 371, 372, 373, 373, 374, - 375, 376, 376, 377, 378, 378, 379, 379, 379, 379, - 379, 379, 380, 380, 381, 382, 382, 383, 384, 385, - 386, 386, 387, 387, 388, 388, 389, 390, 390, 391, - 391, 392, 392, 392 + 330, 330, 330, 330, 331, 331, 332, 333, 333, 334, + 335, 335, 336, 336, 337, 337, 337, 337, 337, 337, + 337, 337, 338, 339, 339, 339, 339, 340, 340, 340, + 340, 341, 341, 341, 342, 342, 342, 342, 342, 343, + 344, 344, 344, 344, 344, 344, 345, 346, 347, 348, + 348, 349, 350, 350, 351, 351, 351, 352, 353, 353, + 354, 354, 355, 356, 357, 358, 358, 359, 360, 360, + 361, 362, 363, 364, 364, 364, 365, 366, 366, 367, + 367, 368, 368, 369, 369, 369, 370, 371, 372, 373, + 373, 374, 375, 376, 376, 377, 378, 378, 379, 379, + 379, 379, 379, 379, 380, 380, 381, 382, 382, 383, + 384, 385, 386, 386, 387, 387, 388, 388, 389, 390, + 390, 391, 391, 392, 392, 392 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ @@ -2178,40 +2249,40 @@ static const yytype_int8 yyr2[] = 1, 2, 0, 3, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 4, 4, 1, 2, 1, 3, 1, 3, 3, 1, 3, + 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 3, 2, 1, 1, 1, 1, 1, + 1, 2, 5, 2, 4, 4, 2, 2, 1, 1, + 0, 2, 3, 2, 1, 1, 3, 3, 2, 1, + 3, 2, 2, 3, 1, 1, 1, 2, 2, 4, + 3, 3, 1, 3, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 0, 2, 1, 1, 1, 1, + 1, 1, 1, 8, 1, 1, 1, 3, 4, 5, + 1, 1, 7, 5, 5, 5, 4, 5, 6, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 3, 2, 1, 1, 1, 1, 1, 1, 2, - 5, 2, 4, 4, 2, 2, 1, 1, 0, 2, - 3, 2, 1, 1, 3, 3, 2, 1, 3, 2, - 2, 3, 1, 1, 1, 2, 2, 4, 3, 3, - 1, 3, 1, 1, 1, 1, 1, 1, 2, 2, - 2, 2, 0, 2, 1, 1, 1, 1, 1, 1, - 1, 8, 1, 1, 1, 3, 4, 5, 1, 1, - 7, 5, 5, 5, 4, 5, 6, 0, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, - 1, 0, 1, 1, 2, 4, 5, 5, 5, 1, - 4, 3, 3, 1, 1, 1, 1, 1, 4, 0, - 2, 4, 5, 1, 1, 1, 4, 1, 1, 6, - 0, 4, 1, 1, 1, 1, 0, 2, 3, 1, - 3, 1, 6, 0, 1, 1, 0, 3, 0, 3, - 3, 1, 2, 0, 3, 2, 2, 3, 1, 1, - 1, 1, 1, 2, 2, 2, 2, 4, 1, 2, - 1, 1, 2, 1, 2, 2, 1, 1, 1, 1, - 0, 2, 1, 1, 1, 7, 0, 1, 1, 1, - 1, 4, 0, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 0, 1, 1, 2, 4, 5, 5, + 5, 1, 4, 3, 3, 1, 1, 1, 1, 1, + 4, 0, 2, 4, 5, 1, 1, 1, 4, 1, + 1, 6, 0, 4, 1, 1, 1, 1, 0, 2, + 3, 1, 3, 1, 6, 0, 1, 1, 0, 3, + 0, 3, 3, 1, 2, 0, 3, 2, 2, 3, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, + 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, + 1, 1, 0, 2, 1, 1, 1, 7, 0, 1, + 1, 1, 1, 4, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 2, 1, 1, 6, 0, 1, - 0, 3, 1, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 2, 2, 2, 1, 3, 3, 3, 1, - 3, 3, 1, 3, 3, 3, 3, 1, 1, 1, - 1, 2, 2, 2, 1, 1, 1, 1, 3, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 3, 3, - 1, 1, 2, 1, 1, 3, 3, 3, 1, 2, - 1, 1, 3, 3, 2, 0, 3, 0, 1, 1, - 3, 2, 1, 1, 2, 1, 1, 1, 1, 5, - 4, 1, 2, 4, 1, 3, 1, 1, 1, 1, - 1, 1, 1, 2, 4, 0, 2, 1, 1, 1, - 2, 1, 0, 2, 0, 1, 2, 2, 1, 1, - 3, 1, 1, 1 + 1, 1, 1, 1, 1, 3, 2, 1, 1, 6, + 0, 1, 0, 3, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 2, 2, 2, 1, 3, 3, + 3, 1, 3, 3, 1, 3, 3, 3, 3, 1, + 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, + 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, + 3, 3, 1, 1, 2, 1, 1, 3, 3, 3, + 1, 2, 1, 1, 3, 3, 2, 0, 3, 0, + 1, 1, 3, 2, 1, 1, 2, 1, 1, 1, + 1, 5, 4, 1, 2, 4, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 2, 4, 0, 2, 1, + 1, 1, 2, 1, 0, 2, 0, 1, 2, 2, + 1, 1, 3, 1, 1, 1 }; @@ -3325,7 +3396,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 140: /* boolean_test: boolean_primary SQL_TOKEN_IS sql_not column_ref */ + case 140: /* boolean_test: boolean_primary SQL_TOKEN_IS sql_not value_exp */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3384,15 +3455,37 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 150: /* type_list_item: opt_only table_node */ + case 150: /* type_list_item: table_node */ + { + (yyval.pParseNode) = SQL_NEW_RULE; + (yyval.pParseNode)->append(CREATE_NODE("", SQL_NODE_RULE, OSQLParser::RuleID(OSQLParseNode::opt_only))); + (yyval.pParseNode)->append((yyvsp[0].pParseNode)); + } + break; + + case 151: /* type_list_item: opt_disqualify_polymorphic_constraint SQL_TOKEN_ONLY table_node */ + { + (yyval.pParseNode) = SQL_NEW_RULE; + OSQLParseNode* pOptOnly = CREATE_NODE("", SQL_NODE_RULE, OSQLParser::RuleID(OSQLParseNode::opt_only)); + pOptOnly->append((yyvsp[-2].pParseNode)); + pOptOnly->append((yyvsp[-1].pParseNode) = CREATE_NODE("ONLY", SQL_NODE_NAME)); + (yyval.pParseNode)->append(pOptOnly); + (yyval.pParseNode)->append((yyvsp[0].pParseNode)); + } + break; + + case 152: /* type_list_item: opt_disqualify_polymorphic_constraint SQL_TOKEN_ALL table_node */ { (yyval.pParseNode) = SQL_NEW_RULE; - (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); + OSQLParseNode* pOptOnly = CREATE_NODE("", SQL_NODE_RULE, OSQLParser::RuleID(OSQLParseNode::opt_only)); + pOptOnly->append((yyvsp[-2].pParseNode)); + pOptOnly->append((yyvsp[-1].pParseNode) = CREATE_NODE("ALL", SQL_NODE_NAME)); + (yyval.pParseNode)->append(pOptOnly); (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 160: /* comparison_predicate_part_2: comparison row_value_constructor */ + case 162: /* comparison_predicate_part_2: comparison row_value_constructor */ { (yyval.pParseNode) = SQL_NEW_RULE; // comparison_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3400,7 +3493,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 161: /* comparison_predicate: row_value_constructor comparison row_value_constructor */ + case 163: /* comparison_predicate: row_value_constructor comparison row_value_constructor */ { (yyval.pParseNode) = SQL_NEW_RULE; // comparison_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3409,7 +3502,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 162: /* comparison_predicate: comparison row_value_constructor */ + case 164: /* comparison_predicate: comparison row_value_constructor */ { if(context->inPredicateCheck()) // comparison_predicate: rule 2 { @@ -3434,7 +3527,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 169: /* comparison: SQL_TOKEN_IS sql_not */ + case 171: /* comparison: SQL_TOKEN_IS sql_not */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3442,7 +3535,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 170: /* between_predicate_part_2: sql_not SQL_TOKEN_BETWEEN row_value_constructor SQL_TOKEN_AND row_value_constructor */ + case 172: /* between_predicate_part_2: sql_not SQL_TOKEN_BETWEEN row_value_constructor SQL_TOKEN_AND row_value_constructor */ { (yyval.pParseNode) = SQL_NEW_RULE; // between_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -3453,7 +3546,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 171: /* between_predicate: row_value_constructor between_predicate_part_2 */ + case 173: /* between_predicate: row_value_constructor between_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; // between_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3461,7 +3554,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 172: /* character_like_predicate_part_2: sql_not SQL_TOKEN_LIKE string_value_exp opt_escape */ + case 174: /* character_like_predicate_part_2: sql_not SQL_TOKEN_LIKE string_value_exp opt_escape */ { (yyval.pParseNode) = SQL_NEW_RULE; // like_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3471,7 +3564,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 173: /* other_like_predicate_part_2: sql_not SQL_TOKEN_LIKE value_exp_primary opt_escape */ + case 175: /* other_like_predicate_part_2: sql_not SQL_TOKEN_LIKE value_exp_primary opt_escape */ { (yyval.pParseNode) = SQL_NEW_RULE; // like_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3481,7 +3574,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 174: /* like_predicate: row_value_constructor character_like_predicate_part_2 */ + case 176: /* like_predicate: row_value_constructor character_like_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; // like_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3489,7 +3582,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 175: /* like_predicate: row_value_constructor other_like_predicate_part_2 */ + case 177: /* like_predicate: row_value_constructor other_like_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; // like_predicate: rule 3 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3497,7 +3590,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 176: /* like_predicate: character_like_predicate_part_2 */ + case 178: /* like_predicate: character_like_predicate_part_2 */ { if (context->inPredicateCheck()) // like_predicate: rule 5 { @@ -3521,7 +3614,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 177: /* like_predicate: other_like_predicate_part_2 */ + case 179: /* like_predicate: other_like_predicate_part_2 */ { if (context->inPredicateCheck()) // like_predicate: rule 6 { @@ -3545,17 +3638,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 178: /* opt_escape: %empty */ + case 180: /* opt_escape: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 179: /* opt_escape: SQL_TOKEN_ESCAPE string_value_exp */ + case 181: /* opt_escape: SQL_TOKEN_ESCAPE string_value_exp */ {(yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 180: /* null_predicate_part_2: SQL_TOKEN_IS sql_not SQL_TOKEN_NULL */ + case 182: /* null_predicate_part_2: SQL_TOKEN_IS sql_not SQL_TOKEN_NULL */ { (yyval.pParseNode) = SQL_NEW_RULE; // test_for_null: rule 1 (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3564,7 +3657,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 181: /* test_for_null: row_value_constructor null_predicate_part_2 */ + case 183: /* test_for_null: row_value_constructor null_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; // test_for_null: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3572,7 +3665,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 182: /* test_for_null: null_predicate_part_2 */ + case 184: /* test_for_null: null_predicate_part_2 */ { if (context->inPredicateCheck())// test_for_null: rule 2 { @@ -3588,13 +3681,13 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 183: /* in_predicate_value: subquery */ + case 185: /* in_predicate_value: subquery */ {(yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 184: /* in_predicate_value: '(' value_exp_commalist ')' */ + case 186: /* in_predicate_value: '(' value_exp_commalist ')' */ {(yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3602,7 +3695,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 185: /* in_predicate_part_2: sql_not SQL_TOKEN_IN in_predicate_value */ + case 187: /* in_predicate_part_2: sql_not SQL_TOKEN_IN in_predicate_value */ { (yyval.pParseNode) = SQL_NEW_RULE;// in_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3611,7 +3704,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 186: /* in_predicate: row_value_constructor in_predicate_part_2 */ + case 188: /* in_predicate: row_value_constructor in_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE;// in_predicate: rule 1 (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3619,7 +3712,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 187: /* in_predicate: in_predicate_part_2 */ + case 189: /* in_predicate: in_predicate_part_2 */ { if ( context->inPredicateCheck() )// in_predicate: rule 2 { @@ -3635,7 +3728,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 188: /* quantified_comparison_predicate_part_2: comparison any_all_some subquery */ + case 190: /* quantified_comparison_predicate_part_2: comparison any_all_some subquery */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3644,7 +3737,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 189: /* all_or_any_predicate: row_value_constructor quantified_comparison_predicate_part_2 */ + case 191: /* all_or_any_predicate: row_value_constructor quantified_comparison_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3652,7 +3745,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 190: /* rtreematch_predicate: row_value_constructor rtreematch_predicate_part_2 */ + case 192: /* rtreematch_predicate: row_value_constructor rtreematch_predicate_part_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3660,7 +3753,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 191: /* rtreematch_predicate_part_2: sql_not SQL_TOKEN_MATCH fct_spec */ + case 193: /* rtreematch_predicate_part_2: sql_not SQL_TOKEN_MATCH fct_spec */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3669,7 +3762,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 195: /* existence_test: SQL_TOKEN_EXISTS subquery */ + case 197: /* existence_test: SQL_TOKEN_EXISTS subquery */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3677,13 +3770,13 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 196: /* unique_test: SQL_TOKEN_UNIQUE subquery */ + case 198: /* unique_test: SQL_TOKEN_UNIQUE subquery */ {(yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 197: /* subquery: '(' SQL_TOKEN_VALUES values_commalist ')' */ + case 199: /* subquery: '(' SQL_TOKEN_VALUES values_commalist ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -3693,7 +3786,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 198: /* subquery: '(' select_statement ')' */ + case 200: /* subquery: '(' select_statement ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -3702,7 +3795,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 199: /* subquery: '(' cte ')' */ + case 201: /* subquery: '(' cte ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -3711,21 +3804,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 200: /* scalar_exp_commalist: select_sublist */ + case 202: /* scalar_exp_commalist: select_sublist */ { (yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 201: /* scalar_exp_commalist: scalar_exp_commalist ',' select_sublist */ + case 203: /* scalar_exp_commalist: scalar_exp_commalist ',' select_sublist */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 208: /* literal: literal SQL_TOKEN_STRING */ + case 210: /* literal: literal SQL_TOKEN_STRING */ { if (context->inPredicateCheck()) { @@ -3739,7 +3832,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 209: /* literal: literal SQL_TOKEN_INT */ + case 211: /* literal: literal SQL_TOKEN_INT */ { if (context->inPredicateCheck()) { @@ -3753,7 +3846,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 210: /* literal: literal SQL_TOKEN_REAL_NUM */ + case 212: /* literal: literal SQL_TOKEN_REAL_NUM */ { if (context->inPredicateCheck()) { @@ -3767,7 +3860,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 211: /* literal: literal SQL_TOKEN_APPROXNUM */ + case 213: /* literal: literal SQL_TOKEN_APPROXNUM */ { if (context->inPredicateCheck()) { @@ -3781,11 +3874,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 212: /* as_clause: %empty */ + case 214: /* as_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 213: /* as_clause: SQL_TOKEN_AS column */ + case 215: /* as_clause: SQL_TOKEN_AS column */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3793,7 +3886,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 221: /* iif_spec: SQL_TOKEN_IIF '(' search_condition ',' result ',' result ')' */ + case 223: /* iif_spec: SQL_TOKEN_IIF '(' search_condition ',' result ',' result ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-7].pParseNode)); @@ -3805,7 +3898,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 225: /* fct_spec: function_name '(' ')' */ + case 227: /* fct_spec: function_name '(' ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -3814,7 +3907,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 226: /* fct_spec: function_name '(' function_args_commalist ')' */ + case 228: /* fct_spec: function_name '(' function_args_commalist ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3824,7 +3917,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 227: /* fct_spec: function_name '(' opt_all_distinct function_arg ')' */ + case 229: /* fct_spec: function_name '(' opt_all_distinct function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -3835,7 +3928,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 230: /* value_creation_fct: SQL_TOKEN_NAVIGATION_VALUE '(' derived_column ',' function_arg opt_function_arg ')' */ + case 232: /* value_creation_fct: SQL_TOKEN_NAVIGATION_VALUE '(' derived_column ',' function_arg opt_function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-6].pParseNode)); @@ -3848,7 +3941,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 231: /* aggregate_fct: SQL_TOKEN_MAX '(' opt_all_distinct function_args_commalist ')' */ + case 233: /* aggregate_fct: SQL_TOKEN_MAX '(' opt_all_distinct function_args_commalist ')' */ { if((yyvsp[-1].pParseNode)->count() != 1) { @@ -3866,7 +3959,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 232: /* aggregate_fct: SQL_TOKEN_MIN '(' opt_all_distinct function_args_commalist ')' */ + case 234: /* aggregate_fct: SQL_TOKEN_MIN '(' opt_all_distinct function_args_commalist ')' */ { if((yyvsp[-1].pParseNode)->count() != 1) { @@ -3884,7 +3977,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 233: /* aggregate_fct: set_fct_type '(' opt_all_distinct function_arg ')' */ + case 235: /* aggregate_fct: set_fct_type '(' opt_all_distinct function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -3895,7 +3988,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 234: /* aggregate_fct: SQL_TOKEN_COUNT '(' '*' ')' */ + case 236: /* aggregate_fct: SQL_TOKEN_COUNT '(' '*' ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -3905,7 +3998,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 235: /* aggregate_fct: SQL_TOKEN_COUNT '(' opt_all_distinct function_arg ')' */ + case 237: /* aggregate_fct: SQL_TOKEN_COUNT '(' opt_all_distinct function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -3916,7 +4009,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 236: /* aggregate_fct: SQL_TOKEN_GROUP_CONCAT '(' opt_all_distinct function_arg opt_function_arg ')' */ + case 238: /* aggregate_fct: SQL_TOKEN_GROUP_CONCAT '(' opt_all_distinct function_arg opt_function_arg ')' */ { if ((yyvsp[-3].pParseNode)->isToken() && (yyvsp[-1].pParseNode)->count()!=0) { @@ -3933,11 +4026,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 237: /* opt_function_arg: %empty */ + case 239: /* opt_function_arg: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 238: /* opt_function_arg: ',' function_arg */ + case 240: /* opt_function_arg: ',' function_arg */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE(",", SQL_NODE_PUNCTUATION)); @@ -3945,28 +4038,28 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 245: /* outer_join_type: SQL_TOKEN_LEFT */ + case 247: /* outer_join_type: SQL_TOKEN_LEFT */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 246: /* outer_join_type: SQL_TOKEN_RIGHT */ + case 248: /* outer_join_type: SQL_TOKEN_RIGHT */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 247: /* outer_join_type: SQL_TOKEN_FULL */ + case 249: /* outer_join_type: SQL_TOKEN_FULL */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 248: /* join_condition: SQL_TOKEN_ON search_condition */ + case 250: /* join_condition: SQL_TOKEN_ON search_condition */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3974,18 +4067,18 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 251: /* join_type: %empty */ + case 253: /* join_type: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 252: /* join_type: SQL_TOKEN_INNER */ + case 254: /* join_type: SQL_TOKEN_INNER */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 254: /* join_type: outer_join_type SQL_TOKEN_OUTER */ + case 256: /* join_type: outer_join_type SQL_TOKEN_OUTER */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -3993,7 +4086,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 255: /* cross_union: table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref */ + case 257: /* cross_union: table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4003,7 +4096,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 256: /* cross_union: table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref join_condition */ + case 258: /* cross_union: table_ref SQL_TOKEN_CROSS SQL_TOKEN_JOIN table_ref join_condition */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4014,7 +4107,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 257: /* qualified_join: table_ref SQL_TOKEN_NATURAL join_type SQL_TOKEN_JOIN table_ref */ + case 259: /* qualified_join: table_ref SQL_TOKEN_NATURAL join_type SQL_TOKEN_JOIN table_ref */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4025,7 +4118,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 258: /* qualified_join: table_ref join_type SQL_TOKEN_JOIN table_ref join_spec */ + case 260: /* qualified_join: table_ref join_type SQL_TOKEN_JOIN table_ref join_spec */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4036,7 +4129,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 260: /* window_function: window_function_type opt_filter_clause SQL_TOKEN_OVER window_name_or_specification */ + case 262: /* window_function: window_function_type opt_filter_clause SQL_TOKEN_OVER window_name_or_specification */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4046,7 +4139,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 261: /* window_function_type: rank_function_type '(' ')' */ + case 263: /* window_function_type: rank_function_type '(' ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4055,7 +4148,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 262: /* window_function_type: SQL_TOKEN_ROW_NUMBER '(' ')' */ + case 264: /* window_function_type: SQL_TOKEN_ROW_NUMBER '(' ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4064,7 +4157,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 268: /* ntile_function: SQL_TOKEN_NTILE '(' function_arg ')' */ + case 270: /* ntile_function: SQL_TOKEN_NTILE '(' function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4074,11 +4167,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 269: /* opt_lead_or_lag_function: %empty */ + case 271: /* opt_lead_or_lag_function: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 270: /* opt_lead_or_lag_function: ',' function_arg */ + case 272: /* opt_lead_or_lag_function: ',' function_arg */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE(",", SQL_NODE_PUNCTUATION)); @@ -4086,7 +4179,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 271: /* opt_lead_or_lag_function: ',' function_arg ',' function_arg */ + case 273: /* opt_lead_or_lag_function: ',' function_arg ',' function_arg */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode) = CREATE_NODE(",", SQL_NODE_PUNCTUATION)); @@ -4096,7 +4189,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 272: /* lead_or_lag_function: lead_or_lag '(' lead_or_lag_extent opt_lead_or_lag_function ')' */ + case 274: /* lead_or_lag_function: lead_or_lag '(' lead_or_lag_extent opt_lead_or_lag_function ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4107,7 +4200,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 276: /* first_or_last_value_function: first_or_last_value '(' function_arg ')' */ + case 278: /* first_or_last_value_function: first_or_last_value '(' function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4117,7 +4210,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 279: /* nth_value_function: SQL_TOKEN_NTH_VALUE '(' function_arg ',' function_arg ')' */ + case 281: /* nth_value_function: SQL_TOKEN_NTH_VALUE '(' function_arg ',' function_arg ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-5].pParseNode)); @@ -4129,11 +4222,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 280: /* opt_filter_clause: %empty */ + case 282: /* opt_filter_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 281: /* opt_filter_clause: SQL_TOKEN_FILTER '(' where_clause ')' */ + case 283: /* opt_filter_clause: SQL_TOKEN_FILTER '(' where_clause ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4143,11 +4236,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 286: /* opt_window_clause: %empty */ + case 288: /* opt_window_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 287: /* opt_window_clause: SQL_TOKEN_WINDOW window_definition_list */ + case 289: /* opt_window_clause: SQL_TOKEN_WINDOW window_definition_list */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4155,17 +4248,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 288: /* window_definition_list: window_definition_list ',' window_definition */ + case 290: /* window_definition_list: window_definition_list ',' window_definition */ {(yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode);} break; - case 289: /* window_definition_list: window_definition */ + case 291: /* window_definition_list: window_definition */ {(yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 290: /* window_definition: new_window_name SQL_TOKEN_AS window_specification */ + case 292: /* window_definition: new_window_name SQL_TOKEN_AS window_specification */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4174,7 +4267,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 292: /* window_specification: '(' opt_existing_window_name opt_window_partition_clause opt_order_by_clause opt_window_frame_clause ')' */ + case 294: /* window_specification: '(' opt_existing_window_name opt_window_partition_clause opt_order_by_clause opt_window_frame_clause ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-5].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -4186,15 +4279,15 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 293: /* opt_existing_window_name: %empty */ + case 295: /* opt_existing_window_name: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 296: /* opt_window_partition_clause: %empty */ + case 298: /* opt_window_partition_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 297: /* opt_window_partition_clause: SQL_TOKEN_PARTITION SQL_TOKEN_BY window_partition_column_reference_list */ + case 299: /* opt_window_partition_clause: SQL_TOKEN_PARTITION SQL_TOKEN_BY window_partition_column_reference_list */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4203,11 +4296,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 298: /* opt_window_frame_clause: %empty */ + case 300: /* opt_window_frame_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 299: /* opt_window_frame_clause: window_frame_units window_frame_extent opt_window_frame_exclusion */ + case 301: /* opt_window_frame_clause: window_frame_units window_frame_extent opt_window_frame_exclusion */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4216,17 +4309,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 300: /* window_partition_column_reference_list: window_partition_column_reference_list ',' window_partition_column_reference */ + case 302: /* window_partition_column_reference_list: window_partition_column_reference_list ',' window_partition_column_reference */ {(yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode);} break; - case 301: /* window_partition_column_reference_list: window_partition_column_reference */ + case 303: /* window_partition_column_reference_list: window_partition_column_reference */ {(yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 302: /* window_partition_column_reference: column_ref opt_collate_clause */ + case 304: /* window_partition_column_reference: column_ref opt_collate_clause */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4234,11 +4327,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 303: /* opt_window_frame_exclusion: %empty */ + case 305: /* opt_window_frame_exclusion: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 304: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ + case 306: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4247,7 +4340,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 305: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_GROUP */ + case 307: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_GROUP */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4255,7 +4348,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 306: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_TIES */ + case 308: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_TIES */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4263,7 +4356,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 307: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_NO SQL_TOKEN_OTHERS */ + case 309: /* opt_window_frame_exclusion: SQL_TOKEN_EXCLUDE SQL_TOKEN_NO SQL_TOKEN_OTHERS */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4272,7 +4365,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 313: /* window_frame_start: SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING */ + case 315: /* window_frame_start: SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4280,7 +4373,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 314: /* window_frame_start: value_exp SQL_TOKEN_PRECEDING */ + case 316: /* window_frame_start: value_exp SQL_TOKEN_PRECEDING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4288,7 +4381,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 315: /* window_frame_start: SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ + case 317: /* window_frame_start: SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4296,7 +4389,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 316: /* window_frame_preceding: value_exp SQL_TOKEN_PRECEDING */ + case 318: /* window_frame_preceding: value_exp SQL_TOKEN_PRECEDING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4304,7 +4397,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 317: /* window_frame_between: SQL_TOKEN_BETWEEN window_frame_bound_1 SQL_TOKEN_AND window_frame_bound_2 */ + case 319: /* window_frame_between: SQL_TOKEN_BETWEEN window_frame_bound_1 SQL_TOKEN_AND window_frame_bound_2 */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4314,7 +4407,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 319: /* window_frame_bound: SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ + case 321: /* window_frame_bound: SQL_TOKEN_CURRENT SQL_TOKEN_ROW */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4322,7 +4415,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 322: /* window_frame_bound_1: SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING */ + case 324: /* window_frame_bound_1: SQL_TOKEN_UNBOUNDED SQL_TOKEN_PRECEDING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4330,7 +4423,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 324: /* window_frame_bound_2: SQL_TOKEN_UNBOUNDED SQL_TOKEN_FOLLOWING */ + case 326: /* window_frame_bound_2: SQL_TOKEN_UNBOUNDED SQL_TOKEN_FOLLOWING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4338,7 +4431,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 325: /* window_frame_following: value_exp SQL_TOKEN_FOLLOWING */ + case 327: /* window_frame_following: value_exp SQL_TOKEN_FOLLOWING */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4346,11 +4439,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 330: /* opt_collate_clause: %empty */ + case 332: /* opt_collate_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 331: /* opt_collate_clause: SQL_TOKEN_COLLATE collating_function */ + case 333: /* opt_collate_clause: SQL_TOKEN_COLLATE collating_function */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4358,7 +4451,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 335: /* ecrelationship_join: table_ref join_type SQL_TOKEN_JOIN table_ref SQL_TOKEN_USING table_node_ref op_relationship_direction */ + case 337: /* ecrelationship_join: table_ref join_type SQL_TOKEN_JOIN table_ref SQL_TOKEN_USING table_node_ref op_relationship_direction */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-6].pParseNode)); @@ -4371,11 +4464,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 336: /* op_relationship_direction: %empty */ + case 338: /* op_relationship_direction: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 341: /* named_columns_join: SQL_TOKEN_USING '(' column_commalist ')' */ + case 343: /* named_columns_join: SQL_TOKEN_USING '(' column_commalist ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4385,18 +4478,18 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 342: /* all: %empty */ + case 344: /* all: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 362: /* cast_target_scalar: cast_target_primitive_type */ + case 364: /* cast_target_scalar: cast_target_primitive_type */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 363: /* cast_target_scalar: SQL_TOKEN_NAME '.' SQL_TOKEN_NAME */ + case 365: /* cast_target_scalar: SQL_TOKEN_NAME '.' SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4405,7 +4498,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 364: /* cast_target_array: cast_target_scalar SQL_TOKEN_ARRAY_INDEX */ + case 366: /* cast_target_array: cast_target_scalar SQL_TOKEN_ARRAY_INDEX */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4413,7 +4506,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 367: /* cast_spec: SQL_TOKEN_CAST '(' cast_operand SQL_TOKEN_AS cast_target ')' */ + case 369: /* cast_spec: SQL_TOKEN_CAST '(' cast_operand SQL_TOKEN_AS cast_target ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-5].pParseNode)); @@ -4425,22 +4518,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 368: /* opt_optional_prop: %empty */ + case 370: /* opt_optional_prop: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 369: /* opt_optional_prop: '?' */ + case 371: /* opt_optional_prop: '?' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode) = CREATE_NODE("?", SQL_NODE_PUNCTUATION)); } break; - case 370: /* opt_extract_value: %empty */ + case 372: /* opt_extract_value: %empty */ { (yyval.pParseNode) = SQL_NEW_RULE; } break; - case 371: /* opt_extract_value: SQL_ARROW property_path opt_optional_prop */ + case 373: /* opt_extract_value: SQL_ARROW property_path opt_optional_prop */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4448,7 +4541,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 378: /* value_exp_primary: '(' value_exp ')' */ + case 380: /* value_exp_primary: '(' value_exp ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -4457,7 +4550,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 382: /* factor: '-' num_primary */ + case 384: /* factor: '-' num_primary */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE("-", SQL_NODE_PUNCTUATION)); @@ -4465,7 +4558,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 383: /* factor: '+' num_primary */ + case 385: /* factor: '+' num_primary */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE("+", SQL_NODE_PUNCTUATION)); @@ -4473,7 +4566,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 384: /* factor: SQL_BITWISE_NOT num_primary */ + case 386: /* factor: SQL_BITWISE_NOT num_primary */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE("~", SQL_NODE_PUNCTUATION)); @@ -4481,7 +4574,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 386: /* term: term '*' factor */ + case 388: /* term: term '*' factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4490,7 +4583,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 387: /* term: term '/' factor */ + case 389: /* term: term '/' factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4499,7 +4592,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 388: /* term: term '%' factor */ + case 390: /* term: term '%' factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4508,7 +4601,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 390: /* term_add_sub: term_add_sub '+' term */ + case 392: /* term_add_sub: term_add_sub '+' term */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4517,7 +4610,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 391: /* term_add_sub: term_add_sub '-' term */ + case 393: /* term_add_sub: term_add_sub '-' term */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4526,7 +4619,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 393: /* num_value_exp: num_value_exp SQL_BITWISE_SHIFT_LEFT term_add_sub */ + case 395: /* num_value_exp: num_value_exp SQL_BITWISE_SHIFT_LEFT term_add_sub */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4535,7 +4628,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 394: /* num_value_exp: num_value_exp SQL_BITWISE_SHIFT_RIGHT term_add_sub */ + case 396: /* num_value_exp: num_value_exp SQL_BITWISE_SHIFT_RIGHT term_add_sub */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4544,7 +4637,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 395: /* num_value_exp: num_value_exp SQL_BITWISE_OR term_add_sub */ + case 397: /* num_value_exp: num_value_exp SQL_BITWISE_OR term_add_sub */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4553,7 +4646,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 396: /* num_value_exp: num_value_exp SQL_BITWISE_AND term_add_sub */ + case 398: /* num_value_exp: num_value_exp SQL_BITWISE_AND term_add_sub */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4562,35 +4655,35 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 397: /* datetime_primary: datetime_value_fct */ + case 399: /* datetime_primary: datetime_value_fct */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 398: /* datetime_value_fct: SQL_TOKEN_CURRENT_DATE */ + case 400: /* datetime_value_fct: SQL_TOKEN_CURRENT_DATE */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 399: /* datetime_value_fct: SQL_TOKEN_CURRENT_TIMESTAMP */ + case 401: /* datetime_value_fct: SQL_TOKEN_CURRENT_TIMESTAMP */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 400: /* datetime_value_fct: SQL_TOKEN_CURRENT_TIME */ + case 402: /* datetime_value_fct: SQL_TOKEN_CURRENT_TIME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 401: /* datetime_value_fct: SQL_TOKEN_DATE string_value_exp */ + case 403: /* datetime_value_fct: SQL_TOKEN_DATE string_value_exp */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4598,7 +4691,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 402: /* datetime_value_fct: SQL_TOKEN_TIMESTAMP string_value_exp */ + case 404: /* datetime_value_fct: SQL_TOKEN_TIMESTAMP string_value_exp */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4606,7 +4699,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 403: /* datetime_value_fct: SQL_TOKEN_TIME string_value_exp */ + case 405: /* datetime_value_fct: SQL_TOKEN_TIME string_value_exp */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4614,52 +4707,52 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 404: /* datetime_factor: datetime_primary */ + case 406: /* datetime_factor: datetime_primary */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 405: /* datetime_term: datetime_factor */ + case 407: /* datetime_term: datetime_factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 406: /* datetime_value_exp: datetime_term */ + case 408: /* datetime_value_exp: datetime_term */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 407: /* value_exp_commalist: value_exp */ + case 409: /* value_exp_commalist: value_exp */ {(yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 408: /* value_exp_commalist: value_exp_commalist ',' value_exp */ + case 410: /* value_exp_commalist: value_exp_commalist ',' value_exp */ {(yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode);} break; - case 410: /* function_args_commalist: function_arg */ + case 412: /* function_args_commalist: function_arg */ { (yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 411: /* function_args_commalist: function_args_commalist ',' function_arg */ + case 413: /* function_args_commalist: function_args_commalist ',' function_arg */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 418: /* concatenation: char_value_exp '+' char_factor */ + case 420: /* concatenation: char_value_exp '+' char_factor */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4668,7 +4761,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 419: /* concatenation: value_exp SQL_CONCAT value_exp */ + case 421: /* concatenation: value_exp SQL_CONCAT value_exp */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4677,7 +4770,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 422: /* derived_column: value_exp as_clause */ + case 424: /* derived_column: value_exp as_clause */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4685,21 +4778,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 423: /* table_node: qualified_class_name */ + case 425: /* table_node: qualified_class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 424: /* table_node: tablespace_qualified_class_name */ + case 426: /* table_node: tablespace_qualified_class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 425: /* tablespace_qualified_class_name: SQL_TOKEN_NAME '.' qualified_class_name */ + case 427: /* tablespace_qualified_class_name: SQL_TOKEN_NAME '.' qualified_class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4708,7 +4801,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 426: /* qualified_class_name: SQL_TOKEN_NAME '.' class_name */ + case 428: /* qualified_class_name: SQL_TOKEN_NAME '.' class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4717,7 +4810,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 427: /* qualified_class_name: SQL_TOKEN_NAME ':' class_name */ + case 429: /* qualified_class_name: SQL_TOKEN_NAME ':' class_name */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); @@ -4726,14 +4819,14 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 428: /* class_name: SQL_TOKEN_NAME */ + case 430: /* class_name: SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 429: /* table_node_ref: table_node_with_opt_member_func_call table_primary_as_range_column */ + case 431: /* table_node_ref: table_node_with_opt_member_func_call table_primary_as_range_column */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4741,35 +4834,35 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 430: /* table_node_with_opt_member_func_call: table_node_path */ + case 432: /* table_node_with_opt_member_func_call: table_node_path */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 431: /* table_node_path: table_node_path_entry */ + case 433: /* table_node_path: table_node_path_entry */ { (yyval.pParseNode) = SQL_NEW_DOTLISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 432: /* table_node_path: table_node_path '.' table_node_path_entry */ + case 434: /* table_node_path: table_node_path '.' table_node_path_entry */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 433: /* table_node_path: table_node_path ':' table_node_path_entry */ + case 435: /* table_node_path: table_node_path ':' table_node_path_entry */ { (yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode); } break; - case 434: /* table_node_path_entry: SQL_TOKEN_NAME opt_member_function_args */ + case 436: /* table_node_path_entry: SQL_TOKEN_NAME opt_member_function_args */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4777,11 +4870,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 435: /* opt_member_function_args: %empty */ + case 437: /* opt_member_function_args: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 436: /* opt_member_function_args: '(' function_args_commalist ')' */ + case 438: /* opt_member_function_args: '(' function_args_commalist ')' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode) = CREATE_NODE("(", SQL_NODE_PUNCTUATION)); @@ -4790,25 +4883,25 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 437: /* opt_column_array_idx: %empty */ + case 439: /* opt_column_array_idx: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 438: /* opt_column_array_idx: SQL_TOKEN_ARRAY_INDEX */ + case 440: /* opt_column_array_idx: SQL_TOKEN_ARRAY_INDEX */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 439: /* property_path: property_path_entry */ + case 441: /* property_path: property_path_entry */ { (yyval.pParseNode) = SQL_NEW_DOTLISTRULE; (yyval.pParseNode)->append ((yyvsp[0].pParseNode)); } break; - case 440: /* property_path: property_path '.' property_path_entry */ + case 442: /* property_path: property_path '.' property_path_entry */ { auto last = (yyvsp[-2].pParseNode)->getLast(); if (last) @@ -4825,7 +4918,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 441: /* property_path_entry: SQL_TOKEN_NAME opt_column_array_idx */ + case 443: /* property_path_entry: SQL_TOKEN_NAME opt_column_array_idx */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4833,21 +4926,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 442: /* property_path_entry: '*' */ + case 444: /* property_path_entry: '*' */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode) = CREATE_NODE("*", SQL_NODE_PUNCTUATION)); } break; - case 443: /* property_path_entry: SQL_TOKEN_DOLLAR */ + case 445: /* property_path_entry: SQL_TOKEN_DOLLAR */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode) = CREATE_NODE("$", SQL_NODE_PUNCTUATION)); } break; - case 444: /* column_ref: property_path opt_extract_value */ + case 446: /* column_ref: property_path opt_extract_value */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4855,7 +4948,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 449: /* simple_case: SQL_TOKEN_CASE case_operand simple_when_clause_list else_clause SQL_TOKEN_END */ + case 451: /* simple_case: SQL_TOKEN_CASE case_operand simple_when_clause_list else_clause SQL_TOKEN_END */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-4].pParseNode)); @@ -4866,7 +4959,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 450: /* searched_case: SQL_TOKEN_CASE searched_when_clause_list else_clause SQL_TOKEN_END */ + case 452: /* searched_case: SQL_TOKEN_CASE searched_when_clause_list else_clause SQL_TOKEN_END */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4876,21 +4969,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 451: /* simple_when_clause_list: simple_when_clause */ + case 453: /* simple_when_clause_list: simple_when_clause */ { (yyval.pParseNode) = SQL_NEW_LISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 452: /* simple_when_clause_list: searched_when_clause_list simple_when_clause */ + case 454: /* simple_when_clause_list: searched_when_clause_list simple_when_clause */ { (yyvsp[-1].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-1].pParseNode); } break; - case 453: /* simple_when_clause: SQL_TOKEN_WHEN when_operand_list SQL_TOKEN_THEN result */ + case 455: /* simple_when_clause: SQL_TOKEN_WHEN when_operand_list SQL_TOKEN_THEN result */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4900,31 +4993,31 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 454: /* when_operand_list: when_operand */ + case 456: /* when_operand_list: when_operand */ {(yyval.pParseNode) = SQL_NEW_COMMALISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode));} break; - case 455: /* when_operand_list: when_operand_list ',' when_operand */ + case 457: /* when_operand_list: when_operand_list ',' when_operand */ {(yyvsp[-2].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-2].pParseNode);} break; - case 462: /* searched_when_clause_list: searched_when_clause */ + case 464: /* searched_when_clause_list: searched_when_clause */ { (yyval.pParseNode) = SQL_NEW_LISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 463: /* searched_when_clause_list: searched_when_clause_list searched_when_clause */ + case 465: /* searched_when_clause_list: searched_when_clause_list searched_when_clause */ { (yyvsp[-1].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-1].pParseNode); } break; - case 464: /* searched_when_clause: SQL_TOKEN_WHEN search_condition SQL_TOKEN_THEN result */ + case 466: /* searched_when_clause: SQL_TOKEN_WHEN search_condition SQL_TOKEN_THEN result */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-3].pParseNode)); @@ -4934,11 +5027,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 465: /* else_clause: %empty */ + case 467: /* else_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 466: /* else_clause: SQL_TOKEN_ELSE result */ + case 468: /* else_clause: SQL_TOKEN_ELSE result */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4946,7 +5039,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 470: /* parameter: ':' SQL_TOKEN_NAME */ + case 472: /* parameter: ':' SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode) = CREATE_NODE(":", SQL_NODE_PUNCTUATION)); @@ -4954,20 +5047,20 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 471: /* parameter: '?' */ + case 473: /* parameter: '?' */ { (yyval.pParseNode) = SQL_NEW_RULE; // test (yyval.pParseNode)->append((yyvsp[0].pParseNode) = CREATE_NODE("?", SQL_NODE_PUNCTUATION)); } break; - case 472: /* range_variable: %empty */ + case 474: /* range_variable: %empty */ { (yyval.pParseNode) = SQL_NEW_RULE; } break; - case 473: /* range_variable: opt_as SQL_TOKEN_NAME */ + case 475: /* range_variable: opt_as SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4975,11 +5068,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 474: /* opt_ecsqloptions_clause: %empty */ + case 476: /* opt_ecsqloptions_clause: %empty */ {(yyval.pParseNode) = SQL_NEW_RULE;} break; - case 476: /* ecsqloptions_clause: SQL_TOKEN_ECSQLOPTIONS ecsqloptions_list */ + case 478: /* ecsqloptions_clause: SQL_TOKEN_ECSQLOPTIONS ecsqloptions_list */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-1].pParseNode)); @@ -4987,28 +5080,28 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } break; - case 477: /* ecsqloptions_list: ecsqloptions_list ecsqloption */ + case 479: /* ecsqloptions_list: ecsqloptions_list ecsqloption */ { (yyvsp[-1].pParseNode)->append((yyvsp[0].pParseNode)); (yyval.pParseNode) = (yyvsp[-1].pParseNode); } break; - case 478: /* ecsqloptions_list: ecsqloption */ + case 480: /* ecsqloptions_list: ecsqloption */ { (yyval.pParseNode) = SQL_NEW_LISTRULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 479: /* ecsqloption: SQL_TOKEN_NAME */ + case 481: /* ecsqloption: SQL_TOKEN_NAME */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[0].pParseNode)); } break; - case 480: /* ecsqloption: SQL_TOKEN_NAME SQL_EQUAL ecsqloptionvalue */ + case 482: /* ecsqloption: SQL_TOKEN_NAME SQL_EQUAL ecsqloptionvalue */ { (yyval.pParseNode) = SQL_NEW_RULE; (yyval.pParseNode)->append((yyvsp[-2].pParseNode)); diff --git a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y index c8e343622f1..c3f1304d48d 100644 --- a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y +++ b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y @@ -912,6 +912,7 @@ boolean_primary: boolean_test: boolean_primary + /* X IS [NOT] NULL|TRUE|FALSE|UNKNOWN, and the X IS [NOT] (ClassName) type predicate. */ | boolean_primary SQL_TOKEN_IS sql_not truth_value { $$ = SQL_NEW_RULE; @@ -920,7 +921,11 @@ boolean_test: $$->append($3); $$->append($4); } - | boolean_primary SQL_TOKEN_IS sql_not column_ref + /* X IS [NOT] : SQLite null-safe comparison between two operands. + Any value expression is allowed on the right-hand side. A right-hand operand + that is exactly NULL/TRUE/FALSE/UNKNOWN or the parenthesized (ClassName) form + reduces via 'truth_value' above (it has the lower rule number). */ + | boolean_primary SQL_TOKEN_IS sql_not value_exp { $$ = SQL_NEW_RULE; $$->append($1); @@ -981,12 +986,34 @@ type_list: } ; +/* 'opt_only' is inlined here (rather than 'opt_only table_node') so that a bare class name + shifts SQL_TOKEN_NAME directly. Otherwise the empty 'opt_only' reduction loses a + shift/reduce race against value_exp's property_path in the 'X IS (...)' context, which + would shadow this type predicate with a parenthesized value expression. */ type_list_item: - opt_only table_node + table_node { $$ = SQL_NEW_RULE; + $$->append(CREATE_NODE("", SQL_NODE_RULE, OSQLParser::RuleID(OSQLParseNode::opt_only))); $$->append($1); - $$->append($2); + } + | opt_disqualify_polymorphic_constraint SQL_TOKEN_ONLY table_node + { + $$ = SQL_NEW_RULE; + OSQLParseNode* pOptOnly = CREATE_NODE("", SQL_NODE_RULE, OSQLParser::RuleID(OSQLParseNode::opt_only)); + pOptOnly->append($1); + pOptOnly->append($2 = CREATE_NODE("ONLY", SQL_NODE_NAME)); + $$->append(pOptOnly); + $$->append($3); + } + | opt_disqualify_polymorphic_constraint SQL_TOKEN_ALL table_node + { + $$ = SQL_NEW_RULE; + OSQLParseNode* pOptOnly = CREATE_NODE("", SQL_NODE_RULE, OSQLParser::RuleID(OSQLParseNode::opt_only)); + pOptOnly->append($1); + pOptOnly->append($2 = CREATE_NODE("ALL", SQL_NODE_NAME)); + $$->append(pOptOnly); + $$->append($3); } ; diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp index aec08be534d..ed6422e8386 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp @@ -1719,7 +1719,8 @@ TEST_F(ECSqlSelectPrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE B = NULL OR b = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE i>=:myParam")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P WHERE I IS 123")); + // 'IS' / 'IS NOT' accept any value expression on either side (null-safe comparison), not just NULL. + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE B IS TRUE")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE L < 3.14")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE (L < 3.14 AND I > 3) OR B = True AND D > 0.0")); @@ -1781,8 +1782,8 @@ TEST_F(ECSqlSelectPrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL = NULL")); // NULL = NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL <> NULL")); // NULL <> NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P WHERE NULL IS 123")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P WHERE NULL IS NOT 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL IS NOT 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL <> 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE B = NULL")); // = NULL always returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE B <> NULL")); // <> NULL always returns NULL @@ -1794,8 +1795,8 @@ TEST_F(ECSqlSelectPrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE S IS NOT NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE B IS NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE B IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P WHERE I IS ?")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P WHERE I IS NOT ?")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE I IS ?")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE I IS NOT ?")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE ? = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE NULL = ?")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE ? <> NULL")); @@ -2929,7 +2930,7 @@ TEST_F(ECSqlUpdatePrepareTests, WhereBasics) //case insensitive tests EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B = NULL OR b = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE i>=:myParam")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ecsql.P SET I=10 WHERE I IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B IS TRUE")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE L < 3.14")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE (L < 3.14 AND I > 3) OR B = True AND D > 0.0")); @@ -2989,8 +2990,8 @@ TEST_F(ECSqlUpdatePrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL = NULL")); // NULL = NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL <> NULL")); // NULL <> NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL IS 123")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL IS NOT 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL IS NOT 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL <> 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B = NULL")); // = NULL always returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B <> NULL")); // <> NULL always returns NULL @@ -3002,8 +3003,8 @@ TEST_F(ECSqlUpdatePrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE S IS NOT NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B IS NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ecsql.P SET I=10 WHERE I IS ?")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ecsql.P SET I=10 WHERE I IS NOT ?")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE I IS ?")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE I IS NOT ?")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE ? = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE NULL = ?")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE ? <> NULL")); @@ -3052,7 +3053,7 @@ TEST_F(ECSqlUpdatePrepareTests, MiscellaneousWithALL) //case insensitive tests EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE B = NULL OR b = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE i>=:myParam")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE I IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE B IS TRUE")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE L < 3.14")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE (L < 3.14 AND I > 3) OR B = True AND D > 0.0")); @@ -3072,7 +3073,7 @@ TEST_F(ECSqlUpdatePrepareTests, MiscellaneousWithALL) EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE NULL = NULL")); // NULL = NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE NULL <> NULL")); // NULL <> NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE NULL IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE NULL IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE NULL IS 123")); //Structs EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.PSA SET I=? WHERE PStructProp IS NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.PSA SET I=? WHERE PStructProp IS NOT NULL")); @@ -3420,7 +3421,7 @@ TEST_F(ECSqlDeletePrepareTests, WhereBasics) //case insensitive tests EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B = NULL OR b = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE i>=:myParam")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ecsql.P WHERE I IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B IS TRUE")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE L < 3.14")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE (L < 3.14 AND I > 3) OR B = True AND D > 0.0")); @@ -3480,8 +3481,8 @@ TEST_F(ECSqlDeletePrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL = NULL")); // NULL = NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL <> NULL")); // NULL <> NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ecsql.P WHERE NULL IS 123")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ecsql.P WHERE NULL IS NOT 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL IS NOT 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL <> 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B = NULL")); // = NULL always returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B <> NULL")); // <> NULL always returns NULL @@ -3493,8 +3494,8 @@ TEST_F(ECSqlDeletePrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE S IS NOT NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B IS NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ecsql.P WHERE I IS ?")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ecsql.P WHERE I IS NOT ?")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE I IS ?")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE I IS NOT ?")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE ? = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE NULL = ?")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE ? <> NULL")); @@ -3540,7 +3541,7 @@ TEST_F(ECSqlDeletePrepareTests, MiscellaneousWithALL) EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE Glob('*amp*',S)")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE NOT Glob('*amp*',S)")); //case insensitive tests - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ALL ecsql.P WHERE I IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE B IS TRUE")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE L < 3.14")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE (L < 3.14 AND I > 3) OR B = True AND D > 0.0")); @@ -3568,8 +3569,8 @@ TEST_F(ECSqlDeletePrepareTests, MiscellaneousWithALL) //NULL tests EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE NULL <> NULL")); // NULL <> NULL returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE NULL IS NOT NULL")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ALL ecsql.P WHERE NULL IS 123")); - EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("DELETE FROM ALL ecsql.P WHERE NULL IS NOT 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE NULL IS 123")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE NULL IS NOT 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE NULL <> 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE B = NULL")); // = NULL always returns NULL EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE B <> NULL")); // <> NULL always returns NULL diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp index 0d94abbe58d..a32bae1c23c 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp @@ -4247,6 +4247,32 @@ TEST_F(ECSqlStatementTestFixture, IsAndIsNotOperatorNullSafeSemantics) EXPECT_EQ(3, count("S1 IS NOT NULL")); EXPECT_EQ(2, count("NULL IS S2")); + // the operands may be any value expression, not just a column or NULL literal: + // string literal on the right-hand side + EXPECT_EQ(3, count("S1 IS 'a'")); + EXPECT_EQ(2, count("S1 IS NOT 'a'")); + // function call on the right-hand side (LOWER(S2) equals S2 for these lowercase values) + EXPECT_EQ(2, count("S1 IS LOWER(S2)")); + EXPECT_EQ(3, count("S1 IS NOT LOWER(S2)")); + // function call on the left-hand side + EXPECT_EQ(2, count("LOWER(S1) IS S2")); + // a parenthesized unqualified name is a value expression here, not a type predicate + EXPECT_EQ(2, count("S1 IS (S2)")); + + // parameter on the right-hand side, bound to a value and to NULL (null-safe both ways) + { + ECSqlStatement stmt; + ASSERT_EQ(ECSqlStatus::Success, stmt.Prepare(m_ecdb, "SELECT COUNT(*) FROM ts.Foo WHERE S1 IS ?")); + ASSERT_EQ(ECSqlStatus::Success, stmt.BindText(1, "a", IECSqlBinder::MakeCopy::No)); + ASSERT_EQ(BE_SQLITE_ROW, stmt.Step()); + EXPECT_EQ(3, stmt.GetValueInt(0)) << "S1 IS ? bound to 'a'"; + stmt.Reset(); + stmt.ClearBindings(); + ASSERT_EQ(ECSqlStatus::Success, stmt.BindNull(1)); + ASSERT_EQ(BE_SQLITE_ROW, stmt.Step()); + EXPECT_EQ(2, stmt.GetValueInt(0)) << "S1 IS ? bound to NULL"; + } + // operands of incompatible types are rejected (string vs point) ECSqlStatement bad; EXPECT_NE(ECSqlStatus::Success, bad.Prepare(m_ecdb, "SELECT 1 FROM ts.Foo WHERE S1 IS P1")); diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp index 5d7de3cb73b..083f98af98e 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp @@ -1329,6 +1329,11 @@ TEST_F(ECSqlToSqlGenerationTests, IsAndIsNotOperatorBetweenOperands) assertWhere("SELECT 1 FROM ts.Foo WHERE ParentA IS NOT ParentB", "WHERE ([Foo].[ParentAId] IS NOT [Foo].[ParentBId] OR [Foo].[ParentARelECClassId] IS NOT [Foo].[ParentBRelECClassId])"); + // the operands may be any value expression, not just a column or NULL literal + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS 'abc'", "WHERE [Foo].[S1] IS 'abc'"); + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS NOT 'abc'", "WHERE [Foo].[S1] IS NOT 'abc'"); + assertWhere("SELECT 1 FROM ts.Foo WHERE 'abc' IS S1", "WHERE 'abc' IS [Foo].[S1]"); + // regression: the existing IS (ClassName) type predicate is unaffected EXPECT_TRUE(GetHelper().ECSqlToSql("SELECT 1 FROM ts.Foo WHERE ECClassId IS (ts.Foo)").Contains("ec_cache_ClassHierarchy")); } From 9b17160cb7e97a0b37ae8cce6498ae2a7f12627f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 25 Jun 2026 18:53:32 +0000 Subject: [PATCH 4/7] Add explanatory comments to UPDATE/DELETE IS operator test blocks --- iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp index ed6422e8386..2213e661dbb 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp @@ -2930,6 +2930,7 @@ TEST_F(ECSqlUpdatePrepareTests, WhereBasics) //case insensitive tests EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B = NULL OR b = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE i>=:myParam")); + // 'IS' / 'IS NOT' accept any value expression on either side (null-safe comparison), not just NULL. EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE B IS TRUE")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ecsql.P SET I=10 WHERE L < 3.14")); @@ -3053,6 +3054,7 @@ TEST_F(ECSqlUpdatePrepareTests, MiscellaneousWithALL) //case insensitive tests EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE B = NULL OR b = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE i>=:myParam")); + // 'IS' / 'IS NOT' accept any value expression on either side (null-safe comparison), not just NULL. EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE B IS TRUE")); EXPECT_EQ(ECSqlStatus::Success, Prepare("UPDATE ALL ecsql.P SET I=10 WHERE L < 3.14")); @@ -3421,6 +3423,7 @@ TEST_F(ECSqlDeletePrepareTests, WhereBasics) //case insensitive tests EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B = NULL OR b = NULL")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE i>=:myParam")); + // 'IS' / 'IS NOT' accept any value expression on either side (null-safe comparison), not just NULL. EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE B IS TRUE")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ecsql.P WHERE L < 3.14")); @@ -3541,6 +3544,7 @@ TEST_F(ECSqlDeletePrepareTests, MiscellaneousWithALL) EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE Glob('*amp*',S)")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE NOT Glob('*amp*',S)")); //case insensitive tests + // 'IS' / 'IS NOT' accept any value expression on either side (null-safe comparison), not just NULL. EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE B IS TRUE")); EXPECT_EQ(ECSqlStatus::Success, Prepare("DELETE FROM ALL ecsql.P WHERE L < 3.14")); From a0bc9f2a0e277c39fdbc1e4507506dd6ab5d5256 Mon Sep 17 00:00:00 2001 From: Affan Khan Date: Thu, 25 Jun 2026 15:26:17 -0400 Subject: [PATCH 5/7] Address review: drop dead ParseTruthValue shim, clarify type_predicate comment - Remove the now-unused ParseTruthValue wrapper from ECSqlParser.h. It had zero callers repo-wide; the legacy IS (ClassName) path goes directly through ParseValueExp. - Reword the type_list_item grammar comment to accurately describe parse behavior: a single unqualified name in parentheses (e.g. 'X IS (S2)') reduces as a value_exp (null-safe comparison), not a type predicate. The type predicate is reached only for a qualified class name, an ONLY/ALL prefix, or a comma-separated list. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h | 1 - iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y | 12 ++++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h index 6da3098ccfc..67878acc96c 100644 --- a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h +++ b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h @@ -246,7 +246,6 @@ struct ECSqlParser final BentleyStatus ParseTableNodeWithOptMemberCall(std::unique_ptr&, connectivity::OSQLParseNode const&, ECSqlType, PolymorphicInfo polymorphic, bool disqualifyPrimaryJoin) const; BentleyStatus ParseTableRef(std::unique_ptr&, connectivity::OSQLParseNode const*, ECSqlType ecsqlType) const; BentleyStatus ParseTerm(std::unique_ptr&, connectivity::OSQLParseNode const*) const; - BentleyStatus ParseTruthValue(std::unique_ptr& exp, connectivity::OSQLParseNode const* node) const { return ParseValueExp(exp, node); } BentleyStatus ParseSearchCondition(std::unique_ptr&, connectivity::OSQLParseNode const*) const; BentleyStatus ParseSetFct(std::unique_ptr&, connectivity::OSQLParseNode const&, Utf8StringCR functionName, bool isStandardSetFunction) const; diff --git a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y index c3f1304d48d..1a280862007 100644 --- a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y +++ b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y @@ -986,10 +986,14 @@ type_list: } ; -/* 'opt_only' is inlined here (rather than 'opt_only table_node') so that a bare class name - shifts SQL_TOKEN_NAME directly. Otherwise the empty 'opt_only' reduction loses a - shift/reduce race against value_exp's property_path in the 'X IS (...)' context, which - would shadow this type predicate with a parenthesized value expression. */ +/* 'opt_only' is inlined here (rather than 'opt_only table_node') so that the type predicate + stays reachable: without it, the empty 'opt_only' reduction loses a shift/reduce race + against value_exp's property_path in the 'X IS (...)' context. + A type predicate is reached only for a *qualified* class name (schema.Class), an ONLY/ALL + prefix, or a comma-separated list. A single *unqualified* name in parentheses - e.g. + 'X IS (S2)' - still reduces as a parenthesized value_exp (null-safe comparison), not a + type predicate; so if an identifier is both a class and a property name, the value- + expression (property) reading wins. See ECSqlStatementTests IsAndIsNotOperatorNullSafeSemantics. */ type_list_item: table_node { From 593ff15eb976b95b65cb81a1f467d80697aed183 Mon Sep 17 00:00:00 2001 From: Affan Khan Date: Mon, 29 Jun 2026 15:30:29 -0400 Subject: [PATCH 6/7] Address review: support IS (class.prop) parenthesized value expressions A parenthesized qualified name on the RHS of IS/IS NOT (e.g. 'X IS (alias.prop)' or 'X IS (ts.Enum.Enumerator)') is grammatically identical to the '(ClassName)' type predicate, so it previously failed with "class not found" when the name was actually a property or enum reference. ECSqlParser::TryParseParenthesizedNameAsValueExp now reinterprets it as a property-reference / enum-literal value expression (null-safe comparison) when the name does not resolve to a class. A genuine '(ClassName)' type predicate, an ONLY/ALL prefix, a comma-separated type list, or the 'schema:class' colon form keep their original type-predicate meaning. Updates the sqlbison.y grammar comment and CHANGES.md to distinguish a qualified class name (type predicate) from a property path (value expression), addressing the review note that the disambiguation must say "qualified". Adds prepare, statement-semantics (incl. enum and nested struct), and SQL-generation tests. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- iModelCore/ECDb/CHANGES.md | 2 +- iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp | 115 +++++++++++++++++- iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h | 1 + iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y | 6 +- .../Tests/NonPublished/ECSqlPrepareTests.cpp | 5 + .../NonPublished/ECSqlStatementTests.cpp | 45 ++++++- .../ECSqlToSqlGenerationTests.cpp | 8 ++ 7 files changed, 171 insertions(+), 11 deletions(-) diff --git a/iModelCore/ECDb/CHANGES.md b/iModelCore/ECDb/CHANGES.md index 31e400706a9..b21fa619814 100644 --- a/iModelCore/ECDb/CHANGES.md +++ b/iModelCore/ECDb/CHANGES.md @@ -10,7 +10,7 @@ This document including important changes to syntax or file format. ## ## `06/23/2026`: Added `IS` / `IS NOT` operator between operands * ECSql version change `2.0.3.2` -> `2.0.4.0`. * The `IS` and `IS NOT` operators can now be used between two operands, e.g. `prop1 IS [NOT] prop2`. Each operand may be any value expression — a property, the `NULL` literal, a constant, a parameter, a function call, an arithmetic expression, etc. These map to SQLite's null-safe comparison operators (`NULL IS NULL` is true, `1 IS NULL` is false). -* Previously `IS` / `IS NOT` only supported the right-hand operands `NULL`, the boolean literals `TRUE`/`FALSE`/`UNKNOWN`, and the class type predicate `IS (ClassName)`. Those forms are unchanged: a right-hand operand that is exactly `NULL`/`TRUE`/`FALSE`/`UNKNOWN`, or a parenthesized `(ClassName)`, keeps its original meaning. (Write a parenthesized value expression without the outer parentheses, e.g. `x IS y + 1` rather than `x IS (y + 1)`, when it could be mistaken for a type predicate.) +* Previously `IS` / `IS NOT` only supported the right-hand operands `NULL`, the boolean literals `TRUE`/`FALSE`/`UNKNOWN`, and the class type predicate `IS (ClassName)`. Those forms are unchanged: a right-hand operand that is exactly `NULL`/`TRUE`/`FALSE`/`UNKNOWN`, or a parenthesized name that resolves to a class — a qualified `(schema.Class)`, an `ONLY`/`ALL`-prefixed form, or a comma-separated list — keeps its original type-predicate meaning. A parenthesized name that does **not** resolve to a class, e.g. a property reference `(alias.prop)`, is parsed as an ordinary value expression (null-safe comparison), exactly as it would be without the parentheses. When a parenthesized qualified name is both a class and a valid property path, the class (type-predicate) reading wins. * For multi-column operands (e.g. `Point2d`/`Point3d` and navigation properties), the comparison is expanded column-wise: `IS` joins the per-column comparisons with `AND`, `IS NOT` joins them with `OR` (consistent with `=` and `<>`). * Example: `SELECT * FROM bis.Element WHERE CodeValue IS NOT UserLabel` * Example: `SELECT * FROM bis.Element WHERE CodeValue IS json_extract(JsonProperties, '$.code')` diff --git a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp index 25aa056a060..b79ffacf772 100644 --- a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp +++ b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.cpp @@ -2442,12 +2442,22 @@ BentleyStatus ECSqlParser::ParseSearchCondition(std::unique_ptr& exp OSQLParseNode const* lhsNode = parseNode->getChild(0/*boolean_primary*/); OSQLParseNode const* rhsNode = parseNode->getChild(3/*truth_value | value_exp*/); + // A parenthesized qualified name on the right-hand side - e.g. 'X IS (alias.prop)' - parses as a + // '(ClassName)' type predicate because it is grammatically identical to one. If the name does not + // resolve to a class, reinterpret it as a property reference or enum literal so the comparison behaves + // like the null-safe 'X IS alias.prop' / 'X IS ts.Enum.Enumerator' instead of failing with a + // "class not found" error. + std::unique_ptr rhsAsValueExp = nullptr; + if (SQL_ISRULE(rhsNode, type_predicate) && SUCCESS != TryParseParenthesizedNameAsValueExp(rhsAsValueExp, rhsNode)) + return ERROR; + // The right-hand operand of 'X IS [NOT] ' is either a "truth value" // (NULL/TRUE/FALSE/UNKNOWN or the (ClassName) type predicate), which keeps the original // boolean-predicate semantics, or any other value expression, which is a null-safe comparison. - const bool rhsIsTruthValue = SQL_ISRULE(rhsNode, type_predicate) + const bool rhsIsTruthValue = rhsAsValueExp == nullptr + && (SQL_ISRULE(rhsNode, type_predicate) || SQL_ISTOKEN(rhsNode, NULL) || SQL_ISTOKEN(rhsNode, TRUE) - || SQL_ISTOKEN(rhsNode, FALSE) || SQL_ISTOKEN(rhsNode, UNKNOWN); + || SQL_ISTOKEN(rhsNode, FALSE) || SQL_ISTOKEN(rhsNode, UNKNOWN)); if (!rhsIsTruthValue) { @@ -2460,7 +2470,9 @@ BentleyStatus ECSqlParser::ParseSearchCondition(std::unique_ptr& exp return ERROR; std::unique_ptr rhsValueExp = nullptr; - if (SUCCESS != ParseValueExp(rhsValueExp, rhsNode)) + if (rhsAsValueExp != nullptr) + rhsValueExp = std::move(rhsAsValueExp); + else if (SUCCESS != ParseValueExp(rhsValueExp, rhsNode)) return ERROR; exp = std::make_unique(std::move(lhsValueExp), op, std::move(rhsValueExp)); @@ -3495,6 +3507,103 @@ BentleyStatus ECSqlParser::ParseTypePredicate(std::unique_ptr& valueEx return SUCCESS; } //----------------------------------------------------------------------------------------- +// In an 'X IS (...)' expression a parenthesized qualified name such as '(alias.prop)' is +// grammatically indistinguishable from the '(ClassName)' type predicate: both reduce to a +// 'type_predicate' node. When the name does not resolve to an existing class, this reinterprets it as +// a property-reference or enum-literal value expression so the statement behaves like the +// null-safe comparison 'X IS alias.prop' / 'X IS ts.Enum.Enumerator' instead of failing with +// a "class not found" error. +// 'valueExp' is left null - so the caller keeps the type-predicate behavior - when the predicate uses +// an ONLY/ALL prefix, a comma-separated type list, the 'schema:class' (colon) form, or a name that +// does resolve to a class (e.g. 'ECClassId IS (ts.Foo)' or 'ECClassId IS (main.ts.Foo)'). +// @bsimethod +//+---------------+---------------+---------------+---------------+---------------+------ +BentleyStatus ECSqlParser::TryParseParenthesizedNameAsValueExp(std::unique_ptr& valueExp, OSQLParseNode const* typePredicateNode) const + { + valueExp = nullptr; + if (!SQL_ISRULE(typePredicateNode, type_predicate)) + return SUCCESS; + + OSQLParseNode const* type_list = typePredicateNode->getChild(1/*type_list*/); + if (type_list->count() != 1) + return SUCCESS; // a comma-separated type list is always a genuine type predicate + + OSQLParseNode const* type_list_item = type_list->getChild(0); + OSQLParseNode const* opt_only = type_list_item->getChild(0/*opt_only*/); + if (opt_only->count() != 0) + return SUCCESS; // an ONLY/ALL prefix is always a genuine type predicate + + OSQLParseNode const* tableNode = type_list_item->getChild(1/*table_node*/); + if (!SQL_ISRULE(tableNode, table_node)) + return SUCCESS; + + OSQLParseNode const* nameNode = tableNode->getChild(0); + PropertyPath propertyPath; + if (SQL_ISRULE(nameNode, qualified_class_name)) + { + // The 'schema:class' (colon) form is class-only syntax and is never a property path. + if (!nameNode->getChild(1/*'.' or ':'*/)->getTokenValue().Equals(".")) + return SUCCESS; + + Utf8StringCR schemaNameOrAlias = nameNode->getChild(0)->getTokenValue(); + OSQLParseNode const* classNameNode = nameNode->getChild(2/*class_name*/); + Utf8StringCR propertyName = classNameNode->getChild(0)->getTokenValue(); + if (schemaNameOrAlias.empty() || propertyName.empty()) + return SUCCESS; + + // If the name resolves to a class, keep the '(ClassName)' type-predicate meaning. + if (m_context->GetECDb().Schemas().GetClass(schemaNameOrAlias, propertyName, SchemaLookupMode::AutoDetect) != nullptr) + return SUCCESS; + + propertyPath.Push(schemaNameOrAlias); + propertyPath.Push(propertyName); + } + else if (SQL_ISRULE(nameNode, tablespace_qualified_class_name)) + { + Utf8StringCR tableSpaceName = nameNode->getChild(0)->getTokenValue(); + OSQLParseNode const* qualifiedNameNode = nameNode->getChild(2/*qualified_class_name*/); + if (!SQL_ISRULE(qualifiedNameNode, qualified_class_name)) + return SUCCESS; + + // The 'tablespace.schema:class' (colon) form is class-only syntax and is never a property path. + if (!qualifiedNameNode->getChild(1/*'.' or ':'*/)->getTokenValue().Equals(".")) + return SUCCESS; + + Utf8StringCR schemaNameOrAlias = qualifiedNameNode->getChild(0)->getTokenValue(); + OSQLParseNode const* classNameNode = qualifiedNameNode->getChild(2/*class_name*/); + Utf8StringCR classNameOrPropertyName = classNameNode->getChild(0)->getTokenValue(); + if (tableSpaceName.empty() || schemaNameOrAlias.empty() || classNameOrPropertyName.empty()) + return SUCCESS; + + // If the name resolves to a tablespace-qualified class, keep the '(ClassName)' type-predicate meaning. + if (m_context->GetECDb().Schemas().GetClass(schemaNameOrAlias, classNameOrPropertyName, SchemaLookupMode::AutoDetect, tableSpaceName.c_str()) != nullptr) + return SUCCESS; + + propertyPath.Push(tableSpaceName); + propertyPath.Push(schemaNameOrAlias); + propertyPath.Push(classNameOrPropertyName); + } + else + return SUCCESS; + + if (propertyPath.Size() == 3) + { + ECEnumerationCP ecEnum = m_context->GetECDb().Schemas().GetEnumeration(propertyPath[0].GetName(), propertyPath[1].GetName(), SchemaLookupMode::AutoDetect); + if (ecEnum != nullptr) + { + ECEnumeratorCP enumerator = ecEnum->FindEnumeratorByName(propertyPath[2].GetName().c_str()); + if (enumerator != nullptr) + { + valueExp = std::make_unique(*enumerator, propertyPath); + return SUCCESS; + } + } + } + + valueExp = std::make_unique(propertyPath); + return SUCCESS; + } +//----------------------------------------------------------------------------------------- // @bsimethod //+---------------+---------------+---------------+---------------+---------------+------ BentleyStatus ECSqlParser::ParseValueExp(std::unique_ptr& valueExp, OSQLParseNode const* parseNode) const diff --git a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h index 67878acc96c..80bd73756e6 100644 --- a/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h +++ b/iModelCore/ECDb/ECDb/ECSql/ECSqlParser.h @@ -261,6 +261,7 @@ struct ECSqlParser final BentleyStatus ParseTableValuedFunction(std::unique_ptr&, connectivity::OSQLParseNode const&) const; BentleyStatus ParseIIFExp(std::unique_ptr &valueExp, connectivity::OSQLParseNode const *parseNode) const; BentleyStatus ParseTypePredicate(std::unique_ptr &valueExp, connectivity::OSQLParseNode const *parseNode) const; + BentleyStatus TryParseParenthesizedNameAsValueExp(std::unique_ptr &valueExp, connectivity::OSQLParseNode const *typePredicateNode) const; BentleyStatus ParseWindowClause(std::unique_ptr&, connectivity::OSQLParseNode const*) const; BentleyStatus ParseWindowDefinitionListExp(std::unique_ptr&, connectivity::OSQLParseNode const*) const; BentleyStatus ParseWindowDefinitionExp(std::unique_ptr&, connectivity::OSQLParseNode const*) const; diff --git a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y index 1a280862007..1d33a45aaa8 100644 --- a/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y +++ b/iModelCore/ECDb/ECDb/ECSql/Parser/sqlbison.y @@ -993,7 +993,11 @@ type_list: prefix, or a comma-separated list. A single *unqualified* name in parentheses - e.g. 'X IS (S2)' - still reduces as a parenthesized value_exp (null-safe comparison), not a type predicate; so if an identifier is both a class and a property name, the value- - expression (property) reading wins. See ECSqlStatementTests IsAndIsNotOperatorNullSafeSemantics. */ + expression (property) reading wins. + A *qualified* name in parentheses - e.g. 'X IS (alias.prop)' - does reduce here as a type + predicate, but the semantic layer (ECSqlParser::TryParseParenthesizedNameAsValueExp) + reinterprets it as a property reference (null-safe comparison) when the name does not resolve + to a class. See ECSqlStatementTests IsAndIsNotOperatorNullSafeSemantics. */ type_list_item: table_node { diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp index 2213e661dbb..517a38cd4a8 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp @@ -1722,6 +1722,11 @@ TEST_F(ECSqlSelectPrepareTests, WhereBasics) // 'IS' / 'IS NOT' accept any value expression on either side (null-safe comparison), not just NULL. EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE I IS 123")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE B IS TRUE")); + // a parenthesized qualified property reference '(alias.prop)' is a value expression (null-safe + // comparison), not the '(ClassName)' type predicate, when the name does not resolve to a class. + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE I IS (P.I)")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P p WHERE p.I IS (p.I)")); + EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P p WHERE p.I IS NOT (p.I)")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE L < 3.14")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE (L < 3.14 AND I > 3) OR B = True AND D > 0.0")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE 8 % 3 = 2")); diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp index a32bae1c23c..0f1ca9fbb90 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp @@ -4213,20 +4213,29 @@ TEST_F(ECSqlStatementTestFixture, WrapWhereClauseInParams) TEST_F(ECSqlStatementTestFixture, IsAndIsNotOperatorNullSafeSemantics) { ASSERT_EQ(BentleyStatus::SUCCESS, SetupECDb("IsOperatorSemantics.ecdb", SchemaItem( - R"xml( + R"xml( + + + + + + + + + )xml"))); // (S1, S2): equal-nonnull, different, both-null, one-null, the-other-null - ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2) VALUES('a','a')")); - ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2) VALUES('a','b')")); - ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2) VALUES(NULL,NULL)")); - ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2) VALUES(NULL,'b')")); - ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2) VALUES('a',NULL)")); + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2,Status,Info.Code) VALUES('a','a',ts.Status.Active,'a')")); + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2,Status,Info.Code) VALUES('a','b',ts.Status.Inactive,'b')")); + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2,Status,Info.Code) VALUES(NULL,NULL,ts.Status.Active,NULL)")); + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2,Status,Info.Code) VALUES(NULL,'b',NULL,'b')")); + ASSERT_EQ(BE_SQLITE_DONE, GetHelper().ExecuteECSql("INSERT INTO ts.Foo(S1,S2,Status,Info.Code) VALUES('a',NULL,ts.Status.Active,NULL)")); auto count = [this](Utf8CP whereClause) -> int { @@ -4236,6 +4245,15 @@ TEST_F(ECSqlStatementTestFixture, IsAndIsNotOperatorNullSafeSemantics) return stmt.GetValueInt(0); }; + // same as 'count' but with an explicit range alias 'f', so 'f.' references can be used + auto countAliased = [this](Utf8CP whereClause) -> int + { + ECSqlStatement stmt; + EXPECT_EQ(ECSqlStatus::Success, stmt.Prepare(m_ecdb, Utf8PrintfString("SELECT COUNT(*) FROM ts.Foo f WHERE %s", whereClause).c_str())) << whereClause; + EXPECT_EQ(BE_SQLITE_ROW, stmt.Step()) << whereClause; + return stmt.GetValueInt(0); + }; + // null-safe equality: matches ('a','a') and (NULL,NULL) EXPECT_EQ(2, count("S1 IS S2")); // null-safe inequality: matches ('a','b'), (NULL,'b'), ('a',NULL) @@ -4258,6 +4276,21 @@ TEST_F(ECSqlStatementTestFixture, IsAndIsNotOperatorNullSafeSemantics) EXPECT_EQ(2, count("LOWER(S1) IS S2")); // a parenthesized unqualified name is a value expression here, not a type predicate EXPECT_EQ(2, count("S1 IS (S2)")); + // a parenthesized *qualified* property reference '(alias.prop)' is likewise a value expression + // (null-safe comparison), not the '(ClassName)' type predicate: the name does not resolve to a + // class, so it is reread as the property 'alias.prop'. + EXPECT_EQ(2, count("S1 IS (Foo.S2)")); // implicit class-name range qualifier + EXPECT_EQ(3, count("S1 IS NOT (Foo.S2)")); + EXPECT_EQ(2, countAliased("f.S1 IS (f.S2)")); // explicit range alias + EXPECT_EQ(3, countAliased("f.S1 IS NOT (f.S2)")); + // three-part names can also be value expressions: a nested property reference or an enum literal + EXPECT_EQ(2, countAliased("f.S1 IS (f.Info.Code)")); + EXPECT_EQ(3, countAliased("f.S1 IS NOT (f.Info.Code)")); + EXPECT_EQ(3, count("Status IS (ts.Status.Active)")); + EXPECT_EQ(2, count("Status IS NOT (ts.Status.Active)")); + // regression: a parenthesized name that *is* a class keeps the '(ClassName)' type-predicate meaning + EXPECT_EQ(5, count("ECClassId IS (ts.Foo)")); // every row is a ts.Foo instance + EXPECT_EQ(0, count("ECClassId IS NOT (ts.Foo)")); // parameter on the right-hand side, bound to a value and to NULL (null-safe both ways) { diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp index 083f98af98e..cdaf427f7ac 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp @@ -1336,5 +1336,13 @@ TEST_F(ECSqlToSqlGenerationTests, IsAndIsNotOperatorBetweenOperands) // regression: the existing IS (ClassName) type predicate is unaffected EXPECT_TRUE(GetHelper().ECSqlToSql("SELECT 1 FROM ts.Foo WHERE ECClassId IS (ts.Foo)").Contains("ec_cache_ClassHierarchy")); + + // a parenthesized qualified property reference '(alias.prop)' is a value expression (null-safe + // comparison), not the (ClassName) type predicate, because the name does not resolve to a class + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS (Foo.S2)", "WHERE [Foo].[S1] IS [Foo].[S2]"); + assertWhere("SELECT 1 FROM ts.Foo WHERE S1 IS NOT (Foo.S2)", "WHERE [Foo].[S1] IS NOT [Foo].[S2]"); + // multi-column point operand still expands column-wise through the parenthesized property reference + assertWhere("SELECT 1 FROM ts.Foo WHERE P1 IS (Foo.P2)", + "WHERE ([Foo].[P1_X] IS [Foo].[P2_X] AND [Foo].[P1_Y] IS [Foo].[P2_Y] AND [Foo].[P1_Z] IS [Foo].[P2_Z])"); } END_ECDBUNITTESTS_NAMESPACE From e2ba404e56860bf299c541b01a663acf30ab11b5 Mon Sep 17 00:00:00 2001 From: Affan Khan Date: Tue, 7 Jul 2026 13:45:47 -0400 Subject: [PATCH 7/7] Address review: add IS negative-parse and type-list regression tests - ECSqlPrepareTests: add InvalidECSql cases for 'X IS (alias.NonExistentProp)' (parenthesized qualified name that is neither a class nor an existing property falls through TryParseParenthesizedNameAsValueExp to a PropertyNameExp that fails resolution, rather than being silently accepted). - ECSqlStatementTests: add matching negative cases for a missing property and a missing enum enumerator '(ts.Status.DoesNotExist)'. - ECSqlToSqlGenerationTests: add a Bar class and regression tests confirming the type_list_item grammar refactor keeps the ONLY/ALL and comma-separated type-list forms routing through the type-predicate path (ONLY -> exact 'IN ()' with no ec_cache_ClassHierarchy; polymorphic comma-list -> ec_cache). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Tests/NonPublished/ECSqlPrepareTests.cpp | 6 ++++++ .../NonPublished/ECSqlStatementTests.cpp | 9 ++++++++ .../ECSqlToSqlGenerationTests.cpp | 21 +++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp index 517a38cd4a8..6f3579fda56 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlPrepareTests.cpp @@ -1727,6 +1727,12 @@ TEST_F(ECSqlSelectPrepareTests, WhereBasics) EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE I IS (P.I)")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P p WHERE p.I IS (p.I)")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P p WHERE p.I IS NOT (p.I)")); + // a parenthesized qualified name that resolves to neither a class nor an existing property is an + // error: it is not a class (so it is not a type predicate) and it falls through + // TryParseParenthesizedNameAsValueExp to a PropertyNameExp that then fails property resolution - + // it is not silently accepted. + EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P WHERE I IS (P.NonExistentProp)")); + EXPECT_EQ(ECSqlStatus::InvalidECSql, Prepare("SELECT NULL FROM ecsql.P p WHERE p.I IS NOT (p.NonExistentProp)")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE L < 3.14")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE (L < 3.14 AND I > 3) OR B = True AND D > 0.0")); EXPECT_EQ(ECSqlStatus::Success, Prepare("SELECT NULL FROM ecsql.P WHERE 8 % 3 = 2")); diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp index 0f1ca9fbb90..89e13983b2e 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlStatementTests.cpp @@ -4309,6 +4309,15 @@ TEST_F(ECSqlStatementTestFixture, IsAndIsNotOperatorNullSafeSemantics) // operands of incompatible types are rejected (string vs point) ECSqlStatement bad; EXPECT_NE(ECSqlStatus::Success, bad.Prepare(m_ecdb, "SELECT 1 FROM ts.Foo WHERE S1 IS P1")); + + // a parenthesized qualified name that resolves to neither a class nor an existing property/enumerator + // is rejected at prepare time (it falls through to a property reference that fails to resolve): + ECSqlStatement badProp; + EXPECT_NE(ECSqlStatus::Success, badProp.Prepare(m_ecdb, "SELECT 1 FROM ts.Foo WHERE S1 IS (Foo.NonExistentProp)")); + // enum whose enumerator does not exist: the enum is found but the enumerator is not, so it is not a + // silent pass either + ECSqlStatement badEnum; + EXPECT_NE(ECSqlStatus::Success, badEnum.Prepare(m_ecdb, "SELECT 1 FROM ts.Foo WHERE Status IS (ts.Status.DoesNotExist)")); } //--------------------------------------------------------------------------------------- diff --git a/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp b/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp index cdaf427f7ac..142248d7281 100644 --- a/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp +++ b/iModelCore/ECDb/Tests/NonPublished/ECSqlToSqlGenerationTests.cpp @@ -1291,6 +1291,9 @@ TEST_F(ECSqlToSqlGenerationTests, IsAndIsNotOperatorBetweenOperands) + + + @@ -1344,5 +1347,23 @@ TEST_F(ECSqlToSqlGenerationTests, IsAndIsNotOperatorBetweenOperands) // multi-column point operand still expands column-wise through the parenthesized property reference assertWhere("SELECT 1 FROM ts.Foo WHERE P1 IS (Foo.P2)", "WHERE ([Foo].[P1_X] IS [Foo].[P2_X] AND [Foo].[P1_Y] IS [Foo].[P2_Y] AND [Foo].[P1_Z] IS [Foo].[P2_Z])"); + + // regression: the type_list_item grammar refactor (opt_only is now inlined into three explicit + // alternatives) must keep the ONLY / ALL and comma-separated type-list forms routing through the + // type-predicate path - not TryParseParenthesizedNameAsValueExp, which would reinterpret the + // parenthesized name as a value expression. An ONLY (non-polymorphic) list is optimized to an + // exact 'IN ()' filter and does not use ec_cache_ClassHierarchy; a polymorphic + // comma-separated list resolves through ec_cache_ClassHierarchy. + { + Utf8String onlySql = GetHelper().ECSqlToSql("SELECT 1 FROM ts.Foo WHERE ECClassId IS (ONLY ts.Foo)"); + EXPECT_FALSE(onlySql.empty()) << "IS (ONLY ts.Foo) must prepare as a type predicate"; + EXPECT_FALSE(onlySql.Contains("ec_cache_ClassHierarchy")) << "ONLY is a non-polymorphic exact match: " << onlySql; + + Utf8String onlyListSql = GetHelper().ECSqlToSql("SELECT 1 FROM ts.Foo WHERE ECClassId IS (ONLY ts.Foo, ONLY ts.Bar)"); + EXPECT_FALSE(onlyListSql.empty()) << "IS (ONLY ts.Foo, ONLY ts.Bar) must prepare as a type predicate"; + EXPECT_FALSE(onlyListSql.Contains("ec_cache_ClassHierarchy")) << "an all-exact type list is optimized: " << onlyListSql; + } + EXPECT_TRUE(GetHelper().ECSqlToSql("SELECT 1 FROM ts.Foo WHERE ECClassId IS (ts.Foo, ts.Bar)").Contains("ec_cache_ClassHierarchy")); + EXPECT_TRUE(GetHelper().ECSqlToSql("SELECT 1 FROM ts.Foo WHERE ECClassId IS NOT (ts.Foo, ts.Bar)").Contains("ec_cache_ClassHierarchy")); } END_ECDBUNITTESTS_NAMESPACE