summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad Mostert <mostertb@users.noreply.github.com>2018-10-13 13:36:28 +0200
committerBrad Mostert <mostertb@users.noreply.github.com>2018-10-13 13:36:28 +0200
commit1a18d1c5bad164cb0d2e4584578a76273af7feaf (patch)
tree2e6ba422dbcc17907254aa46f8df0212cdc2ec14
parent20ed99420d54d6942e76c94e867ca4729f361669 (diff)
downloadsql-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.php69
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;
}
}