diff --git a/src/SQLParser/Node/NodeFactory.php b/src/SQLParser/Node/NodeFactory.php index d2c38a2..060fbb4 100644 --- a/src/SQLParser/Node/NodeFactory.php +++ b/src/SQLParser/Node/NodeFactory.php @@ -303,6 +303,7 @@ public static function toObject(array $desc) throw new \InvalidArgumentException('Unexpected operator with subtree: '.var_export($desc['sub_tree'], true)); } unset($desc['sub_tree']); + unset($desc['delim']); if (!empty($desc)) { throw new \InvalidArgumentException('Unexpected parameters in exception: '.var_export($desc, true)); } @@ -322,6 +323,7 @@ public static function toObject(array $desc) unset($desc['sub_tree']); unset($desc['alias']); unset($desc['direction']); + unset($desc['delim']); if (!empty($desc)) { throw new \InvalidArgumentException('Unexpected parameters in exception: '.var_export($desc, true)); } diff --git a/src/SQLParser/Query/StatementFactory.php b/src/SQLParser/Query/StatementFactory.php index 4eb64e6..3330e22 100644 --- a/src/SQLParser/Query/StatementFactory.php +++ b/src/SQLParser/Query/StatementFactory.php @@ -4,6 +4,7 @@ use SQLParser\Node\NodeFactory; use SQLParser\Node\Operator; +use SQLParser\Node\Reserved; /** * This class has the ability to create instances implementing NodeInterface based on a descriptive array. @@ -21,19 +22,21 @@ public static function toObject(array $desc) return NodeFactory::toObject($item); }, $desc['SELECT']); $columns = NodeFactory::simplify($columns); - $select->setColumns($columns); - if (isset($desc['OPTIONS'])) { - $options = $desc['OPTIONS']; - $key = array_search('DISTINCT', $options); - if ($key !== false) { - $select->setDistinct(true); - unset($options[$key]); - } else { - $select->setDistinct(false); + $options = []; + foreach ($columns as $key => $column) { + if ($column instanceof Reserved) { + if (strtoupper($column->getBaseExpression()) === 'DISTINCT') { + $select->setDistinct(true); + } else { + $options[] = $column->getBaseExpression(); + } + unset($columns[$key]); } - $select->setOptions($options); } + $select->setOptions($options); + + $select->setColumns($columns); if (isset($desc['FROM'])) { $from = self::mapArrayToNodeObjectList($desc['FROM']); diff --git a/tests/Mouf/Database/MagicQueryTest.php b/tests/Mouf/Database/MagicQueryTest.php index 9c25969..319f1a4 100644 --- a/tests/Mouf/Database/MagicQueryTest.php +++ b/tests/Mouf/Database/MagicQueryTest.php @@ -126,6 +126,9 @@ public function testStandardSelect() $sql = 'SELECT * FROM users WHERE (login LIKE :login)'; $this->assertEquals('SELECT * FROM users', self::simplifySql($magicQuery->build($sql))); + + $sql = 'SELECT DISTINCT login FROM users'; + $this->assertEquals('SELECT DISTINCT login FROM users', self::simplifySql($magicQuery->build($sql))); } /**