From 2ad9d693963acbb06c541934b661227e99a324b7 Mon Sep 17 00:00:00 2001 From: Denis Flaven Date: Tue, 16 Aug 2011 08:14:11 +0000 Subject: [PATCH] Implemented the OQL operator ABOVE (and its variants ABOVE STRICT, NOT ABOVE and NOT ABOVE STRICT) that returns the (indirect) parents of a given node in a hierarchy. It's the opposite to 'BELOW' that returns the (indirect) children. SVN:trunk[1454] --- core/dbobjectsearch.class.php | 48 ++ core/metamodel.class.php | 3 +- core/oql/oql-lexer.php | 44 +- core/oql/oql-lexer.plex | 16 + core/oql/oql-parser.php | 1169 +++++++++++++++++---------------- core/oql/oql-parser.y | 4 + core/sqlquery.class.inc.php | 23 +- 7 files changed, 726 insertions(+), 581 deletions(-) diff --git a/core/dbobjectsearch.class.php b/core/dbobjectsearch.class.php index 0e551c230..1e7450a09 100644 --- a/core/dbobjectsearch.class.php +++ b/core/dbobjectsearch.class.php @@ -28,6 +28,10 @@ define('TREE_OPERATOR_BELOW', 1); define('TREE_OPERATOR_BELOW_STRICT', 2); define('TREE_OPERATOR_NOT_BELOW', 3); define('TREE_OPERATOR_NOT_BELOW_STRICT', 4); +define('TREE_OPERATOR_ABOVE', 5); +define('TREE_OPERATOR_ABOVE_STRICT', 6); +define('TREE_OPERATOR_NOT_ABOVE', 7); +define('TREE_OPERATOR_NOT_ABOVE_STRICT', 8); class DBObjectSearch { @@ -155,6 +159,22 @@ class DBObjectSearch case TREE_OPERATOR_NOT_BELOW_STRICT: $sOperator = 'strictly not below'; break; + + case TREE_OPERATOR_ABOVE: + $sOperator = 'above'; + break; + + case TREE_OPERATOR_ABOVE_STRICT: + $sOperator = 'strictly above'; + break; + + case TREE_OPERATOR_NOT_ABOVE: + $sOperator = 'not above'; + break; + + case TREE_OPERATOR_NOT_ABOVE_STRICT: + $sOperator = 'strictly not above'; + break; } $aDescription[] = $oAtt->GetLabel()."$sOperator ({$oFilter->DescribeConditions()})"; } @@ -842,6 +862,22 @@ class DBObjectSearch $sOperator = ' NOT BELOW STRICT '; break; + case TREE_OPERATOR_ABOVE: + $sOperator = ' ABOVE '; + break; + + case TREE_OPERATOR_ABOVE_STRICT: + $sOperator = ' ABOVE STRICT '; + break; + + case TREE_OPERATOR_NOT_ABOVE: + $sOperator = ' NOT ABOVE '; + break; + + case TREE_OPERATOR_NOT_ABOVE_STRICT: + $sOperator = ' NOT ABOVE STRICT '; + break; + } $sRes .= ' JOIN '.$oFilter->GetClass().' AS '.$oFilter->GetClassAlias().' ON '.$this->GetClassAlias().'.'.$sExtKey.$sOperator.$oFilter->GetClassAlias().'.id'; $sRes .= $oFilter->ToOQL_Joins(); @@ -1077,6 +1113,18 @@ class DBObjectSearch case 'NOT_BELOW_STRICT': $iOperatorCode = TREE_OPERATOR_NOT_BELOW_STRICT; break; + case 'ABOVE': + $iOperatorCode = TREE_OPERATOR_ABOVE; + break; + case 'ABOVE_STRICT': + $iOperatorCode = TREE_OPERATOR_ABOVE_STRICT; + break; + case 'NOT_ABOVE': + $iOperatorCode = TREE_OPERATOR_NOT_ABOVE; + break; + case 'NOT_ABOVE_STRICT': + $iOperatorCode = TREE_OPERATOR_NOT_ABOVE_STRICT; + break; } $aJoinItems[$sFromClass]->AddCondition_PointingTo($aJoinItems[$sToClass], $sExtKeyAttCode, $iOperatorCode); } diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 41b2b7e77..dffdd37e2 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -2519,9 +2519,10 @@ if (!array_key_exists($sAttCode, self::$m_aAttribDefs[$sClass])) $sRightIndex = $sExternalKeyField.'_right'; // TODO use GetSQLRight() $LocalKeyLeft = $oKeyAttDef->GetSQLLeft(); + $LocalKeyRight = $oKeyAttDef->GetSQLRight(); //echo "MAKEQUERY-LocalKeyLeft pour $sKeyAttCode => $LocalKeyLeft
\n"; - $oSelectBase->AddInnerJoinTree($oSelectExtKey, $LocalKeyLeft, $sLeftIndex, $sRightIndex, $sExternalKeyTable, $iOperatorCode); + $oSelectBase->AddInnerJoinTree($oSelectExtKey, $LocalKeyLeft, $LocalKeyRight, $sLeftIndex, $sRightIndex, $sExternalKeyTable, $iOperatorCode); } } } diff --git a/core/oql/oql-lexer.php b/core/oql/oql-lexer.php index d9fda9bae..ada6d5519 100644 --- a/core/oql/oql-lexer.php +++ b/core/oql/oql-lexer.php @@ -164,6 +164,10 @@ class OQLLexerRaw '/\GBELOW STRICT/ ', '/\GNOT BELOW/ ', '/\GNOT BELOW STRICT/ ', + '/\GABOVE/ ', + '/\GABOVE STRICT/ ', + '/\GNOT ABOVE/ ', + '/\GNOT ABOVE STRICT/ ', '/\G[0-9]+|0x[0-9a-fA-F]+/ ', '/\G\"([^\\\\\"]|\\\\\"|\\\\\\\\)*\"|'.chr(94).chr(39).'([^\\\\'.chr(39).']|\\\\'.chr(39).'|\\\\\\\\)*'.chr(39).'/ ', '/\G([_a-zA-Z][_a-zA-Z0-9]*|`[^`]+`)/ ', @@ -554,24 +558,44 @@ class OQLLexerRaw function yy_r1_58($yy_subpatterns) { - $this->token = OQLParser::NUMVAL; + $this->token = OQLParser::ABOVE; } function yy_r1_59($yy_subpatterns) { - $this->token = OQLParser::STRVAL; + $this->token = OQLParser::ABOVE_STRICT; } function yy_r1_60($yy_subpatterns) { - $this->token = OQLParser::NAME; + $this->token = OQLParser::NOT_ABOVE; } function yy_r1_61($yy_subpatterns) { - $this->token = OQLParser::VARNAME; + $this->token = OQLParser::NOT_ABOVE_STRICT; } function yy_r1_62($yy_subpatterns) + { + + $this->token = OQLParser::NUMVAL; + } + function yy_r1_63($yy_subpatterns) + { + + $this->token = OQLParser::STRVAL; + } + function yy_r1_64($yy_subpatterns) + { + + $this->token = OQLParser::NAME; + } + function yy_r1_65($yy_subpatterns) + { + + $this->token = OQLParser::VARNAME; + } + function yy_r1_66($yy_subpatterns) { $this->token = OQLParser::DOT; @@ -580,7 +604,7 @@ class OQLLexerRaw } -define('UNEXPECTED_INPUT_AT_LINE', 'Unexpected input at line '); +define('UNEXPECTED_INPUT_AT_LINE', 'Unexpected input at line'); class OQLLexerException extends OQLException { @@ -597,11 +621,11 @@ class OQLLexer extends OQLLexerRaw return max(0, $this->count - strlen($this->value)); } - function yylex() - { - try - { - return parent::yylex(); + function yylex() + { + try + { + return parent::yylex(); } catch (Exception $e) { diff --git a/core/oql/oql-lexer.plex b/core/oql/oql-lexer.plex index a8c3a3c45..1e2c837b9 100644 --- a/core/oql/oql-lexer.plex +++ b/core/oql/oql-lexer.plex @@ -136,6 +136,10 @@ below = "BELOW" below_strict = "BELOW STRICT" not_below = "NOT BELOW" not_below_strict = "NOT BELOW STRICT" +above = "ABOVE" +above_strict = "ABOVE STRICT" +not_above = "NOT ABOVE" +not_above_strict = "NOT ABOVE STRICT" numval = /[0-9]+|0x[0-9a-fA-F]+/ strval = /"([^\\"]|\\"|\\\\)*"|'.chr(94).chr(39).'([^\\'.chr(39).']|\\'.chr(39).'|\\\\)*'.chr(39).'/ name = /([_a-zA-Z][_a-zA-Z0-9]*|`[^`]+`)/ @@ -318,6 +322,18 @@ not_below { not_below_strict { $this->token = OQLParser::NOT_BELOW_STRICT; } +above { + $this->token = OQLParser::ABOVE; +} +above_strict { + $this->token = OQLParser::ABOVE_STRICT; +} +not_above { + $this->token = OQLParser::NOT_ABOVE; +} +not_above_strict { + $this->token = OQLParser::NOT_ABOVE_STRICT; +} numval { $this->token = OQLParser::NUMVAL; } diff --git a/core/oql/oql-parser.php b/core/oql/oql-parser.php index c1fb2ea39..3814f8729 100644 --- a/core/oql/oql-parser.php +++ b/core/oql/oql-parser.php @@ -123,59 +123,63 @@ class OQLParserRaw#line 102 "oql-parser.php" const BELOW_STRICT = 10; const NOT_BELOW = 11; const NOT_BELOW_STRICT = 12; - const PAR_OPEN = 13; - const PAR_CLOSE = 14; - const INTERVAL = 15; - const F_SECOND = 16; - const F_MINUTE = 17; - const F_HOUR = 18; - const F_DAY = 19; - const F_MONTH = 20; - const F_YEAR = 21; - const DOT = 22; - const VARNAME = 23; - const NAME = 24; - const NUMVAL = 25; - const STRVAL = 26; - const REGEXP = 27; - const NOT_EQ = 28; - const LOG_AND = 29; - const LOG_OR = 30; - const MATH_DIV = 31; - const MATH_MULT = 32; - const MATH_PLUS = 33; - const MATH_MINUS = 34; - const GT = 35; - const LT = 36; - const GE = 37; - const LE = 38; - const LIKE = 39; - const NOT_LIKE = 40; - const IN = 41; - const NOT_IN = 42; - const F_IF = 43; - const F_ELT = 44; - const F_COALESCE = 45; - const F_ISNULL = 46; - const F_CONCAT = 47; - const F_SUBSTR = 48; - const F_TRIM = 49; - const F_DATE = 50; - const F_DATE_FORMAT = 51; - const F_CURRENT_DATE = 52; - const F_NOW = 53; - const F_TIME = 54; - const F_TO_DAYS = 55; - const F_FROM_DAYS = 56; - const F_DATE_ADD = 57; - const F_DATE_SUB = 58; - const F_ROUND = 59; - const F_FLOOR = 60; - const F_INET_ATON = 61; - const F_INET_NTOA = 62; - const YY_NO_ACTION = 250; - const YY_ACCEPT_ACTION = 249; - const YY_ERROR_ACTION = 248; + const ABOVE = 13; + const ABOVE_STRICT = 14; + const NOT_ABOVE = 15; + const NOT_ABOVE_STRICT = 16; + const PAR_OPEN = 17; + const PAR_CLOSE = 18; + const INTERVAL = 19; + const F_SECOND = 20; + const F_MINUTE = 21; + const F_HOUR = 22; + const F_DAY = 23; + const F_MONTH = 24; + const F_YEAR = 25; + const DOT = 26; + const VARNAME = 27; + const NAME = 28; + const NUMVAL = 29; + const STRVAL = 30; + const REGEXP = 31; + const NOT_EQ = 32; + const LOG_AND = 33; + const LOG_OR = 34; + const MATH_DIV = 35; + const MATH_MULT = 36; + const MATH_PLUS = 37; + const MATH_MINUS = 38; + const GT = 39; + const LT = 40; + const GE = 41; + const LE = 42; + const LIKE = 43; + const NOT_LIKE = 44; + const IN = 45; + const NOT_IN = 46; + const F_IF = 47; + const F_ELT = 48; + const F_COALESCE = 49; + const F_ISNULL = 50; + const F_CONCAT = 51; + const F_SUBSTR = 52; + const F_TRIM = 53; + const F_DATE = 54; + const F_DATE_FORMAT = 55; + const F_CURRENT_DATE = 56; + const F_NOW = 57; + const F_TIME = 58; + const F_TO_DAYS = 59; + const F_FROM_DAYS = 60; + const F_DATE_ADD = 61; + const F_DATE_SUB = 62; + const F_ROUND = 63; + const F_FLOOR = 64; + const F_INET_ATON = 65; + const F_INET_NTOA = 66; + const YY_NO_ACTION = 262; + const YY_ACCEPT_ACTION = 261; + const YY_ERROR_ACTION = 260; /* Next are that tables used to determine what action to take based on the ** current state and lookahead token. These tables are used to implement @@ -227,198 +231,195 @@ class OQLParserRaw#line 102 "oql-parser.php" ** shifting non-terminals after a reduce. ** self::$yy_default Default action for each state. */ - const YY_SZ_ACTTAB = 501; + const YY_SZ_ACTTAB = 486; static public $yy_action = array( - /* 0 */ 6, 84, 5, 1, 30, 28, 118, 117, 99, 32, - /* 10 */ 115, 116, 114, 112, 66, 67, 69, 68, 70, 61, - /* 20 */ 18, 19, 20, 21, 16, 34, 151, 151, 141, 32, - /* 30 */ 113, 104, 103, 95, 94, 93, 91, 92, 96, 97, - /* 40 */ 102, 101, 100, 98, 137, 136, 135, 133, 134, 138, - /* 50 */ 17, 56, 23, 56, 8, 53, 75, 51, 122, 85, - /* 60 */ 31, 40, 6, 144, 30, 13, 109, 108, 118, 117, - /* 70 */ 99, 141, 115, 116, 114, 112, 41, 123, 121, 30, - /* 80 */ 59, 72, 59, 119, 120, 124, 125, 130, 129, 128, - /* 90 */ 90, 126, 113, 104, 103, 95, 94, 93, 91, 92, - /* 100 */ 96, 97, 102, 101, 100, 98, 137, 136, 135, 133, - /* 110 */ 134, 138, 6, 10, 127, 11, 27, 35, 118, 117, - /* 120 */ 99, 74, 115, 116, 114, 112, 132, 131, 47, 139, - /* 130 */ 141, 30, 8, 143, 142, 63, 50, 58, 33, 30, - /* 140 */ 25, 52, 113, 104, 103, 95, 94, 93, 91, 92, - /* 150 */ 96, 97, 102, 101, 100, 98, 137, 136, 135, 133, - /* 160 */ 134, 138, 249, 140, 76, 56, 72, 72, 77, 72, - /* 170 */ 72, 82, 45, 36, 86, 83, 57, 56, 29, 2, - /* 180 */ 24, 9, 15, 82, 49, 37, 86, 83, 57, 64, - /* 190 */ 107, 105, 106, 110, 59, 4, 79, 72, 7, 48, - /* 200 */ 200, 111, 107, 105, 106, 110, 59, 72, 65, 12, - /* 210 */ 56, 116, 3, 32, 89, 42, 82, 39, 36, 86, - /* 220 */ 83, 57, 55, 78, 56, 24, 56, 15, 56, 49, - /* 230 */ 88, 71, 51, 60, 80, 107, 105, 106, 110, 59, - /* 240 */ 81, 56, 205, 205, 205, 205, 205, 82, 45, 36, - /* 250 */ 86, 83, 57, 59, 205, 59, 24, 59, 15, 205, - /* 260 */ 49, 205, 205, 205, 205, 205, 107, 105, 106, 110, - /* 270 */ 59, 56, 205, 56, 205, 205, 205, 87, 56, 73, - /* 280 */ 205, 205, 205, 205, 82, 39, 36, 86, 83, 57, - /* 290 */ 205, 205, 205, 24, 205, 15, 205, 49, 205, 205, - /* 300 */ 59, 62, 59, 107, 105, 106, 110, 59, 56, 205, - /* 310 */ 205, 205, 205, 205, 82, 43, 36, 86, 83, 57, - /* 320 */ 205, 205, 205, 24, 205, 15, 205, 49, 205, 205, - /* 330 */ 54, 205, 205, 107, 105, 106, 110, 59, 56, 205, - /* 340 */ 205, 205, 205, 205, 82, 22, 36, 86, 83, 57, - /* 350 */ 205, 205, 205, 24, 205, 15, 205, 49, 205, 205, - /* 360 */ 205, 205, 205, 107, 105, 106, 110, 59, 205, 56, - /* 370 */ 205, 205, 205, 205, 205, 82, 38, 36, 86, 83, - /* 380 */ 57, 205, 205, 205, 24, 205, 15, 205, 49, 205, - /* 390 */ 205, 205, 205, 56, 107, 105, 106, 110, 59, 82, - /* 400 */ 44, 36, 86, 83, 57, 205, 205, 205, 24, 205, - /* 410 */ 15, 205, 49, 205, 205, 205, 205, 56, 107, 105, - /* 420 */ 106, 110, 59, 82, 205, 36, 86, 83, 57, 205, - /* 430 */ 205, 205, 24, 205, 15, 205, 46, 205, 205, 205, - /* 440 */ 205, 205, 107, 105, 106, 110, 59, 56, 205, 205, - /* 450 */ 205, 205, 205, 82, 205, 36, 86, 83, 57, 205, - /* 460 */ 205, 205, 24, 205, 14, 205, 205, 205, 205, 205, - /* 470 */ 205, 56, 107, 105, 106, 110, 59, 82, 205, 36, - /* 480 */ 86, 83, 57, 205, 205, 205, 26, 205, 205, 205, - /* 490 */ 205, 205, 205, 205, 205, 205, 107, 105, 106, 110, - /* 500 */ 59, + /* 0 */ 16, 71, 69, 68, 70, 65, 66, 10, 91, 31, + /* 10 */ 159, 159, 80, 35, 115, 120, 6, 137, 127, 11, + /* 20 */ 128, 126, 145, 140, 139, 8, 94, 95, 92, 93, + /* 30 */ 120, 125, 124, 138, 118, 116, 13, 129, 130, 135, + /* 40 */ 136, 134, 133, 131, 132, 53, 98, 99, 104, 105, + /* 50 */ 103, 102, 100, 101, 121, 122, 143, 144, 142, 141, + /* 60 */ 146, 151, 150, 149, 147, 148, 6, 48, 7, 9, + /* 70 */ 33, 34, 145, 140, 139, 35, 94, 95, 92, 93, + /* 80 */ 5, 25, 20, 19, 18, 21, 24, 22, 23, 17, + /* 90 */ 84, 36, 27, 33, 64, 56, 98, 99, 104, 105, + /* 100 */ 103, 102, 100, 101, 121, 122, 143, 144, 142, 141, + /* 110 */ 146, 151, 150, 149, 147, 148, 6, 37, 39, 78, + /* 120 */ 74, 74, 145, 140, 139, 120, 94, 95, 92, 93, + /* 130 */ 44, 8, 38, 33, 67, 50, 46, 12, 33, 33, + /* 140 */ 3, 1, 79, 212, 152, 28, 98, 99, 104, 105, + /* 150 */ 103, 102, 100, 101, 121, 122, 143, 144, 142, 141, + /* 160 */ 146, 151, 150, 149, 147, 148, 261, 123, 112, 62, + /* 170 */ 95, 74, 58, 61, 74, 108, 47, 40, 110, 109, + /* 180 */ 63, 97, 119, 62, 30, 35, 15, 4, 45, 81, + /* 190 */ 49, 113, 32, 85, 117, 107, 106, 96, 60, 62, + /* 200 */ 213, 74, 74, 2, 213, 108, 52, 40, 110, 109, + /* 210 */ 63, 57, 60, 213, 30, 213, 15, 114, 45, 213, + /* 220 */ 213, 74, 90, 62, 117, 107, 106, 96, 60, 108, + /* 230 */ 52, 40, 110, 109, 63, 213, 213, 213, 30, 62, + /* 240 */ 15, 213, 45, 213, 77, 55, 72, 62, 117, 107, + /* 250 */ 106, 96, 60, 108, 43, 40, 110, 109, 63, 213, + /* 260 */ 213, 213, 30, 213, 15, 213, 45, 213, 60, 59, + /* 270 */ 111, 62, 117, 107, 106, 96, 60, 108, 47, 40, + /* 280 */ 110, 109, 63, 213, 213, 213, 30, 213, 15, 213, + /* 290 */ 45, 213, 213, 213, 213, 62, 117, 107, 106, 96, + /* 300 */ 60, 108, 51, 40, 110, 109, 63, 213, 213, 213, + /* 310 */ 30, 62, 15, 213, 45, 213, 83, 55, 213, 62, + /* 320 */ 117, 107, 106, 96, 60, 108, 42, 40, 110, 109, + /* 330 */ 63, 213, 213, 213, 30, 213, 15, 213, 45, 213, + /* 340 */ 60, 213, 213, 62, 117, 107, 106, 96, 60, 108, + /* 350 */ 26, 40, 110, 109, 63, 213, 213, 213, 30, 213, + /* 360 */ 15, 213, 45, 213, 213, 213, 213, 62, 117, 107, + /* 370 */ 106, 96, 60, 108, 62, 40, 110, 109, 63, 213, + /* 380 */ 73, 213, 30, 62, 15, 213, 54, 213, 213, 82, + /* 390 */ 213, 62, 117, 107, 106, 96, 60, 108, 62, 40, + /* 400 */ 110, 109, 63, 60, 86, 213, 30, 213, 14, 213, + /* 410 */ 213, 213, 60, 213, 213, 62, 117, 107, 106, 96, + /* 420 */ 60, 108, 62, 40, 110, 109, 63, 60, 89, 213, + /* 430 */ 29, 213, 62, 213, 213, 213, 213, 213, 76, 62, + /* 440 */ 117, 107, 106, 96, 60, 108, 62, 41, 110, 109, + /* 450 */ 63, 60, 87, 213, 62, 213, 62, 213, 213, 213, + /* 460 */ 75, 60, 88, 213, 117, 107, 106, 96, 60, 213, + /* 470 */ 213, 213, 213, 213, 213, 60, 213, 213, 213, 213, + /* 480 */ 213, 213, 213, 60, 213, 60, ); static public $yy_lookahead = array( - /* 0 */ 13, 68, 15, 13, 71, 2, 19, 20, 21, 6, - /* 10 */ 23, 24, 25, 26, 16, 17, 18, 19, 20, 21, - /* 20 */ 8, 9, 10, 11, 12, 2, 3, 4, 30, 6, - /* 30 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - /* 40 */ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - /* 50 */ 1, 67, 67, 67, 88, 70, 72, 73, 8, 73, - /* 60 */ 2, 68, 13, 29, 71, 7, 41, 42, 19, 20, - /* 70 */ 21, 30, 23, 24, 25, 26, 68, 27, 28, 71, - /* 80 */ 96, 96, 96, 33, 34, 35, 36, 37, 38, 39, - /* 90 */ 40, 81, 43, 44, 45, 46, 47, 48, 49, 50, + /* 0 */ 1, 20, 21, 22, 23, 24, 25, 89, 8, 2, + /* 10 */ 3, 4, 73, 6, 18, 34, 17, 35, 36, 87, + /* 20 */ 102, 103, 23, 24, 25, 92, 27, 28, 29, 30, + /* 30 */ 34, 31, 32, 101, 45, 46, 7, 37, 38, 39, + /* 40 */ 40, 41, 42, 43, 44, 26, 47, 48, 49, 50, + /* 50 */ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + /* 60 */ 61, 62, 63, 64, 65, 66, 17, 72, 19, 91, + /* 70 */ 75, 2, 23, 24, 25, 6, 27, 28, 29, 30, + /* 80 */ 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, + /* 90 */ 72, 71, 71, 75, 18, 74, 47, 48, 49, 50, /* 100 */ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - /* 110 */ 61, 62, 13, 85, 14, 83, 3, 4, 19, 20, - /* 120 */ 21, 69, 23, 24, 25, 26, 98, 99, 68, 97, - /* 130 */ 30, 71, 88, 31, 32, 91, 68, 67, 67, 71, - /* 140 */ 67, 67, 43, 44, 45, 46, 47, 48, 49, 50, + /* 110 */ 61, 62, 63, 64, 65, 66, 17, 3, 4, 73, + /* 120 */ 100, 100, 23, 24, 25, 34, 27, 28, 29, 30, + /* 130 */ 72, 92, 2, 75, 95, 72, 72, 7, 75, 75, + /* 140 */ 5, 17, 71, 26, 33, 71, 47, 48, 49, 50, /* 150 */ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, - /* 160 */ 61, 62, 64, 65, 66, 67, 96, 96, 67, 96, - /* 170 */ 96, 73, 74, 75, 76, 77, 78, 67, 67, 4, - /* 180 */ 82, 87, 84, 73, 86, 75, 76, 77, 78, 14, - /* 190 */ 92, 93, 94, 95, 96, 5, 69, 96, 4, 22, - /* 200 */ 22, 96, 92, 93, 94, 95, 96, 96, 14, 7, - /* 210 */ 67, 24, 13, 6, 69, 80, 73, 74, 75, 76, - /* 220 */ 77, 78, 79, 69, 67, 82, 67, 84, 67, 86, - /* 230 */ 73, 72, 73, 90, 73, 92, 93, 94, 95, 96, - /* 240 */ 66, 67, 100, 100, 100, 100, 100, 73, 74, 75, - /* 250 */ 76, 77, 78, 96, 100, 96, 82, 96, 84, 100, - /* 260 */ 86, 100, 100, 100, 100, 100, 92, 93, 94, 95, - /* 270 */ 96, 67, 100, 67, 100, 100, 100, 73, 67, 73, - /* 280 */ 100, 100, 100, 100, 73, 74, 75, 76, 77, 78, - /* 290 */ 100, 100, 100, 82, 100, 84, 100, 86, 100, 100, - /* 300 */ 96, 90, 96, 92, 93, 94, 95, 96, 67, 100, - /* 310 */ 100, 100, 100, 100, 73, 74, 75, 76, 77, 78, - /* 320 */ 100, 100, 100, 82, 100, 84, 100, 86, 100, 100, - /* 330 */ 89, 100, 100, 92, 93, 94, 95, 96, 67, 100, - /* 340 */ 100, 100, 100, 100, 73, 74, 75, 76, 77, 78, - /* 350 */ 100, 100, 100, 82, 100, 84, 100, 86, 100, 100, - /* 360 */ 100, 100, 100, 92, 93, 94, 95, 96, 100, 67, - /* 370 */ 100, 100, 100, 100, 100, 73, 74, 75, 76, 77, - /* 380 */ 78, 100, 100, 100, 82, 100, 84, 100, 86, 100, - /* 390 */ 100, 100, 100, 67, 92, 93, 94, 95, 96, 73, - /* 400 */ 74, 75, 76, 77, 78, 100, 100, 100, 82, 100, - /* 410 */ 84, 100, 86, 100, 100, 100, 100, 67, 92, 93, - /* 420 */ 94, 95, 96, 73, 100, 75, 76, 77, 78, 100, - /* 430 */ 100, 100, 82, 100, 84, 100, 86, 100, 100, 100, - /* 440 */ 100, 100, 92, 93, 94, 95, 96, 67, 100, 100, - /* 450 */ 100, 100, 100, 73, 100, 75, 76, 77, 78, 100, - /* 460 */ 100, 100, 82, 100, 84, 100, 100, 100, 100, 100, - /* 470 */ 100, 67, 92, 93, 94, 95, 96, 73, 100, 75, - /* 480 */ 76, 77, 78, 100, 100, 100, 82, 100, 100, 100, - /* 490 */ 100, 100, 100, 100, 100, 100, 92, 93, 94, 95, - /* 500 */ 96, + /* 160 */ 61, 62, 63, 64, 65, 66, 68, 69, 70, 71, + /* 170 */ 28, 100, 71, 71, 100, 77, 78, 79, 80, 81, + /* 180 */ 82, 100, 85, 71, 86, 6, 88, 17, 90, 77, + /* 190 */ 84, 73, 71, 73, 96, 97, 98, 99, 100, 71, + /* 200 */ 104, 100, 100, 4, 104, 77, 78, 79, 80, 81, + /* 210 */ 82, 83, 100, 104, 86, 104, 88, 18, 90, 104, + /* 220 */ 104, 100, 94, 71, 96, 97, 98, 99, 100, 77, + /* 230 */ 78, 79, 80, 81, 82, 104, 104, 104, 86, 71, + /* 240 */ 88, 104, 90, 104, 76, 77, 94, 71, 96, 97, + /* 250 */ 98, 99, 100, 77, 78, 79, 80, 81, 82, 104, + /* 260 */ 104, 104, 86, 104, 88, 104, 90, 104, 100, 93, + /* 270 */ 70, 71, 96, 97, 98, 99, 100, 77, 78, 79, + /* 280 */ 80, 81, 82, 104, 104, 104, 86, 104, 88, 104, + /* 290 */ 90, 104, 104, 104, 104, 71, 96, 97, 98, 99, + /* 300 */ 100, 77, 78, 79, 80, 81, 82, 104, 104, 104, + /* 310 */ 86, 71, 88, 104, 90, 104, 76, 77, 104, 71, + /* 320 */ 96, 97, 98, 99, 100, 77, 78, 79, 80, 81, + /* 330 */ 82, 104, 104, 104, 86, 104, 88, 104, 90, 104, + /* 340 */ 100, 104, 104, 71, 96, 97, 98, 99, 100, 77, + /* 350 */ 78, 79, 80, 81, 82, 104, 104, 104, 86, 104, + /* 360 */ 88, 104, 90, 104, 104, 104, 104, 71, 96, 97, + /* 370 */ 98, 99, 100, 77, 71, 79, 80, 81, 82, 104, + /* 380 */ 77, 104, 86, 71, 88, 104, 90, 104, 104, 77, + /* 390 */ 104, 71, 96, 97, 98, 99, 100, 77, 71, 79, + /* 400 */ 80, 81, 82, 100, 77, 104, 86, 104, 88, 104, + /* 410 */ 104, 104, 100, 104, 104, 71, 96, 97, 98, 99, + /* 420 */ 100, 77, 71, 79, 80, 81, 82, 100, 77, 104, + /* 430 */ 86, 104, 71, 104, 104, 104, 104, 104, 77, 71, + /* 440 */ 96, 97, 98, 99, 100, 77, 71, 79, 80, 81, + /* 450 */ 82, 100, 77, 104, 71, 104, 71, 104, 104, 104, + /* 460 */ 77, 100, 77, 104, 96, 97, 98, 99, 100, 104, + /* 470 */ 104, 104, 104, 104, 104, 100, 104, 104, 104, 104, + /* 480 */ 104, 104, 104, 100, 104, 100, ); - const YY_SHIFT_USE_DFLT = -14; - const YY_SHIFT_MAX = 59; + const YY_SHIFT_USE_DFLT = -20; + const YY_SHIFT_MAX = 63; static public $yy_shift_ofst = array( - /* 0 */ 49, -13, -13, 99, 99, 99, 99, 99, 99, 99, - /* 10 */ 99, 99, 187, 187, 50, 50, 187, 187, 187, 187, - /* 20 */ 187, 187, -2, 23, 102, 3, 102, 187, 187, 207, - /* 30 */ 207, 187, 187, 207, 187, 187, 25, 25, 100, 41, - /* 40 */ 190, 190, 199, 41, 41, 41, 34, 190, 187, 34, - /* 50 */ 190, 12, 58, 113, 194, 175, 177, -10, 202, 178, + /* 0 */ -1, 49, 49, 99, 99, 99, 99, 99, 99, 99, + /* 10 */ 99, 99, 142, 142, 0, 0, 142, 142, 142, 142, + /* 20 */ 142, 142, 142, 142, 142, 142, -19, 7, 69, -18, + /* 30 */ -18, 142, 179, 179, 142, 142, 179, 142, 142, 142, + /* 40 */ -11, -11, -4, 91, 135, 111, 135, 91, 135, 170, + /* 50 */ 135, 91, 91, 142, 111, 73, 114, 199, 130, 76, + /* 60 */ 117, 29, 19, 124, ); - const YY_REDUCE_USE_DFLT = -68; - const YY_REDUCE_MAX = 50; + const YY_REDUCE_USE_DFLT = -83; + const YY_REDUCE_MAX = 54; static public $yy_reduce_ofst = array( - /* 0 */ 98, 143, 211, 241, 174, 271, 302, 326, 350, 380, - /* 10 */ 404, 110, 159, -16, 28, 28, 206, -15, -14, 157, - /* 20 */ 204, 161, 44, 60, 32, 68, 32, 73, 71, 8, - /* 30 */ -67, 70, 74, -7, 111, 101, 135, 135, -34, -34, - /* 40 */ 154, 145, 10, -34, -34, -34, 94, 52, 105, 94, - /* 50 */ 127, + /* 0 */ 98, 128, 152, 200, 176, 224, 248, 272, 296, 320, + /* 10 */ 344, 368, 168, 240, -82, -82, 21, 383, 385, 351, + /* 20 */ 375, 303, 112, 361, 312, 327, 39, 63, 64, -68, + /* 30 */ -68, 20, -5, 18, 121, 101, 58, 74, 102, 71, + /* 40 */ 106, 106, -67, -67, 120, -22, 46, -67, -61, 97, + /* 50 */ 118, -67, -67, 81, -22, ); static public $yyExpectedTokens = array( - /* 0 */ array(1, 13, 19, 20, 21, 23, 24, 25, 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ), - /* 1 */ array(13, 15, 19, 20, 21, 23, 24, 25, 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ), - /* 2 */ array(13, 15, 19, 20, 21, 23, 24, 25, 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ), - /* 3 */ array(13, 19, 20, 21, 23, 24, 25, 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ), - /* 4 */ array(13, 19, 20, 21, 23, 24, 25, 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ), - /* 5 */ array(13, 19, 20, 21, 23, 24, 25, 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ), - /* 6 */ array(13, 19, 20, 21, 23, 24, 25, 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ), - /* 7 */ array(13, 19, 20, 21, 23, 24, 25, 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ), - /* 8 */ array(13, 19, 20, 21, 23, 24, 25, 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ), - /* 9 */ array(13, 19, 20, 21, 23, 24, 25, 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ), - /* 10 */ array(13, 19, 20, 21, 23, 24, 25, 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ), - /* 11 */ array(13, 19, 20, 21, 23, 24, 25, 26, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, ), - /* 12 */ array(24, ), - /* 13 */ array(24, ), - /* 14 */ array(8, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, ), - /* 15 */ array(8, 27, 28, 33, 34, 35, 36, 37, 38, 39, 40, ), - /* 16 */ array(24, ), - /* 17 */ array(24, ), - /* 18 */ array(24, ), - /* 19 */ array(24, ), - /* 20 */ array(24, ), - /* 21 */ array(24, ), - /* 22 */ array(16, 17, 18, 19, 20, 21, 30, ), - /* 23 */ array(2, 3, 4, 6, ), - /* 24 */ array(31, 32, ), - /* 25 */ array(2, 6, ), - /* 26 */ array(31, 32, ), - /* 27 */ array(24, ), - /* 28 */ array(24, ), - /* 29 */ array(6, ), - /* 30 */ array(6, ), - /* 31 */ array(24, ), - /* 32 */ array(24, ), + /* 0 */ array(1, 17, 23, 24, 25, 27, 28, 29, 30, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ), + /* 1 */ array(17, 19, 23, 24, 25, 27, 28, 29, 30, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ), + /* 2 */ array(17, 19, 23, 24, 25, 27, 28, 29, 30, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ), + /* 3 */ array(17, 23, 24, 25, 27, 28, 29, 30, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ), + /* 4 */ array(17, 23, 24, 25, 27, 28, 29, 30, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ), + /* 5 */ array(17, 23, 24, 25, 27, 28, 29, 30, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ), + /* 6 */ array(17, 23, 24, 25, 27, 28, 29, 30, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ), + /* 7 */ array(17, 23, 24, 25, 27, 28, 29, 30, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ), + /* 8 */ array(17, 23, 24, 25, 27, 28, 29, 30, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ), + /* 9 */ array(17, 23, 24, 25, 27, 28, 29, 30, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ), + /* 10 */ array(17, 23, 24, 25, 27, 28, 29, 30, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ), + /* 11 */ array(17, 23, 24, 25, 27, 28, 29, 30, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, ), + /* 12 */ array(28, ), + /* 13 */ array(28, ), + /* 14 */ array(8, 31, 32, 37, 38, 39, 40, 41, 42, 43, 44, ), + /* 15 */ array(8, 31, 32, 37, 38, 39, 40, 41, 42, 43, 44, ), + /* 16 */ array(28, ), + /* 17 */ array(28, ), + /* 18 */ array(28, ), + /* 19 */ array(28, ), + /* 20 */ array(28, ), + /* 21 */ array(28, ), + /* 22 */ array(28, ), + /* 23 */ array(28, ), + /* 24 */ array(28, ), + /* 25 */ array(28, ), + /* 26 */ array(20, 21, 22, 23, 24, 25, 34, ), + /* 27 */ array(2, 3, 4, 6, ), + /* 28 */ array(2, 6, ), + /* 29 */ array(35, 36, ), + /* 30 */ array(35, 36, ), + /* 31 */ array(28, ), + /* 32 */ array(6, ), /* 33 */ array(6, ), - /* 34 */ array(24, ), - /* 35 */ array(24, ), - /* 36 */ array(41, 42, ), - /* 37 */ array(41, 42, ), - /* 38 */ array(14, 30, ), - /* 39 */ array(30, ), - /* 40 */ array(5, ), - /* 41 */ array(5, ), - /* 42 */ array(13, ), - /* 43 */ array(30, ), - /* 44 */ array(30, ), - /* 45 */ array(30, ), - /* 46 */ array(29, ), - /* 47 */ array(5, ), - /* 48 */ array(24, ), - /* 49 */ array(29, ), + /* 34 */ array(28, ), + /* 35 */ array(28, ), + /* 36 */ array(6, ), + /* 37 */ array(28, ), + /* 38 */ array(28, ), + /* 39 */ array(28, ), + /* 40 */ array(45, 46, ), + /* 41 */ array(45, 46, ), + /* 42 */ array(18, 34, ), + /* 43 */ array(34, ), + /* 44 */ array(5, ), + /* 45 */ array(33, ), + /* 46 */ array(5, ), + /* 47 */ array(34, ), + /* 48 */ array(5, ), + /* 49 */ array(17, ), /* 50 */ array(5, ), - /* 51 */ array(8, 9, 10, 11, 12, ), - /* 52 */ array(2, 7, ), - /* 53 */ array(3, 4, ), - /* 54 */ array(4, 14, ), - /* 55 */ array(4, 14, ), - /* 56 */ array(22, ), - /* 57 */ array(13, ), - /* 58 */ array(7, ), - /* 59 */ array(22, ), - /* 60 */ array(), - /* 61 */ array(), - /* 62 */ array(), - /* 63 */ array(), + /* 51 */ array(34, ), + /* 52 */ array(34, ), + /* 53 */ array(28, ), + /* 54 */ array(33, ), + /* 55 */ array(8, 9, 10, 11, 12, 13, 14, 15, 16, ), + /* 56 */ array(3, 4, ), + /* 57 */ array(4, 18, ), + /* 58 */ array(2, 7, ), + /* 59 */ array(4, 18, ), + /* 60 */ array(26, ), + /* 61 */ array(7, ), + /* 62 */ array(26, ), + /* 63 */ array(17, ), /* 64 */ array(), /* 65 */ array(), /* 66 */ array(), @@ -500,23 +501,32 @@ static public $yy_action = array( /* 142 */ array(), /* 143 */ array(), /* 144 */ array(), + /* 145 */ array(), + /* 146 */ array(), + /* 147 */ array(), + /* 148 */ array(), + /* 149 */ array(), + /* 150 */ array(), + /* 151 */ array(), + /* 152 */ array(), ); static public $yy_default = array( - /* 0 */ 248, 183, 248, 248, 248, 248, 248, 248, 248, 248, - /* 10 */ 248, 248, 248, 248, 177, 176, 248, 248, 248, 248, - /* 20 */ 248, 248, 248, 157, 174, 157, 175, 248, 248, 157, - /* 30 */ 156, 248, 248, 157, 248, 248, 172, 173, 248, 186, - /* 40 */ 154, 154, 248, 181, 182, 165, 179, 154, 248, 178, - /* 50 */ 154, 248, 248, 248, 248, 248, 248, 248, 248, 198, - /* 60 */ 184, 193, 185, 187, 169, 180, 188, 189, 191, 190, - /* 70 */ 192, 158, 200, 164, 147, 159, 146, 152, 150, 149, - /* 80 */ 163, 153, 167, 168, 155, 160, 166, 162, 161, 148, - /* 90 */ 222, 231, 232, 230, 229, 228, 233, 234, 238, 239, - /* 100 */ 237, 236, 235, 227, 226, 195, 196, 194, 224, 223, - /* 110 */ 197, 199, 204, 225, 203, 201, 202, 240, 241, 215, - /* 120 */ 216, 210, 209, 208, 217, 218, 171, 170, 221, 220, - /* 130 */ 219, 207, 206, 245, 246, 244, 243, 242, 247, 205, - /* 140 */ 145, 212, 214, 213, 211, + /* 0 */ 260, 195, 260, 260, 260, 260, 260, 260, 260, 260, + /* 10 */ 260, 260, 260, 260, 189, 188, 260, 260, 260, 260, + /* 20 */ 260, 260, 260, 260, 260, 260, 260, 165, 165, 187, + /* 30 */ 186, 260, 165, 164, 260, 260, 165, 260, 260, 260, + /* 40 */ 184, 185, 260, 193, 162, 190, 162, 177, 162, 260, + /* 50 */ 162, 194, 198, 260, 191, 260, 260, 260, 260, 260, + /* 60 */ 210, 260, 260, 260, 192, 204, 205, 199, 202, 201, + /* 70 */ 203, 200, 197, 172, 212, 176, 175, 167, 157, 160, + /* 80 */ 158, 174, 173, 166, 163, 156, 168, 169, 171, 170, + /* 90 */ 196, 221, 215, 216, 213, 214, 209, 211, 237, 238, + /* 100 */ 243, 244, 242, 241, 239, 240, 208, 207, 179, 180, + /* 110 */ 178, 161, 154, 155, 181, 182, 236, 206, 235, 183, + /* 120 */ 224, 245, 246, 153, 222, 220, 219, 226, 218, 227, + /* 130 */ 228, 233, 234, 232, 231, 229, 230, 225, 217, 251, + /* 140 */ 252, 250, 249, 247, 248, 253, 254, 258, 259, 257, + /* 150 */ 256, 255, 223, ); /* The next thing included is series of defines which control ** various aspects of the generated parser. @@ -533,11 +543,11 @@ static public $yy_action = array( ** self::YYERRORSYMBOL is the code number of the error symbol. If not ** defined, then do no error processing. */ - const YYNOCODE = 101; + const YYNOCODE = 105; const YYSTACKDEPTH = 100; - const YYNSTATE = 145; - const YYNRULE = 103; - const YYERRORSYMBOL = 63; + const YYNSTATE = 153; + const YYNRULE = 107; + const YYERRORSYMBOL = 67; const YYERRSYMDT = 'yy0'; const YYFALLBACK = 0; /** The next table maps tokens into fallback tokens. If a construct @@ -622,7 +632,8 @@ static public $yy_action = array( '$', 'SELECT', 'AS_ALIAS', 'FROM', 'COMA', 'WHERE', 'JOIN', 'ON', 'EQ', 'BELOW', 'BELOW_STRICT', 'NOT_BELOW', - 'NOT_BELOW_STRICT', 'PAR_OPEN', 'PAR_CLOSE', 'INTERVAL', + 'NOT_BELOW_STRICT', 'ABOVE', 'ABOVE_STRICT', 'NOT_ABOVE', + 'NOT_ABOVE_STRICT', 'PAR_OPEN', 'PAR_CLOSE', 'INTERVAL', 'F_SECOND', 'F_MINUTE', 'F_HOUR', 'F_DAY', 'F_MONTH', 'F_YEAR', 'DOT', 'VARNAME', 'NAME', 'NUMVAL', 'STRVAL', 'REGEXP', @@ -671,89 +682,93 @@ static public $yy_action = array( /* 17 */ "join_condition ::= field_id BELOW_STRICT field_id", /* 18 */ "join_condition ::= field_id NOT_BELOW field_id", /* 19 */ "join_condition ::= field_id NOT_BELOW_STRICT field_id", - /* 20 */ "condition ::= expression_prio4", - /* 21 */ "expression_basic ::= scalar", - /* 22 */ "expression_basic ::= field_id", - /* 23 */ "expression_basic ::= var_name", - /* 24 */ "expression_basic ::= func_name PAR_OPEN arg_list PAR_CLOSE", - /* 25 */ "expression_basic ::= PAR_OPEN expression_prio4 PAR_CLOSE", - /* 26 */ "expression_basic ::= expression_basic list_operator list", - /* 27 */ "expression_prio1 ::= expression_basic", - /* 28 */ "expression_prio1 ::= expression_prio1 operator1 expression_basic", - /* 29 */ "expression_prio2 ::= expression_prio1", - /* 30 */ "expression_prio2 ::= expression_prio2 operator2 expression_prio1", - /* 31 */ "expression_prio3 ::= expression_prio2", - /* 32 */ "expression_prio3 ::= expression_prio3 operator3 expression_prio2", - /* 33 */ "expression_prio4 ::= expression_prio3", - /* 34 */ "expression_prio4 ::= expression_prio4 operator4 expression_prio3", - /* 35 */ "list ::= PAR_OPEN list_items PAR_CLOSE", - /* 36 */ "list_items ::= expression_prio4", - /* 37 */ "list_items ::= list_items COMA expression_prio4", - /* 38 */ "arg_list ::=", - /* 39 */ "arg_list ::= argument", - /* 40 */ "arg_list ::= arg_list COMA argument", - /* 41 */ "argument ::= expression_prio4", - /* 42 */ "argument ::= INTERVAL expression_prio4 interval_unit", - /* 43 */ "interval_unit ::= F_SECOND", - /* 44 */ "interval_unit ::= F_MINUTE", - /* 45 */ "interval_unit ::= F_HOUR", - /* 46 */ "interval_unit ::= F_DAY", - /* 47 */ "interval_unit ::= F_MONTH", - /* 48 */ "interval_unit ::= F_YEAR", - /* 49 */ "scalar ::= num_scalar", - /* 50 */ "scalar ::= str_scalar", - /* 51 */ "num_scalar ::= num_value", - /* 52 */ "str_scalar ::= str_value", - /* 53 */ "field_id ::= name", - /* 54 */ "field_id ::= class_name DOT name", - /* 55 */ "class_name ::= name", - /* 56 */ "var_name ::= VARNAME", - /* 57 */ "name ::= NAME", - /* 58 */ "num_value ::= NUMVAL", - /* 59 */ "str_value ::= STRVAL", - /* 60 */ "operator1 ::= num_operator1", - /* 61 */ "operator2 ::= num_operator2", - /* 62 */ "operator2 ::= str_operator", - /* 63 */ "operator2 ::= REGEXP", - /* 64 */ "operator2 ::= EQ", - /* 65 */ "operator2 ::= NOT_EQ", - /* 66 */ "operator3 ::= LOG_AND", - /* 67 */ "operator4 ::= LOG_OR", - /* 68 */ "num_operator1 ::= MATH_DIV", - /* 69 */ "num_operator1 ::= MATH_MULT", - /* 70 */ "num_operator2 ::= MATH_PLUS", - /* 71 */ "num_operator2 ::= MATH_MINUS", - /* 72 */ "num_operator2 ::= GT", - /* 73 */ "num_operator2 ::= LT", - /* 74 */ "num_operator2 ::= GE", - /* 75 */ "num_operator2 ::= LE", - /* 76 */ "str_operator ::= LIKE", - /* 77 */ "str_operator ::= NOT_LIKE", - /* 78 */ "list_operator ::= IN", - /* 79 */ "list_operator ::= NOT_IN", - /* 80 */ "func_name ::= F_IF", - /* 81 */ "func_name ::= F_ELT", - /* 82 */ "func_name ::= F_COALESCE", - /* 83 */ "func_name ::= F_ISNULL", - /* 84 */ "func_name ::= F_CONCAT", - /* 85 */ "func_name ::= F_SUBSTR", - /* 86 */ "func_name ::= F_TRIM", - /* 87 */ "func_name ::= F_DATE", - /* 88 */ "func_name ::= F_DATE_FORMAT", - /* 89 */ "func_name ::= F_CURRENT_DATE", - /* 90 */ "func_name ::= F_NOW", - /* 91 */ "func_name ::= F_TIME", - /* 92 */ "func_name ::= F_TO_DAYS", - /* 93 */ "func_name ::= F_FROM_DAYS", - /* 94 */ "func_name ::= F_YEAR", - /* 95 */ "func_name ::= F_MONTH", - /* 96 */ "func_name ::= F_DAY", - /* 97 */ "func_name ::= F_DATE_ADD", - /* 98 */ "func_name ::= F_DATE_SUB", - /* 99 */ "func_name ::= F_ROUND", - /* 100 */ "func_name ::= F_FLOOR", - /* 101 */ "func_name ::= F_INET_ATON", - /* 102 */ "func_name ::= F_INET_NTOA", + /* 20 */ "join_condition ::= field_id ABOVE field_id", + /* 21 */ "join_condition ::= field_id ABOVE_STRICT field_id", + /* 22 */ "join_condition ::= field_id NOT_ABOVE field_id", + /* 23 */ "join_condition ::= field_id NOT_ABOVE_STRICT field_id", + /* 24 */ "condition ::= expression_prio4", + /* 25 */ "expression_basic ::= scalar", + /* 26 */ "expression_basic ::= field_id", + /* 27 */ "expression_basic ::= var_name", + /* 28 */ "expression_basic ::= func_name PAR_OPEN arg_list PAR_CLOSE", + /* 29 */ "expression_basic ::= PAR_OPEN expression_prio4 PAR_CLOSE", + /* 30 */ "expression_basic ::= expression_basic list_operator list", + /* 31 */ "expression_prio1 ::= expression_basic", + /* 32 */ "expression_prio1 ::= expression_prio1 operator1 expression_basic", + /* 33 */ "expression_prio2 ::= expression_prio1", + /* 34 */ "expression_prio2 ::= expression_prio2 operator2 expression_prio1", + /* 35 */ "expression_prio3 ::= expression_prio2", + /* 36 */ "expression_prio3 ::= expression_prio3 operator3 expression_prio2", + /* 37 */ "expression_prio4 ::= expression_prio3", + /* 38 */ "expression_prio4 ::= expression_prio4 operator4 expression_prio3", + /* 39 */ "list ::= PAR_OPEN list_items PAR_CLOSE", + /* 40 */ "list_items ::= expression_prio4", + /* 41 */ "list_items ::= list_items COMA expression_prio4", + /* 42 */ "arg_list ::=", + /* 43 */ "arg_list ::= argument", + /* 44 */ "arg_list ::= arg_list COMA argument", + /* 45 */ "argument ::= expression_prio4", + /* 46 */ "argument ::= INTERVAL expression_prio4 interval_unit", + /* 47 */ "interval_unit ::= F_SECOND", + /* 48 */ "interval_unit ::= F_MINUTE", + /* 49 */ "interval_unit ::= F_HOUR", + /* 50 */ "interval_unit ::= F_DAY", + /* 51 */ "interval_unit ::= F_MONTH", + /* 52 */ "interval_unit ::= F_YEAR", + /* 53 */ "scalar ::= num_scalar", + /* 54 */ "scalar ::= str_scalar", + /* 55 */ "num_scalar ::= num_value", + /* 56 */ "str_scalar ::= str_value", + /* 57 */ "field_id ::= name", + /* 58 */ "field_id ::= class_name DOT name", + /* 59 */ "class_name ::= name", + /* 60 */ "var_name ::= VARNAME", + /* 61 */ "name ::= NAME", + /* 62 */ "num_value ::= NUMVAL", + /* 63 */ "str_value ::= STRVAL", + /* 64 */ "operator1 ::= num_operator1", + /* 65 */ "operator2 ::= num_operator2", + /* 66 */ "operator2 ::= str_operator", + /* 67 */ "operator2 ::= REGEXP", + /* 68 */ "operator2 ::= EQ", + /* 69 */ "operator2 ::= NOT_EQ", + /* 70 */ "operator3 ::= LOG_AND", + /* 71 */ "operator4 ::= LOG_OR", + /* 72 */ "num_operator1 ::= MATH_DIV", + /* 73 */ "num_operator1 ::= MATH_MULT", + /* 74 */ "num_operator2 ::= MATH_PLUS", + /* 75 */ "num_operator2 ::= MATH_MINUS", + /* 76 */ "num_operator2 ::= GT", + /* 77 */ "num_operator2 ::= LT", + /* 78 */ "num_operator2 ::= GE", + /* 79 */ "num_operator2 ::= LE", + /* 80 */ "str_operator ::= LIKE", + /* 81 */ "str_operator ::= NOT_LIKE", + /* 82 */ "list_operator ::= IN", + /* 83 */ "list_operator ::= NOT_IN", + /* 84 */ "func_name ::= F_IF", + /* 85 */ "func_name ::= F_ELT", + /* 86 */ "func_name ::= F_COALESCE", + /* 87 */ "func_name ::= F_ISNULL", + /* 88 */ "func_name ::= F_CONCAT", + /* 89 */ "func_name ::= F_SUBSTR", + /* 90 */ "func_name ::= F_TRIM", + /* 91 */ "func_name ::= F_DATE", + /* 92 */ "func_name ::= F_DATE_FORMAT", + /* 93 */ "func_name ::= F_CURRENT_DATE", + /* 94 */ "func_name ::= F_NOW", + /* 95 */ "func_name ::= F_TIME", + /* 96 */ "func_name ::= F_TO_DAYS", + /* 97 */ "func_name ::= F_FROM_DAYS", + /* 98 */ "func_name ::= F_YEAR", + /* 99 */ "func_name ::= F_MONTH", + /* 100 */ "func_name ::= F_DAY", + /* 101 */ "func_name ::= F_DATE_ADD", + /* 102 */ "func_name ::= F_DATE_SUB", + /* 103 */ "func_name ::= F_ROUND", + /* 104 */ "func_name ::= F_FLOOR", + /* 105 */ "func_name ::= F_INET_ATON", + /* 106 */ "func_name ::= F_INET_NTOA", ); /** @@ -1118,109 +1133,113 @@ static public $yy_action = array( * */ static public $yyRuleInfo = array( - array( 'lhs' => 64, 'rhs' => 1 ), - array( 'lhs' => 64, 'rhs' => 1 ), - array( 'lhs' => 65, 'rhs' => 4 ), - array( 'lhs' => 65, 'rhs' => 6 ), - array( 'lhs' => 65, 'rhs' => 6 ), - array( 'lhs' => 65, 'rhs' => 8 ), - array( 'lhs' => 70, 'rhs' => 1 ), - array( 'lhs' => 70, 'rhs' => 3 ), - array( 'lhs' => 69, 'rhs' => 2 ), - array( 'lhs' => 69, 'rhs' => 0 ), - array( 'lhs' => 68, 'rhs' => 2 ), array( 'lhs' => 68, 'rhs' => 1 ), - array( 'lhs' => 68, 'rhs' => 0 ), - array( 'lhs' => 71, 'rhs' => 6 ), - array( 'lhs' => 71, 'rhs' => 4 ), - array( 'lhs' => 72, 'rhs' => 3 ), - array( 'lhs' => 72, 'rhs' => 3 ), - array( 'lhs' => 72, 'rhs' => 3 ), - array( 'lhs' => 72, 'rhs' => 3 ), - array( 'lhs' => 72, 'rhs' => 3 ), - array( 'lhs' => 66, 'rhs' => 1 ), - array( 'lhs' => 75, 'rhs' => 1 ), - array( 'lhs' => 75, 'rhs' => 1 ), - array( 'lhs' => 75, 'rhs' => 1 ), - array( 'lhs' => 75, 'rhs' => 4 ), - array( 'lhs' => 75, 'rhs' => 3 ), - array( 'lhs' => 75, 'rhs' => 3 ), - array( 'lhs' => 82, 'rhs' => 1 ), - array( 'lhs' => 82, 'rhs' => 3 ), - array( 'lhs' => 84, 'rhs' => 1 ), - array( 'lhs' => 84, 'rhs' => 3 ), - array( 'lhs' => 86, 'rhs' => 1 ), - array( 'lhs' => 86, 'rhs' => 3 ), + array( 'lhs' => 68, 'rhs' => 1 ), + array( 'lhs' => 69, 'rhs' => 4 ), + array( 'lhs' => 69, 'rhs' => 6 ), + array( 'lhs' => 69, 'rhs' => 6 ), + array( 'lhs' => 69, 'rhs' => 8 ), array( 'lhs' => 74, 'rhs' => 1 ), array( 'lhs' => 74, 'rhs' => 3 ), - array( 'lhs' => 81, 'rhs' => 3 ), - array( 'lhs' => 89, 'rhs' => 1 ), - array( 'lhs' => 89, 'rhs' => 3 ), - array( 'lhs' => 79, 'rhs' => 0 ), + array( 'lhs' => 73, 'rhs' => 2 ), + array( 'lhs' => 73, 'rhs' => 0 ), + array( 'lhs' => 72, 'rhs' => 2 ), + array( 'lhs' => 72, 'rhs' => 1 ), + array( 'lhs' => 72, 'rhs' => 0 ), + array( 'lhs' => 75, 'rhs' => 6 ), + array( 'lhs' => 75, 'rhs' => 4 ), + array( 'lhs' => 76, 'rhs' => 3 ), + array( 'lhs' => 76, 'rhs' => 3 ), + array( 'lhs' => 76, 'rhs' => 3 ), + array( 'lhs' => 76, 'rhs' => 3 ), + array( 'lhs' => 76, 'rhs' => 3 ), + array( 'lhs' => 76, 'rhs' => 3 ), + array( 'lhs' => 76, 'rhs' => 3 ), + array( 'lhs' => 76, 'rhs' => 3 ), + array( 'lhs' => 76, 'rhs' => 3 ), + array( 'lhs' => 70, 'rhs' => 1 ), array( 'lhs' => 79, 'rhs' => 1 ), + array( 'lhs' => 79, 'rhs' => 1 ), + array( 'lhs' => 79, 'rhs' => 1 ), + array( 'lhs' => 79, 'rhs' => 4 ), array( 'lhs' => 79, 'rhs' => 3 ), + array( 'lhs' => 79, 'rhs' => 3 ), + array( 'lhs' => 86, 'rhs' => 1 ), + array( 'lhs' => 86, 'rhs' => 3 ), + array( 'lhs' => 88, 'rhs' => 1 ), + array( 'lhs' => 88, 'rhs' => 3 ), array( 'lhs' => 90, 'rhs' => 1 ), array( 'lhs' => 90, 'rhs' => 3 ), - array( 'lhs' => 91, 'rhs' => 1 ), - array( 'lhs' => 91, 'rhs' => 1 ), - array( 'lhs' => 91, 'rhs' => 1 ), - array( 'lhs' => 91, 'rhs' => 1 ), - array( 'lhs' => 91, 'rhs' => 1 ), - array( 'lhs' => 91, 'rhs' => 1 ), - array( 'lhs' => 76, 'rhs' => 1 ), - array( 'lhs' => 76, 'rhs' => 1 ), - array( 'lhs' => 92, 'rhs' => 1 ), + array( 'lhs' => 78, 'rhs' => 1 ), + array( 'lhs' => 78, 'rhs' => 3 ), + array( 'lhs' => 85, 'rhs' => 3 ), array( 'lhs' => 93, 'rhs' => 1 ), - array( 'lhs' => 73, 'rhs' => 1 ), - array( 'lhs' => 73, 'rhs' => 3 ), - array( 'lhs' => 67, 'rhs' => 1 ), - array( 'lhs' => 77, 'rhs' => 1 ), - array( 'lhs' => 96, 'rhs' => 1 ), - array( 'lhs' => 94, 'rhs' => 1 ), - array( 'lhs' => 95, 'rhs' => 1 ), + array( 'lhs' => 93, 'rhs' => 3 ), + array( 'lhs' => 83, 'rhs' => 0 ), array( 'lhs' => 83, 'rhs' => 1 ), - array( 'lhs' => 85, 'rhs' => 1 ), - array( 'lhs' => 85, 'rhs' => 1 ), - array( 'lhs' => 85, 'rhs' => 1 ), - array( 'lhs' => 85, 'rhs' => 1 ), - array( 'lhs' => 85, 'rhs' => 1 ), + array( 'lhs' => 83, 'rhs' => 3 ), + array( 'lhs' => 94, 'rhs' => 1 ), + array( 'lhs' => 94, 'rhs' => 3 ), + array( 'lhs' => 95, 'rhs' => 1 ), + array( 'lhs' => 95, 'rhs' => 1 ), + array( 'lhs' => 95, 'rhs' => 1 ), + array( 'lhs' => 95, 'rhs' => 1 ), + array( 'lhs' => 95, 'rhs' => 1 ), + array( 'lhs' => 95, 'rhs' => 1 ), + array( 'lhs' => 80, 'rhs' => 1 ), + array( 'lhs' => 80, 'rhs' => 1 ), + array( 'lhs' => 96, 'rhs' => 1 ), + array( 'lhs' => 97, 'rhs' => 1 ), + array( 'lhs' => 77, 'rhs' => 1 ), + array( 'lhs' => 77, 'rhs' => 3 ), + array( 'lhs' => 71, 'rhs' => 1 ), + array( 'lhs' => 81, 'rhs' => 1 ), + array( 'lhs' => 100, 'rhs' => 1 ), + array( 'lhs' => 98, 'rhs' => 1 ), + array( 'lhs' => 99, 'rhs' => 1 ), array( 'lhs' => 87, 'rhs' => 1 ), - array( 'lhs' => 88, 'rhs' => 1 ), - array( 'lhs' => 97, 'rhs' => 1 ), - array( 'lhs' => 97, 'rhs' => 1 ), - array( 'lhs' => 98, 'rhs' => 1 ), - array( 'lhs' => 98, 'rhs' => 1 ), - array( 'lhs' => 98, 'rhs' => 1 ), - array( 'lhs' => 98, 'rhs' => 1 ), - array( 'lhs' => 98, 'rhs' => 1 ), - array( 'lhs' => 98, 'rhs' => 1 ), - array( 'lhs' => 99, 'rhs' => 1 ), - array( 'lhs' => 99, 'rhs' => 1 ), - array( 'lhs' => 80, 'rhs' => 1 ), - array( 'lhs' => 80, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), - array( 'lhs' => 78, 'rhs' => 1 ), + array( 'lhs' => 89, 'rhs' => 1 ), + array( 'lhs' => 89, 'rhs' => 1 ), + array( 'lhs' => 89, 'rhs' => 1 ), + array( 'lhs' => 89, 'rhs' => 1 ), + array( 'lhs' => 89, 'rhs' => 1 ), + array( 'lhs' => 91, 'rhs' => 1 ), + array( 'lhs' => 92, 'rhs' => 1 ), + array( 'lhs' => 101, 'rhs' => 1 ), + array( 'lhs' => 101, 'rhs' => 1 ), + array( 'lhs' => 102, 'rhs' => 1 ), + array( 'lhs' => 102, 'rhs' => 1 ), + array( 'lhs' => 102, 'rhs' => 1 ), + array( 'lhs' => 102, 'rhs' => 1 ), + array( 'lhs' => 102, 'rhs' => 1 ), + array( 'lhs' => 102, 'rhs' => 1 ), + array( 'lhs' => 103, 'rhs' => 1 ), + array( 'lhs' => 103, 'rhs' => 1 ), + array( 'lhs' => 84, 'rhs' => 1 ), + array( 'lhs' => 84, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), + array( 'lhs' => 82, 'rhs' => 1 ), ); /** @@ -1237,11 +1256,11 @@ static public $yy_action = array( 4 => 4, 5 => 5, 6 => 6, - 36 => 6, - 39 => 6, + 40 => 6, + 43 => 6, 7 => 7, - 37 => 7, - 40 => 7, + 41 => 7, + 44 => 7, 8 => 8, 9 => 9, 12 => 9, @@ -1255,84 +1274,88 @@ static public $yy_action = array( 18 => 18, 19 => 19, 20 => 20, - 21 => 20, - 22 => 20, - 23 => 20, - 27 => 20, - 29 => 20, - 31 => 20, - 33 => 20, - 41 => 20, - 43 => 20, - 44 => 20, - 45 => 20, - 46 => 20, - 47 => 20, - 48 => 20, - 49 => 20, - 50 => 20, + 21 => 21, + 22 => 22, + 23 => 23, 24 => 24, - 25 => 25, - 26 => 26, - 28 => 26, - 30 => 26, - 32 => 26, - 34 => 26, - 35 => 35, - 38 => 38, + 25 => 24, + 26 => 24, + 27 => 24, + 31 => 24, + 33 => 24, + 35 => 24, + 37 => 24, + 45 => 24, + 47 => 24, + 48 => 24, + 49 => 24, + 50 => 24, + 51 => 24, + 52 => 24, + 53 => 24, + 54 => 24, + 28 => 28, + 29 => 29, + 30 => 30, + 32 => 30, + 34 => 30, + 36 => 30, + 38 => 30, + 39 => 39, 42 => 42, - 51 => 51, - 52 => 51, - 53 => 53, - 54 => 54, + 46 => 46, 55 => 55, - 80 => 55, - 81 => 55, - 82 => 55, - 83 => 55, - 84 => 55, - 85 => 55, - 86 => 55, - 87 => 55, - 88 => 55, - 89 => 55, - 90 => 55, - 91 => 55, - 92 => 55, - 93 => 55, - 94 => 55, - 95 => 55, - 96 => 55, - 97 => 55, - 98 => 55, - 99 => 55, - 100 => 55, - 101 => 55, - 102 => 55, - 56 => 56, + 56 => 55, 57 => 57, 58 => 58, - 60 => 58, - 61 => 58, - 62 => 58, - 63 => 58, - 64 => 58, - 65 => 58, - 66 => 58, - 67 => 58, - 68 => 58, - 69 => 58, - 70 => 58, - 71 => 58, - 72 => 58, - 73 => 58, - 74 => 58, - 75 => 58, - 76 => 58, - 77 => 58, - 78 => 58, - 79 => 58, 59 => 59, + 84 => 59, + 85 => 59, + 86 => 59, + 87 => 59, + 88 => 59, + 89 => 59, + 90 => 59, + 91 => 59, + 92 => 59, + 93 => 59, + 94 => 59, + 95 => 59, + 96 => 59, + 97 => 59, + 98 => 59, + 99 => 59, + 100 => 59, + 101 => 59, + 102 => 59, + 103 => 59, + 104 => 59, + 105 => 59, + 106 => 59, + 60 => 60, + 61 => 61, + 62 => 62, + 64 => 62, + 65 => 62, + 66 => 62, + 67 => 62, + 68 => 62, + 69 => 62, + 70 => 62, + 71 => 62, + 72 => 62, + 73 => 62, + 74 => 62, + 75 => 62, + 76 => 62, + 77 => 62, + 78 => 62, + 79 => 62, + 80 => 62, + 81 => 62, + 82 => 62, + 83 => 62, + 63 => 63, ); /* Beginning here are the reduction cases. A typical example ** follows: @@ -1342,44 +1365,44 @@ static public $yy_action = array( */ #line 29 "oql-parser.y" function yy_r0(){ $this->my_result = $this->yystack[$this->yyidx + 0]->minor; } -#line 1349 "oql-parser.php" +#line 1372 "oql-parser.php" #line 32 "oql-parser.y" function yy_r2(){ $this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor)); } -#line 1354 "oql-parser.php" +#line 1377 "oql-parser.php" #line 35 "oql-parser.y" function yy_r3(){ $this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor)); } -#line 1359 "oql-parser.php" +#line 1382 "oql-parser.php" #line 39 "oql-parser.y" function yy_r4(){ $this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -4]->minor); } -#line 1364 "oql-parser.php" +#line 1387 "oql-parser.php" #line 42 "oql-parser.y" function yy_r5(){ $this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -6]->minor); } -#line 1369 "oql-parser.php" +#line 1392 "oql-parser.php" #line 47 "oql-parser.y" function yy_r6(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor); } -#line 1374 "oql-parser.php" +#line 1397 "oql-parser.php" #line 50 "oql-parser.y" function yy_r7(){ array_push($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor; } -#line 1380 "oql-parser.php" +#line 1403 "oql-parser.php" #line 55 "oql-parser.y" function yy_r8(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -#line 1383 "oql-parser.php" +#line 1406 "oql-parser.php" #line 56 "oql-parser.y" function yy_r9(){ $this->_retvalue = null; } -#line 1386 "oql-parser.php" +#line 1409 "oql-parser.php" #line 58 "oql-parser.y" function yy_r10(){ // insert the join statement on top of the existing list @@ -1387,81 +1410,93 @@ static public $yy_action = array( // and return the updated array $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -#line 1394 "oql-parser.php" +#line 1417 "oql-parser.php" #line 64 "oql-parser.y" function yy_r11(){ $this->_retvalue = Array($this->yystack[$this->yyidx + 0]->minor); } -#line 1399 "oql-parser.php" +#line 1422 "oql-parser.php" #line 70 "oql-parser.y" function yy_r13(){ // create an array with one single item $this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor); } -#line 1405 "oql-parser.php" +#line 1428 "oql-parser.php" #line 75 "oql-parser.y" function yy_r14(){ // create an array with one single item $this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor); } -#line 1411 "oql-parser.php" +#line 1434 "oql-parser.php" #line 80 "oql-parser.y" function yy_r15(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, '=', $this->yystack[$this->yyidx + 0]->minor); } -#line 1414 "oql-parser.php" +#line 1437 "oql-parser.php" #line 81 "oql-parser.y" function yy_r16(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'BELOW', $this->yystack[$this->yyidx + 0]->minor); } -#line 1417 "oql-parser.php" +#line 1440 "oql-parser.php" #line 82 "oql-parser.y" function yy_r17(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'BELOW_STRICT', $this->yystack[$this->yyidx + 0]->minor); } -#line 1420 "oql-parser.php" +#line 1443 "oql-parser.php" #line 83 "oql-parser.y" function yy_r18(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_BELOW', $this->yystack[$this->yyidx + 0]->minor); } -#line 1423 "oql-parser.php" +#line 1446 "oql-parser.php" #line 84 "oql-parser.y" function yy_r19(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_BELOW_STRICT', $this->yystack[$this->yyidx + 0]->minor); } -#line 1426 "oql-parser.php" +#line 1449 "oql-parser.php" +#line 85 "oql-parser.y" + function yy_r20(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'ABOVE', $this->yystack[$this->yyidx + 0]->minor); } +#line 1452 "oql-parser.php" #line 86 "oql-parser.y" - function yy_r20(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -#line 1429 "oql-parser.php" -#line 91 "oql-parser.y" - function yy_r24(){ $this->_retvalue = new FunctionOqlExpression($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor); } -#line 1432 "oql-parser.php" -#line 92 "oql-parser.y" - function yy_r25(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; } -#line 1435 "oql-parser.php" -#line 93 "oql-parser.y" - function yy_r26(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); } -#line 1438 "oql-parser.php" -#line 108 "oql-parser.y" - function yy_r35(){ + function yy_r21(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'ABOVE_STRICT', $this->yystack[$this->yyidx + 0]->minor); } +#line 1455 "oql-parser.php" +#line 87 "oql-parser.y" + function yy_r22(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_ABOVE', $this->yystack[$this->yyidx + 0]->minor); } +#line 1458 "oql-parser.php" +#line 88 "oql-parser.y" + function yy_r23(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_ABOVE_STRICT', $this->yystack[$this->yyidx + 0]->minor); } +#line 1461 "oql-parser.php" +#line 90 "oql-parser.y" + function yy_r24(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } +#line 1464 "oql-parser.php" +#line 95 "oql-parser.y" + function yy_r28(){ $this->_retvalue = new FunctionOqlExpression($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor); } +#line 1467 "oql-parser.php" +#line 96 "oql-parser.y" + function yy_r29(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; } +#line 1470 "oql-parser.php" +#line 97 "oql-parser.y" + function yy_r30(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); } +#line 1473 "oql-parser.php" +#line 112 "oql-parser.y" + function yy_r39(){ $this->_retvalue = new ListOqlExpression($this->yystack[$this->yyidx + -1]->minor); } -#line 1443 "oql-parser.php" -#line 119 "oql-parser.y" - function yy_r38(){ +#line 1478 "oql-parser.php" +#line 123 "oql-parser.y" + function yy_r42(){ $this->_retvalue = array(); } -#line 1448 "oql-parser.php" -#line 130 "oql-parser.y" - function yy_r42(){ $this->_retvalue = new IntervalOqlExpression($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); } -#line 1451 "oql-parser.php" -#line 142 "oql-parser.y" - function yy_r51(){ $this->_retvalue = new ScalarOqlExpression($this->yystack[$this->yyidx + 0]->minor); } -#line 1454 "oql-parser.php" -#line 145 "oql-parser.y" - function yy_r53(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor); } -#line 1457 "oql-parser.php" +#line 1483 "oql-parser.php" +#line 134 "oql-parser.y" + function yy_r46(){ $this->_retvalue = new IntervalOqlExpression($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); } +#line 1486 "oql-parser.php" #line 146 "oql-parser.y" - function yy_r54(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -2]->minor); } -#line 1460 "oql-parser.php" -#line 147 "oql-parser.y" - function yy_r55(){ $this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; } -#line 1463 "oql-parser.php" + function yy_r55(){ $this->_retvalue = new ScalarOqlExpression($this->yystack[$this->yyidx + 0]->minor); } +#line 1489 "oql-parser.php" +#line 149 "oql-parser.y" + function yy_r57(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor); } +#line 1492 "oql-parser.php" #line 150 "oql-parser.y" - function yy_r56(){ $this->_retvalue = new VariableOqlExpression(substr($this->yystack[$this->yyidx + 0]->minor, 1)); } -#line 1466 "oql-parser.php" -#line 152 "oql-parser.y" - function yy_r57(){ + function yy_r58(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -2]->minor); } +#line 1495 "oql-parser.php" +#line 151 "oql-parser.y" + function yy_r59(){ $this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; } +#line 1498 "oql-parser.php" +#line 154 "oql-parser.y" + function yy_r60(){ $this->_retvalue = new VariableOqlExpression(substr($this->yystack[$this->yyidx + 0]->minor, 1)); } +#line 1501 "oql-parser.php" +#line 156 "oql-parser.y" + function yy_r61(){ if ($this->yystack[$this->yyidx + 0]->minor[0] == '`') { $name = substr($this->yystack[$this->yyidx + 0]->minor, 1, strlen($this->yystack[$this->yyidx + 0]->minor) - 2); @@ -1472,13 +1507,13 @@ static public $yy_action = array( } $this->_retvalue = new OqlName($name, $this->m_iColPrev); } -#line 1479 "oql-parser.php" -#line 164 "oql-parser.y" - function yy_r58(){$this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; } -#line 1482 "oql-parser.php" -#line 165 "oql-parser.y" - function yy_r59(){$this->_retvalue=stripslashes(substr($this->yystack[$this->yyidx + 0]->minor, 1, strlen($this->yystack[$this->yyidx + 0]->minor) - 2)); } -#line 1485 "oql-parser.php" +#line 1514 "oql-parser.php" +#line 168 "oql-parser.y" + function yy_r62(){$this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; } +#line 1517 "oql-parser.php" +#line 169 "oql-parser.y" + function yy_r63(){$this->_retvalue=stripslashes(substr($this->yystack[$this->yyidx + 0]->minor, 1, strlen($this->yystack[$this->yyidx + 0]->minor) - 2)); } +#line 1520 "oql-parser.php" /** * placeholder for the left hand side in a reduce operation. @@ -1593,7 +1628,7 @@ static public $yy_action = array( #line 25 "oql-parser.y" throw new OQLParserException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol, $this->tokenName($yymajor), $TOKEN); -#line 1601 "oql-parser.php" +#line 1636 "oql-parser.php" } /** @@ -1760,7 +1795,7 @@ throw new OQLParserException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCo } while ($yymajor != self::YYNOCODE && $this->yyidx >= 0); } } -#line 217 "oql-parser.y" +#line 221 "oql-parser.y" class OQLParserException extends OQLException @@ -1825,4 +1860,4 @@ class OQLParser extends OQLParserRaw } } -#line 1834 "oql-parser.php" +#line 1869 "oql-parser.php" diff --git a/core/oql/oql-parser.y b/core/oql/oql-parser.y index 34bd6214b..0d08bf9e7 100644 --- a/core/oql/oql-parser.y +++ b/core/oql/oql-parser.y @@ -82,6 +82,10 @@ join_condition(A) ::= field_id(X) BELOW field_id(Y). { A = new BinaryOqlExpressi join_condition(A) ::= field_id(X) BELOW_STRICT field_id(Y). { A = new BinaryOqlExpression(X, 'BELOW_STRICT', Y); } join_condition(A) ::= field_id(X) NOT_BELOW field_id(Y). { A = new BinaryOqlExpression(X, 'NOT_BELOW', Y); } join_condition(A) ::= field_id(X) NOT_BELOW_STRICT field_id(Y). { A = new BinaryOqlExpression(X, 'NOT_BELOW_STRICT', Y); } +join_condition(A) ::= field_id(X) ABOVE field_id(Y). { A = new BinaryOqlExpression(X, 'ABOVE', Y); } +join_condition(A) ::= field_id(X) ABOVE_STRICT field_id(Y). { A = new BinaryOqlExpression(X, 'ABOVE_STRICT', Y); } +join_condition(A) ::= field_id(X) NOT_ABOVE field_id(Y). { A = new BinaryOqlExpression(X, 'NOT_ABOVE', Y); } +join_condition(A) ::= field_id(X) NOT_ABOVE_STRICT field_id(Y). { A = new BinaryOqlExpression(X, 'NOT_ABOVE_STRICT', Y); } condition(A) ::= expression_prio4(X). { A = X; } diff --git a/core/sqlquery.class.inc.php b/core/sqlquery.class.inc.php index 06ee60b0e..e39c89b81 100644 --- a/core/sqlquery.class.inc.php +++ b/core/sqlquery.class.inc.php @@ -163,7 +163,6 @@ class SQLQuery // { // throw new CoreException("Unknown field '$sRightField' in table '".$sRightTable."'"); // } - $this->m_aJoinSelects[] = array( "jointype" => $sJoinType, "select" => $oSQLQuery, @@ -176,7 +175,7 @@ class SQLQuery { $this->AddJoin("inner", $oSQLQuery, $sLeftField, $sRightField, $sRightTable); } - public function AddInnerJoinTree($oSQLQuery, $sLeftField, $sRightFieldLeft, $sRightFieldRight, $sRightTableAlias = '', $iOperatorCode = TREE_OPERATOR_BELOW) + public function AddInnerJoinTree($oSQLQuery, $sLeftFieldLeft, $sLeftFieldRight, $sRightFieldLeft, $sRightFieldRight, $sRightTableAlias = '', $iOperatorCode = TREE_OPERATOR_BELOW) { assert((get_class($oSQLQuery) == __CLASS__) || is_subclass_of($oSQLQuery, __CLASS__)); if (empty($sRightTableAlias)) @@ -186,7 +185,8 @@ class SQLQuery $this->m_aJoinSelects[] = array( "jointype" => 'inner_tree', "select" => $oSQLQuery, - "leftfield" => $sLeftField, + "leftfield" => $sLeftFieldLeft, + "rightfield" => $sLeftFieldRight, "rightfield_left" => $sRightFieldLeft, "rightfield_right" => $sRightFieldRight, "righttablealias" => $sRightTableAlias, @@ -418,6 +418,7 @@ class SQLQuery break; case "inner_tree": $sNodeLeft = "`$sCallerAlias`.`{$aJoinData['leftfield']}`"; + $sNodeRight = "`$sCallerAlias`.`{$aJoinData['rightfield']}`"; $sRootLeft = "`$sRightTableAlias`.`{$aJoinData['rightfield_left']}`"; $sRootRight = "`$sRightTableAlias`.`{$aJoinData['rightfield_right']}`"; switch($aJoinData['tree_operator']) @@ -437,6 +438,22 @@ class SQLQuery case TREE_OPERATOR_NOT_BELOW_STRICT: // Complementary of BELOW_STRICT $sJoinCond = "$sNodeLeft <= $sRootLeft OR $sNodeLeft >= $sRootRight"; break; + + case TREE_OPERATOR_ABOVE: + $sJoinCond = "$sNodeLeft <= $sRootLeft AND $sNodeRight >= $sRootRight"; + break; + + case TREE_OPERATOR_ABOVE_STRICT: + $sJoinCond = "$sNodeLeft < $sRootLeft AND $sNodeRight > $sRootRight"; + break; + + case TREE_OPERATOR_NOT_ABOVE: // Complementary of 'ABOVE' + $sJoinCond = "$sNodeLeft > $sRootLeft OR $sNodeRight < $sRootRight"; + break; + + case TREE_OPERATOR_NOT_ABOVE_STRICT: // Complementary of ABOVE_STRICT + $sJoinCond = "$sNodeLeft >= $sRootLeft OR $sNodeRight <= $sRootRight"; + break; } $aFrom[$this->m_sTableAlias] = array("jointype"=>$aJoinData['jointype'], "tablename"=>$this->m_sTable, "joincondition"=>"$sJoinCond");