diff options
author | Brad Mostert <mostertb@users.noreply.github.com> | 2018-10-13 13:36:28 +0200 |
---|---|---|
committer | Brad Mostert <mostertb@users.noreply.github.com> | 2018-10-13 13:36:28 +0200 |
commit | 1a18d1c5bad164cb0d2e4584578a76273af7feaf (patch) | |
tree | 2e6ba422dbcc17907254aa46f8df0212cdc2ec14 | |
parent | 20ed99420d54d6942e76c94e867ca4729f361669 (diff) | |
download | sql-parser-1a18d1c5bad164cb0d2e4584578a76273af7feaf.zip sql-parser-1a18d1c5bad164cb0d2e4584578a76273af7feaf.tar.gz sql-parser-1a18d1c5bad164cb0d2e4584578a76273af7feaf.tar.bz2 |
Add Support for CASE ... END AS alias
-rw-r--r-- | src/Components/CaseExpression.php | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/Components/CaseExpression.php b/src/Components/CaseExpression.php index 820947b..a256f89 100644 --- a/src/Components/CaseExpression.php +++ b/src/Components/CaseExpression.php @@ -7,6 +7,7 @@ namespace PhpMyAdmin\SqlParser\Components; use PhpMyAdmin\SqlParser\Component; +use PhpMyAdmin\SqlParser\Context; use PhpMyAdmin\SqlParser\Parser; use PhpMyAdmin\SqlParser\Token; use PhpMyAdmin\SqlParser\TokensList; @@ -56,6 +57,13 @@ class CaseExpression extends Component public $else_result; /** + * The alias of this CASE statement + * + * @var string + */ + public $alias; + + /** * The sub-expression. * * @var string @@ -94,6 +102,13 @@ class CaseExpression extends Component */ $type = 0; + /** + * Whether an alias is expected + * + * @bool + */ + $alias = false; + ++$list->idx; // Skip 'CASE' for (; $list->idx < $list->count; ++$list->idx) { @@ -201,6 +216,56 @@ class CaseExpression extends Component $list->tokens[$list->idx - 1] ); } else { + + // Parse alias for CASE statement + for (; $list->idx < $list->count; ++$list->idx) { + $token = $list->tokens[$list->idx]; + + // Skipping whitespaces and comments. + if (($token->type === Token::TYPE_WHITESPACE) + || ($token->type === Token::TYPE_COMMENT) + ) { + continue; + } + + // + if($token->type === Token::TYPE_KEYWORD + && $token->keyword === 'AS'){ + + if ($alias) { + $parser->error( + 'An alias was expected.', + $token + ); + break; + } + $alias = true; + continue; + } + + if ($alias){ + + // An alias is expected (the keyword `AS` was previously found). + if (!empty($ret->alias)) { + $parser->error('An alias was previously found.', $token); + break; + } + $ret->alias = $token->value; + $alias = false; + + continue; + } + + break; + } + if ($alias) { + $parser->error( + 'An alias was expected.', + $list->tokens[$list->idx - 1] + ); + } + + $ret->expr = self::build($ret); } @@ -241,6 +306,10 @@ class CaseExpression extends Component } $ret .= 'END'; + if ($component->alias) { + $ret .= ' AS ' . Context::escape($component->alias); + } + return $ret; } } |