From 54e80e953d61aa878008255bcc365de8c9c1c0d4 Mon Sep 17 00:00:00 2001 From: Dan Ungureanu Date: Sat, 8 Aug 2015 20:53:10 +0300 Subject: [PATCH 1/2] Updated sql-parser to udan11/sql-parser@84bc88b6f6a810cc37d10cc65be093353ff53995. Signed-off-by: Dan Ungureanu --- libraries/DisplayResults.class.php | 4 ++-- .../src/Components/AlterOperation.php | 10 ++++---- ...eldDefinition.php => CreateDefinition.php} | 14 +++++------ .../sql-parser/src/Components/Expression.php | 6 +++-- .../src/Components/ExpressionArray.php | 4 ++-- .../sql-parser/src/Components/IntoKeyword.php | 4 ++-- .../src/Components/OrderKeyword.php | 22 ++++++++--------- .../src/Components/SetOperation.php | 2 +- .../src/Statements/CreateStatement.php | 12 +++++----- libraries/sql-parser/src/Utils/Query.php | 24 +++++++++---------- 10 files changed, 51 insertions(+), 51 deletions(-) rename libraries/sql-parser/src/Components/{FieldDefinition.php => CreateDefinition.php} (96%) diff --git a/libraries/DisplayResults.class.php b/libraries/DisplayResults.class.php index 29952416cf..c043658a64 100644 --- a/libraries/DisplayResults.class.php +++ b/libraries/DisplayResults.class.php @@ -4288,8 +4288,8 @@ class PMA_DisplayResults if (!empty($statement->order)) { foreach ($statement->order as $o) { - $sort_expression[] = $o->field->expr . ' ' . $o->type; - $sort_expression_nodirection[] = $o->field->expr; + $sort_expression[] = $o->expr->expr . ' ' . $o->type; + $sort_expression_nodirection[] = $o->expr->expr; $sort_direction[] = $o->type; } } else { diff --git a/libraries/sql-parser/src/Components/AlterOperation.php b/libraries/sql-parser/src/Components/AlterOperation.php index ae28d51587..d704f25ba2 100644 --- a/libraries/sql-parser/src/Components/AlterOperation.php +++ b/libraries/sql-parser/src/Components/AlterOperation.php @@ -1,7 +1,7 @@ value === ')') { --$brackets; - } elseif ($token->value === ',') { - if ($brackets === 0) { - break; - } + } elseif (($token->value === ',') && ($brackets === 0)) { + break; } } $ret->unknown[] = $token; diff --git a/libraries/sql-parser/src/Components/FieldDefinition.php b/libraries/sql-parser/src/Components/CreateDefinition.php similarity index 96% rename from libraries/sql-parser/src/Components/FieldDefinition.php rename to libraries/sql-parser/src/Components/CreateDefinition.php index 351e8b551b..4dfbb7ae11 100644 --- a/libraries/sql-parser/src/Components/FieldDefinition.php +++ b/libraries/sql-parser/src/Components/CreateDefinition.php @@ -1,7 +1,7 @@ * @license http://opensource.org/licenses/GPL-2.0 GNU Public License */ -class FieldDefinition extends Component +class CreateDefinition extends Component { /** @@ -145,13 +145,13 @@ class FieldDefinition extends Component * @param TokensList $list The list of tokens that are being parsed. * @param array $options Parameters for parsing. * - * @return FieldDefinition[] + * @return CreateDefinition[] */ public static function parse(Parser $parser, TokensList $list, array $options = array()) { $ret = array(); - $expr = new FieldDefinition(); + $expr = new CreateDefinition(); /** * The state of the parser. @@ -234,7 +234,7 @@ class FieldDefinition extends Component if ((!empty($expr->type)) || (!empty($expr->key))) { $ret[] = $expr; } - $expr = new FieldDefinition(); + $expr = new CreateDefinition(); if ($token->value === ',') { $state = 1; } elseif ($token->value === ')') { @@ -269,7 +269,7 @@ class FieldDefinition extends Component } /** - * @param FieldDefinition|FieldDefinition[] $component The component to be built. + * @param CreateDefinition|CreateDefinition[] $component The component to be built. * * @return string */ diff --git a/libraries/sql-parser/src/Components/Expression.php b/libraries/sql-parser/src/Components/Expression.php index d7d0d4a91c..60f85544ba 100644 --- a/libraries/sql-parser/src/Components/Expression.php +++ b/libraries/sql-parser/src/Components/Expression.php @@ -1,7 +1,8 @@ type === Token::TYPE_OPERATOR) && ($token->value === '(')) { - $ret->fields = ArrayObj::parse($parser, $list)->values; + $ret->columns = ArrayObj::parse($parser, $list)->values; ++$list->idx; } break; diff --git a/libraries/sql-parser/src/Components/OrderKeyword.php b/libraries/sql-parser/src/Components/OrderKeyword.php index 7f1879c519..b8b05c15b6 100644 --- a/libraries/sql-parser/src/Components/OrderKeyword.php +++ b/libraries/sql-parser/src/Components/OrderKeyword.php @@ -26,11 +26,11 @@ class OrderKeyword extends Component { /** - * The field that is used for ordering. + * The expression that is used for ordering. * * @var Expression */ - public $field; + public $expr; /** * The order type. @@ -42,12 +42,12 @@ class OrderKeyword extends Component /** * Constructor. * - * @param Expression $field The field that we are sorting by. - * @param string $type The sorting type. + * @param Expression $expr The expression that we are sorting by. + * @param string $type The sorting type. */ - public function __construct($field = null, $type = 'ASC') + public function __construct($expr = null, $type = 'ASC') { - $this->field = $field; + $this->expr = $expr; $this->type = $type; } @@ -69,7 +69,7 @@ class OrderKeyword extends Component * * Below are the states of the parser. * - * 0 ----------------------[ field ]----------------------> 1 + * 0 --------------------[ expression ]-------------------> 1 * * 1 ------------------------[ , ]------------------------> 0 * 1 -------------------[ ASC / DESC ]--------------------> 1 @@ -96,13 +96,13 @@ class OrderKeyword extends Component } if ($state === 0) { - $expr->field = Expression::parse($parser, $list); + $expr->expr = Expression::parse($parser, $list); $state = 1; } elseif ($state === 1) { if (($token->type === Token::TYPE_KEYWORD) && (($token->value === 'ASC') || ($token->value === 'DESC'))) { $expr->type = $token->value; } elseif (($token->type === Token::TYPE_OPERATOR) && ($token->value === ',')) { - if (!empty($expr->field)) { + if (!empty($expr->expr)) { $ret[] = $expr; } $expr = new OrderKeyword(); @@ -115,7 +115,7 @@ class OrderKeyword extends Component } // Last iteration was not processed. - if (!empty($expr->field)) { + if (!empty($expr->expr)) { $ret[] = $expr; } @@ -137,7 +137,7 @@ class OrderKeyword extends Component } return implode(", ", $ret); } else { - return Expression::build($component->field) . ' ' . $component->type; + return Expression::build($component->expr) . ' ' . $component->type; } } } diff --git a/libraries/sql-parser/src/Components/SetOperation.php b/libraries/sql-parser/src/Components/SetOperation.php index fc05cf7404..25bb9e4231 100644 --- a/libraries/sql-parser/src/Components/SetOperation.php +++ b/libraries/sql-parser/src/Components/SetOperation.php @@ -57,7 +57,7 @@ class SetOperation extends Component * * Below are the states of the parser. * - * 0 -------------------[ field name ]--------------------> 1 + * 0 -------------------[ column name ]-------------------> 1 * * 1 ------------------------[ , ]------------------------> 0 * 1 ----------------------[ value ]----------------------> 1 diff --git a/libraries/sql-parser/src/Statements/CreateStatement.php b/libraries/sql-parser/src/Statements/CreateStatement.php index 3380f1cd8a..4c0d985d47 100644 --- a/libraries/sql-parser/src/Statements/CreateStatement.php +++ b/libraries/sql-parser/src/Statements/CreateStatement.php @@ -14,7 +14,7 @@ use SqlParser\Token; use SqlParser\TokensList; use SqlParser\Components\ArrayObj; use SqlParser\Components\DataType; -use SqlParser\Components\FieldDefinition; +use SqlParser\Components\CreateDefinition; use SqlParser\Components\Expression; use SqlParser\Components\OptionsArray; use SqlParser\Components\ParameterDefinition; @@ -164,12 +164,12 @@ class CreateStatement extends Statement public $entityOptions; /** - * If `CREATE TABLE`, a list of fields in the new table. + * If `CREATE TABLE`, a list of columns and keys. * If `CREATE VIEW`, a list of columns. * * Used by `CREATE TABLE` and `CREATE VIEW`. * - * @var FieldDefinition[]|ArrayObj + * @var CreateDefinition[]|ArrayObj */ public $fields; @@ -218,7 +218,7 @@ class CreateStatement extends Statement $fields = ''; if (!empty($this->fields)) { if (is_array($this->fields)) { - $fields = FieldDefinition::build($this->fields) . ' '; + $fields = CreateDefinition::build($this->fields) . ' '; } elseif ($this->fields instanceof ArrayObj) { $fields = ArrayObj::build($this->fields); } @@ -304,10 +304,10 @@ class CreateStatement extends Statement static::$DB_OPTIONS ); } elseif ($this->options->has('TABLE')) { - $this->fields = FieldDefinition::parse($parser, $list); + $this->fields = CreateDefinition::parse($parser, $list); if (empty($this->fields)) { $parser->error( - __('At least one field definition was expected.'), + __('At least one column definition was expected.'), $list->tokens[$list->idx] ); } diff --git a/libraries/sql-parser/src/Utils/Query.php b/libraries/sql-parser/src/Utils/Query.php index 604a902418..41e99d19a6 100644 --- a/libraries/sql-parser/src/Utils/Query.php +++ b/libraries/sql-parser/src/Utils/Query.php @@ -449,40 +449,40 @@ class Query */ public static function getTables($statement) { - $fields = array(); + $expressions = array(); if (($statement instanceof InsertStatement) || ($statement instanceof ReplaceStatement) ) { - $fields = array($statement->into->dest); + $expressions = array($statement->into->dest); } elseif ($statement instanceof UpdateStatement) { - $fields = $statement->tables; + $expressions = $statement->tables; } elseif (($statement instanceof SelectStatement) || ($statement instanceof DeleteStatement) ) { - $fields = $statement->from; + $expressions = $statement->from; } elseif (($statement instanceof AlterStatement) || ($statement instanceof TruncateStatement) ) { - $fields = array($statement->table); + $expressions = array($statement->table); } elseif ($statement instanceof DropStatement) { if (!$statement->options->has('TABLE')) { // No tables are dropped. return array(); } - $fields = $statement->fields; + $expressions = $statement->fields; } elseif ($statement instanceof RenameStatement) { foreach ($statement->renames as $rename) { - $fields[] = $rename->old; + $expressions[] = $rename->old; } } $ret = array(); - foreach ($fields as $field) { - if (!empty($field->table)) { - $field->expr = null; // Force rebuild. - $field->alias = null; // Aliases are not required. - $ret[] = Expression::build($field); + foreach ($expressions as $expr) { + if (!empty($expr->table)) { + $expr->expr = null; // Force rebuild. + $expr->alias = null; // Aliases are not required. + $ret[] = Expression::build($expr); } } return $ret; From a4119316c64e4f8a524e383b4fc287ca7d9c2bbe Mon Sep 17 00:00:00 2001 From: Dan Ungureanu Date: Sat, 8 Aug 2015 21:35:49 +0300 Subject: [PATCH 2/2] Updated sql-parser to udan11/sql-parser@77d5409b57f0ac82cf2ae71f339912c7f175c5cc. Signed-off-by: Dan Ungureanu --- libraries/sql-parser/src/Lexer.php | 30 +++++++++++++++++++++--- libraries/sql-parser/src/Utils/Query.php | 4 +--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/libraries/sql-parser/src/Lexer.php b/libraries/sql-parser/src/Lexer.php index 69c1ff2091..82385e309c 100644 --- a/libraries/sql-parser/src/Lexer.php +++ b/libraries/sql-parser/src/Lexer.php @@ -515,15 +515,39 @@ namespace SqlParser { $token .= $this->str[$this->last]; if (Context::isComment($token)) { $flags = Token::FLAG_COMMENT_C; - if (($this->last + 1 < $this->len) && ($this->str[$this->last + 1] === '!')) { - // It is a MySQL-specific command. - $flags |= Token::FLAG_COMMENT_MYSQL_CMD; + + // This comment already ended. It may be a part of a + // previous MySQL specific command. + if ($token === '*/') { + return new Token($token, Token::TYPE_COMMENT, $flags); } + + // Checking if this is a MySQL-specific command. + if (($this->last + 1 < $this->len) && ($this->str[$this->last + 1] === '!')) { + $flags |= Token::FLAG_COMMENT_MYSQL_CMD; + $token .= $this->str[++$this->last]; + + while ((++$this->last < $this->len) + && ('0' <= $this->str[$this->last]) + && ($this->str[$this->last] <= '9') + ) { + $token .= $this->str[$this->last]; + } + --$this->last; + + // We split this comment and parse only its beginning + // here. + return new Token($token, Token::TYPE_COMMENT, $flags); + } + + // Parsing the comment. while ((++$this->last < $this->len) && (($this->str[$this->last - 1] !== '*') || ($this->str[$this->last] !== '/')) ) { $token .= $this->str[$this->last]; } + + // Adding the ending. if ($this->last < $this->len) { $token .= $this->str[$this->last]; } diff --git a/libraries/sql-parser/src/Utils/Query.php b/libraries/sql-parser/src/Utils/Query.php index 41e99d19a6..86325ed1f2 100644 --- a/libraries/sql-parser/src/Utils/Query.php +++ b/libraries/sql-parser/src/Utils/Query.php @@ -743,9 +743,7 @@ class Query for ($list->idx = 0; $list->idx < $list->count; ++$list->idx) { $token = $list->tokens[$list->idx]; - if (($token->type === Token::TYPE_COMMENT) - && (!($token->flags & Token::FLAG_COMMENT_MYSQL_CMD)) - ) { + if ($token->type === Token::TYPE_COMMENT) { continue; }