A5:SQL Mk-2

開発のこと、日々のこと

「SQLを1行に整形」の仕様確認

ホーム フォーラム A5:SQL Mk-2掲示板 「SQLを1行に整形」の仕様確認

  • このトピックには2件の返信、1人の参加者があり、最後にまつだにより2週、 6日前に更新されました。
3件の投稿を表示中 - 1 - 3件目 (全3件中)
  • 投稿者
    投稿
  • #24553 返信
    まつだ
    ゲスト

    いくつかのパターンで「SQLを1行に整形」機能を利用していたのですが、
    いくつか想定外のパターンになったものがあったので、
    なぜそのような挙動になってるのか、お伺いしたいです。

    整形前
    — (1)
    select
    test
    from
    table;
    — (2)
    select
    $test$
    from
    table;
    — (3)
    select
    :test:
    from
    table;
    — (4)
    select
    @test@
    from
    table;

    整形後
    — (1)
    select test from table;
    — (2)
    select $test$ from table;
    — (3)
    select :test :from table;
    — (4)
    select @test@from table;

    (1)(2)のパターンだと、改行部がスペースに変換されてます。
    (3)のパターンだと、2つ目の’:’の前にスペースが入り、その後続の改行はスペース変換なしで削除されてます。
    (4)のパターンだと、2つ目の’@’の後の改行はスペース変換なしで削除されてます。

    #24652 返信
    松原正和
    キーマスター

    まつださんこんにちは。
     
    こちらですが、(1)(2)はよいとして、問題は、(3)(4)かと思います。
     
    (3)は “:” がパラメータ前置詞として扱われたためこのように変換されたようです。
    (fromはパラメータ名としては不適ですが、ルール上パラメータとして扱われた形となります。)

    (4)は(3)と同様に “@” がパラメータ前置詞として使われたのですが、2個目の “@” は Oracle のデータベースリンク機能の構文として扱われたため、前後の識別子との間の空白が削除されたようです。パラメータの後ろにデータベースリンクの “@” が来ることは本来ありませんが、このような構文を想定していないため、結果的にこのようなテキストに変換されたようです。
     
    (3)(4)は少し想定されていないSQL文であるためこのような結果になりましたが、何かこのような構文を使うことがあったのでしょうか?
     

    #24837 返信
    まつだ
    ゲスト

    返信ありがとうございます。
    気にしてたのは(4)の挙動で、(3)は試してみたらそうなっただけの話になります。

    (3)(4)は少し想定されていないSQL文であるためこのような結果になりましたが、何かこのような構文を使うことがあったのでしょうか?

    別途加工を行うことを想定してた、SQLのテンプレート文字列を準備し、
    加工時に @test@ 部分を置換するような実装をしておりました。
    そのSQLのテンプレートを生成する際、1行化してDBレコードのカラムに格納するために、
    A5M2の「SQLを1行に整形」を利用しておりました。
    このような使い方の是非はひとまず置いといて、
    select a from table where x = @x_value@ and y = 2222;

    select a from table where x = 1111 and y = 2222;
    という結果を期待していたのが、
    select a from table where x = @x_value@and y = 2222;

    select a from table where x = 1111and y = 2222;
    というSQLが生成されてしまっておりました。
    かつ、厄介なのは、
    select a from table where x = 1111and y = 2222;
    というSQLが、PostgreSQL14までですと
    select a from table where x = 1111 and y = 2222;
    として正常に処理されてしまっていたのが、PostgreSQL15において
    1111andのままで処理されることとなり、エラーとなるという、挙動の違いが出た次第です。

    確かにOracleを想定した際の@の位置づけは理解できますので、
    修正するしないの判断はお任せしますが、事実としてご報告いたします。

3件の投稿を表示中 - 1 - 3件目 (全3件中)
返信先: 「SQLを1行に整形」の仕様確認
あなたの情報:




コメントは受け付けていません。