Skip to content

Commit 5a90ee0

Browse files
authored
Merge pull request #27 from moufmouf/fix_const_columns
Fixing const detection in columns
2 parents 4319f53 + b303935 commit 5a90ee0

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed

src/SQLParser/Node/ConstNode.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
class ConstNode implements NodeInterface
4646
{
4747
private $value;
48+
private $isString = true;
4849

4950
public function getValue()
5051
{
@@ -63,6 +64,22 @@ public function setValue($value)
6364
$this->value = $value;
6465
}
6566

67+
/**
68+
* @return mixed
69+
*/
70+
public function getIsString()
71+
{
72+
return $this->isString;
73+
}
74+
75+
/**
76+
* @param mixed $isString
77+
*/
78+
public function setIsString($isString)
79+
{
80+
$this->isString = $isString;
81+
}
82+
6683
/**
6784
* Returns a Mouf instance descriptor describing this object.
6885
*
@@ -92,6 +109,8 @@ public function toSql(array $parameters = array(), Connection $dbConnection = nu
92109
{
93110
if ($this->value === null) {
94111
return 'NULL';
112+
} elseif (!$this->isString) {
113+
return $this->value;
95114
} elseif ($dbConnection != null) {
96115
return $dbConnection->quote($this->value);
97116
} else {

src/SQLParser/Node/NodeFactory.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,35 @@ public static function toObject(array $desc)
8585
$expr = $desc['base_expr'];
8686
if (strpos($expr, "'") === 0) {
8787
$expr = substr($expr, 1);
88+
} else {
89+
$const->setIsString(false);
8890
}
8991
if (strrpos($expr, "'") === strlen($expr) - 1) {
90-
$expr = substr($expr, 0, strlen($expr) - 1);
92+
$expr = substr($expr, 0, -1);
9193
}
9294
$expr = stripslashes($expr);
9395

9496
$const->setValue($expr);
97+
98+
// If the constant has an alias, it is declared in the columns section.
99+
// If this is the case, let's wrap it in an "expression"
100+
if (isset($desc['alias'])) {
101+
$expression = new Expression();
102+
$expression->setBaseExpression($desc['base_expr']);
103+
$expression->setSubTree($const);
104+
$expression->setAlias($desc['alias']['name']);
105+
$expression->setBrackets(false);
106+
107+
$const = $expression;
108+
109+
unset($desc['alias']);
110+
}
111+
95112
// Debug:
96113
unset($desc['base_expr']);
97114
unset($desc['expr_type']);
98115
unset($desc['sub_tree']);
116+
99117
if (!empty($desc)) {
100118
throw new \InvalidArgumentException('Unexpected parameters in exception: '.var_export($desc, true));
101119
}

tests/Mouf/Database/MagicQueryTest.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public function testStandardSelect()
8383

8484
// Triggers a const node
8585
$sql = 'SELECT id+1 FROM users';
86-
$this->assertEquals("SELECT id + '1' FROM users", self::simplifySql($magicQuery->build($sql)));
86+
$this->assertEquals("SELECT id + 1 FROM users", self::simplifySql($magicQuery->build($sql)));
8787

8888
// Tests parameters with a ! (to force NULL values)
8989
// Bonus: the = transforms into a IS
@@ -104,6 +104,20 @@ public function testStandardSelect()
104104

105105
$sql = 'SELECT * FROM users WHERE status IN :statuses!';
106106
$this->assertEquals('SELECT * FROM users WHERE FALSE', self::simplifySql($magicQuery->build($sql, ['statuses' => []])));
107+
108+
// Test strings with "
109+
$sql = 'SELECT * FROM users WHERE status = \'"\'';
110+
$this->assertEquals('SELECT * FROM users WHERE status = \'\\"\'', self::simplifySql($magicQuery->build($sql)));
111+
112+
$sql = 'SELECT 1+2 as toto FROM users';
113+
$this->assertEquals('SELECT 1 + 2 AS toto FROM users', self::simplifySql($magicQuery->build($sql)));
114+
115+
$sql = 'SELECT -1 as toto FROM users';
116+
$this->assertEquals('SELECT -1 AS toto FROM users', self::simplifySql($magicQuery->build($sql)));
117+
118+
$sql = 'SELECT \'hello\' as toto FROM users';
119+
$this->assertEquals('SELECT \'hello\' AS toto FROM users', self::simplifySql($magicQuery->build($sql)));
120+
107121
}
108122

109123
/**

0 commit comments

Comments
 (0)