phpmyadmin / phpmyadmin/sql-parser

Missing space before UNION when building CREATE VIEW

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

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

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

説明

Summary

When CreateStatement::build() reconstructs a CREATE VIEW ... AS SELECT ... UNION ...
statement, the output misses the whitespace between the built SELECT and the
trailing body tokens. Result: invalid SQL such as ... WHERE 3 = 3union all (...).

This was previously reported downstream in phpMyAdmin:

  • phpmyadmin/phpmyadmin#19692
  • phpmyadmin/phpmyadmin#18515 (same bug, older)

Reproduction

use PhpMyAdmin\SqlParser\Parser;

$sql = "CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER "
     . "VIEW `v1` AS select 1 AS `a` where 3 = 3 union all (select 2 AS `a`)";

echo (new Parser($sql))->statements[0]->build();

Actual output:

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1`  AS SELECT 1 AS `a` WHERE 3 = 3union all (select 2 AS `a`)

(note: 3 = 3union all — no space).

Expected: a space before union all, producing valid SQL.

Environment

  • Library version: current master (head f440917e)
  • PHP: 8.4

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

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

はじめの一歩

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

調査の方向性

CreateStatement::build() から開始し、PhpMyAdmin\SqlParser\Parser を通じて SQL の例で問題を再現します。CREATE VIEW の再構築によって末尾の UNION 本体の前の空白が保持され、3union all ではなく有効な SQL が生成されることを確認します。

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

評価

技術スタック
mysql, php
領域
databases
issue の種類
バグ
難易度
2/5
見積もり時間
1〜3時間
活発さ
静か
明瞭さ
明確に書かれている
初心者へのやさしさ
68/100

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

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