Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions 10 composer.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"name": "phpmyadmin/sql-parser",
"description": "A validating SQL lexer and parser with a focus on MySQL dialect.",
"name": "jtfnetoo/sql-parser",
"description": "Fork of phpmyadmin https://github.com/phpmyadmin/sql-parser.",
"license": "GPL-2.0+",
"keywords": ["sql", "lexer", "parser", "analysis"],
"homepage": "https://github.com/phpmyadmin/sql-parser",
"homepage": "https://github.com/JoseNetoooo/sql-parser",
"authors": [
{
"name": "The phpMyAdmin Team",
Expand All @@ -12,8 +12,8 @@
}
],
"support": {
"issues": "https://github.com/phpmyadmin/sql-parser/issues",
"source": "https://github.com/phpmyadmin/sql-parser"
"issues": "https://github.com/JoseNetoooo/sql-parser/issues",
"source": "https://github.com/JoseNetoooo/sql-parser"
},
"require": {
"php": ">=5.3.0",
Expand Down
141 changes: 141 additions & 0 deletions 141 src/Components/GroupKeyword.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
<?php

/**
* `GROUP BY` keyword parser.
*/

namespace PhpMyAdmin\SqlParser\Components;

use PhpMyAdmin\SqlParser\Component;
use PhpMyAdmin\SqlParser\Parser;
use PhpMyAdmin\SqlParser\Token;
use PhpMyAdmin\SqlParser\TokensList;

/**
* `GROUP BY` keyword parser.
*
* @category Keywords
*
* @license https://www.gnu.org/licenses/gpl-2.0.txt GPL-2.0+
*/
class GroupKeyword extends Component
{
/**
* The expression that is used for ordering.
*
* @var Expression
*/
public $expr;

/**
* The order type.
*
* @var string
*/
public $type;

/**
* Constructor.
*
* @param Expression $expr the expression that we are sorting by
* @param string $type the sorting type
*/
public function __construct($expr = null, $type = '')
{
$this->expr = $expr;
$this->type = $type;
}

/**
* @param Parser $parser the parser that serves as context
* @param TokensList $list the list of tokens that are being parsed
* @param array $options parameters for parsing
*
* @return GroupKeyword[]
*/
public static function parse(Parser $parser, TokensList $list, array $options = array())
{
$ret = array();

$expr = new self();

/**
* The state of the parser.
*
* Below are the states of the parser.
*
* 0 --------------------[ expression ]-------------------> 1
*
* 1 ------------------------[ , ]------------------------> 0
* 1 -------------------[ ASC / DESC ]--------------------> 1
*
* @var int
*/
$state = 0;

for (; $list->idx < $list->count; ++$list->idx) {
/**
* Token parsed at this moment.
*
* @var Token
*/
$token = $list->tokens[$list->idx];

// End of statement.
if ($token->type === Token::TYPE_DELIMITER) {
break;
}

// Skipping whitespaces and comments.
if (($token->type === Token::TYPE_WHITESPACE) || ($token->type === Token::TYPE_COMMENT)) {
continue;
}

if ($state === 0) {
$expr->expr = Expression::parse($parser, $list);
$state = 1;
} elseif ($state === 1) {
if (($token->type === Token::TYPE_KEYWORD)
&& (($token->keyword === 'ASC') || ($token->keyword === 'DESC'))
) {
$expr->type = $token->keyword;
} elseif (($token->type === Token::TYPE_OPERATOR)
&& ($token->value === ',')
) {
if (!empty($expr->expr)) {
$ret[] = $expr;
}
$expr = new self();
$state = 0;
} else {
break;
}
}
}

// Last iteration was not processed.
if (!empty($expr->expr)) {
$ret[] = $expr;
}

--$list->idx;

return $ret;
}

/**
* @param GroupKeyword|GroupKeyword[] $component the component to be built
* @param array $options parameters for building
*
* @return string
*/
public static function build($component, array $options = array())
{
if (is_array($component)) {
return implode(', ', $component);
}

return trim($component->expr . ' ' . $component->type);

}
}
2 changes: 1 addition & 1 deletion 2 src/Parser.php
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ class Parser extends Core
'options' => array('field' => 'table'),
),
'GROUP BY' => array(
'class' => 'PhpMyAdmin\\SqlParser\\Components\\OrderKeyword',
'class' => 'PhpMyAdmin\\SqlParser\\Components\\GroupKeyword',
'field' => 'group',
),
'HAVING' => array(
Expand Down
24 changes: 24 additions & 0 deletions 24 tests/Components/GroupKeywordTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace PhpMyAdmin\SqlParser\Tests\Components;

use PhpMyAdmin\SqlParser\Components\Expression;
use PhpMyAdmin\SqlParser\Components\GroupKeyword;
use PhpMyAdmin\SqlParser\Tests\TestCase;

class GroupKeywordTest extends TestCase
{
public function testBuild()
{
$this->assertEquals(
GroupKeyword::build(
array(
new GroupKeyword(new Expression('a'), 'ASC'),
new GroupKeyword(new Expression('b'), 'DESC'),
new GroupKeyword(new Expression('c')),
)
),
'a ASC, b DESC, c'
);
}
}
Morty Proxy This is a proxified and sanitized view of the page, visit original site.