PHP Error when parsing SQL containing the REPLACE function
Closed this issue · 6 comments
GoogleCodeExporter commented
Hi,
If I write these three lines of code in a file in the examples directory :
require_once dirname(__FILE__) . '/../src/PHPSQLParser.php';
$sql = "SELECT REPLACE(NOW(), '-', '')";
$parser = new PHPSQLParser($sql, true);
It fails with this error :
Warning: Invalid argument supplied for foreach() in
/Users/nico/Downloads/PHP-SQL-Parser/src/processors/InsertProcessor.php on line
51
Warning: strpos(): Empty needle in
/Users/nico/Downloads/PHP-SQL-Parser/src/positions/PositionCalculator.php on
line 80
Fatal error: Uncaught exception 'UnableToCalculatePositionException' with
message 'cannot calculate position of within (NOW(), '-', '')' in
/Users/nico/Downloads/
PHP-SQL-Parser/src/positions/PositionCalculator.php:199
Stack trace:
#0
/Users/nico/Downloads/PHP-SQL-Parser/src/positions/PositionCalculator.php(215):
PositionCalculator->lookForBaseExpression('SELECT REPLACE(...', 14, Array, 0, Ar
ray)
#1
/Users/nico/Downloads/PHP-SQL-Parser/src/positions/PositionCalculator.php(215):
PositionCalculator->lookForBaseExpression('SELECT REPLACE(...', 14, Array, 'REPL
ACE', Array)
#2
/Users/nico/Downloads/PHP-SQL-Parser/src/positions/PositionCalculator.php(70):
PositionCalculator->lookForBaseExpression('SELECT REPLACE(...', 14, Array, 0,
Arr
ay)
#3 /Users/nico/Downloads/PHP-SQL-Parser/src/PHPSQLParser.php(90):
PositionCalculator->setPositionsWithinSQL('SELECT REPLACE(...', Array)
#4 /Users/nico/Downloads/PHP-SQL-Parser/src/PHPSQLParser.php(65):
PHPSQLParser->parse('SELECT REPLACE(...', true)
#5 /Users/nico/Downloads/PHP-SQL-Parser/exa in
/Users/nico/Downloads/PHP-SQL-Parser/src/positions/PositionCalculator.php on
line 199
shell returned 255
It seems that for this query 'REPLACE' is considered as the keyword and not the
function name.
What version of the product are you using? On what operating system?
php-sql-parser-20140108.zip on a mac.
thank you,
Nicolas
Original issue reported on code.google.com by nderm...@adequasys.com
on 28 Aug 2014 at 4:22
GoogleCodeExporter commented
Please try the current version from http://tinyurl.com/mg8bh9p or /trunk first.
Is the error still there?
Original comment by pho...@gmx.de
on 10 Sep 2014 at 9:19
- Changed state: Accepted
GoogleCodeExporter commented
The output of the current version is wrong.
Array
(
[SELECT] => Array
(
[0] => Array
(
[delim] =>
)
)
[REPLACE] => Array
(
[0] => Array
(
[expr_type] => table
[table] =>
[no_quotes] => Array
(
[delim] => .
[parts] => Array
(
)
)
[alias] =>
[base_expr] =>
)
)
)
Original comment by pho...@gmx.de
on 10 Sep 2014 at 1:14
GoogleCodeExporter commented
[deleted comment]
GoogleCodeExporter commented
OK, I tried with php-sql-parser-4.0.0.zip and had the same error :
Warning: strpos(): Empty needle in /Users/nico/Downloads/PHP-SQL-Parser
2/src/PHPSQLParser/positions/PositionCalculator.php on line 137
Fatal error: Uncaught exception
'PHPSQLParser\exceptions\UnableToCalculatePositionException' with message
'cannot calculate position of within (NOW(), '-', '')' i
n /Users/nico/Downloads/PHP-SQL-Parser
2/src/PHPSQLParser/positions/PositionCalculator.php:238
Stack trace:
#0 /Users/nico/Downloads/PHP-SQL-Parser
2/src/PHPSQLParser/positions/PositionCalculator.php(254):
PHPSQLParser\positions\PositionCalculator->lookForBaseExpression(
'SELECT REPLACE(...', 14, Array, 0, Array)
#1 /Users/nico/Downloads/PHP-SQL-Parser
2/src/PHPSQLParser/positions/PositionCalculator.php(254):
PHPSQLParser\positions\PositionCalculator->lookForBaseExpression(
'SELECT REPLACE(...', 14, Array, 'REPLACE', Array)
#2 /Users/nico/Downloads/PHP-SQL-Parser
2/src/PHPSQLParser/positions/PositionCalculator.php(127):
PHPSQLParser\positions\PositionCalculator->lookForBaseExpression(
'SELECT REPLACE(...', 14, Array, 0, Array)
#3 /Users/nico/Downloads/PHP-SQL-Parser
2/src/PHPSQLParser/PHPSQLParser.php(96):
PHPSQLParser\positions\PositionCalculator->setPositionsWith in
/Users/nico/Downloa
ds/PHP-SQL-Parser 2/src/PHPSQLParser/positions/PositionCalculator.php on line
238
Then I tried with the svn trunk (rev 1368) and had some trouble making the
example code work (had to run composer install and then require_once
../vendor/autoload.php in the example.php file) and got the same error :
Warning: strpos(): Empty needle in
/Users/nico/work/code/tmp/php-sql-parser-read-only/src/PHPSQLParser/positions/Po
sitionCalculator.php on line 133
Fatal error: Uncaught exception
'PHPSQLParser\exceptions\UnableToCalculatePositionException' with message
'cannot calculate position of within (NOW(), '-', '')' in
/Users/nico/work/code/tmp/php-sql-parser-read-only/src/PHPSQLParser/positions/Po
sitionCalculator.php:239
Stack trace:
#0
/Users/nico/work/code/tmp/php-sql-parser-read-only/src/PHPSQLParser/positions/Po
sitionCalculator.php(255):
PHPSQLParser\positions\PositionCalculator->lookForBaseExpression('SELECT
REPLACE(...', 14, Array, 0, Array)
#1
/Users/nico/work/code/tmp/php-sql-parser-read-only/src/PHPSQLParser/positions/Po
sitionCalculator.php(255):
PHPSQLParser\positions\PositionCalculator->lookForBaseExpression('SELECT
REPLACE(...', 14, Array, 'REPLACE', Array)
#2
/Users/nico/work/code/tmp/php-sql-parser-read-only/src/PHPSQLParser/positions/Po
sitionCalculator.php(123):
PHPSQLParser\positions\PositionCalculator->lookForBaseExpression('SELECT
REPLACE(...', 14, Array, 0, Array)
#3
/Users/nico/work/code/tmp/php-sql-parser-read-only/src/PHPSQLParser/PHPSQLParser
.php(92): in
/Users/nico/work/code/tmp/php-sql-parser-read-only/src/PHPSQLParser/positions/Po
sitionCalculator.php on line 239
Original comment by nicolas....@gmail.com
on 10 Sep 2014 at 1:25
GoogleCodeExporter commented
This is a problem of the SQLProcessor class, which should differ between the
function and the keyword.
Original comment by pho...@gmx.de
on 11 Sep 2014 at 7:13
- Changed state: Started
GoogleCodeExporter commented
Try r1377 on /trunk, this should fix the issue.
Original comment by pho...@gmx.de
on 11 Sep 2014 at 7:52
- Changed state: Fixed