rickywu-posh/php-sql-parser

PHP Error when parsing SQL containing the REPLACE function

Closed this issue · 6 comments

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

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
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

[deleted comment]
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

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
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