phpmyadmin / phpmyadmin/sql-parser

Incorrect parsing of WHERE LIKE with parameter

オープン
#253 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

enhancement kind/support
主要言語
PHP
スター
485
フォーク
119
PR マージ指標
30日以内にマージされた PR はありません

説明

When trying to parse a WHERE clause such as WHERE foo LIKE :bar it returns foo LIKE : as a single token, where as I would expect it to return foo LIKE :bar as individual tokens. It doesn't have this issue when using back ticks on the columns, or = instead of LIKE.

Sample script:

<?php
require_once __DIR__ . '/vendor/autoload.php';

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

$sql = 'SELECT * FROM test WHERE foo LIKE :bar';
echo 'sql: ' . $sql . PHP_EOL;
$parser = new Parser($sql);
foreach ($parser->list->tokens as $i => $token) {
    echo 'token: ' . $token->token , PHP_EOL;
}


$sql = 'SELECT * FROM test WHERE `foo` LIKE :bar';
echo 'sql: ' . $sql . PHP_EOL;
$parser = new Parser($sql);
foreach ($parser->list->tokens as $i => $token) {
    echo 'token: ' . $token->token , PHP_EOL;
}

$sql = 'SELECT * FROM test WHERE foo = :bar';
echo 'sql: ' . $sql . PHP_EOL;
$parser = new Parser($sql);
foreach ($parser->list->tokens as $i => $token) {
    echo 'token: ' . $token->token , PHP_EOL;
}

Output:

sql: SELECT * FROM test WHERE foo LIKE :bar
token: SELECT
token:  
token: *
token:  
token: FROM
token:  
token: test
token:  
token: WHERE
token:  
token: foo LIKE :
token: bar
token: 
sql: SELECT * FROM test WHERE `foo` LIKE :bar
token: SELECT
token:  
token: *
token:  
token: FROM
token:  
token: test
token:  
token: WHERE
token:  
token: `foo`
token:  
token: LIKE
token:  
token: :bar
token: 
sql: SELECT * FROM test WHERE foo = :bar
token: SELECT
token:  
token: *
token:  
token: FROM
token:  
token: test
token:  
token: WHERE
token:  
token: foo
token:  
token: =
token:  
token: :bar
token:

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

提供された WHERE foo LIKE :bar のサンプルを使い、まず Parser のトークン化パスを確認して、バッククォートで囲まれたカラムの場合および = の場合と比較してください。引用符で囲まれていないカラム、LIKE 演算子、名前付きパラメーターが結合される理由を追跡し、その後、foo、空白、LIKE、空白、:bar が別々のトークンになることを示す回帰テストを追加してください。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
php, sql
領域
compilers
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
45/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。