Upgrade to Pro — share decks privately, control downloads, hide ads and more …

pgunconf27-PG14-fix-fewer-restricted-keywords-presentation

nuko_yokohama
September 28, 2021

 pgunconf27-PG14-fix-fewer-restricted-keywords-presentation

Reduce the number of keywords that can't be used as column labels without AS
There are now 90% fewer restricted keywords.

nuko_yokohama

September 28, 2021
Tweet

More Decks by nuko_yokohama

Other Decks in Technology

Transcript

  1. Fix fewer restricted keywords.
    PostgresSQL Unconference #27 (2012-09-28)

    View Slide

  2. 自己紹介
    ● ぬこ@横浜 (@nuko_yokohama)
    ● にゃーん
    ● 趣味でポスグレをやってる者だ
    ● 一般の利用者

    View Slide

  3. この発表から得られるもの
    ● このレーダーチャートから察してください。
    即応性
    汎用性
    持続性 ぬこ性
    実用性
    0
    5
    明後日から
    使えるゆるい
    無駄知識

    View Slide

  4. 今日のお題
    AS なしラベルの制限解除

    View Slide

  5. とある PostgreSQL 14 改善項目
    ● PostgreSQL 14 には以下の改善項目が入っている。
    – Reduce the number of keywords that can't be used as column labels
    without AS (Mark Dilger)
    AS なしでカラムラベルとして使用できない
    キーワードの数を減らす
    – There are now 90% fewer restricted keywords.
    制限のあるキーワードが 90% 減りました。
    なるほど?

    View Slide

  6. それだけじゃわかんないよ
    具体的に何が
    改善されたのか
    一般の利用者の
    俺にはわかんないよ
    90% 改善した
    っ・・・!!
    ぽすぐれの人って
    いつもそうですよね・・・!
    一般の利用者を
    なんだと思ってるんですか!?

    View Slide

  7. カラムラベルって?

    View Slide

  8. カラムラベル
    ● PostgreSQL では(他の RDBMS でもそうだと思うけど)
    SELECT リストの項目に「 AS 別名」でラベルを付与できる
    testdb=# SELECT 1;
    ?column?
    ----------
    1
    (1 row)
    testdb=# SELECT 1 AS foo;
    foo
    -----
    1
    (1 row)

    View Slide

  9. AS なしのカラムラベル
    ● 実は「 AS 」は省略可能でもある。
    – 他の DBMS がどうかは調べてないです・・・
    testdb=# SELECT 1 AS foo;
    foo
    -----
    1
    (1 row)
    testdb=# SELECT 1 foo;
    foo
    -----
    1
    (1 row)

    View Slide

  10. AS なしのカラムラベルがダメなケース
    ● しかし AS なしでラベルを付与するとエラーになることもある。
    testdb=# SELECT 1 AS FROM;
    from
    ------
    1
    (1 row)
    testdb=# SELECT 1 FROM;
    ERROR: syntax error at or near ";"
    LINE 1: SELECT 1 FROM;
    ^
    PostgreSQL の
    「キーワード」をラベルに
    指定するときに発生する

    View Slide

  11. PostgreSQL 14 で制限から外れたキーワード

    View Slide

  12. とある PostgreSQL 14 改善項目(再掲)
    ● PostgreSQL 14 には以下の改善項目が入っている。
    – Reduce the number of keywords that can't be used as column labels
    without AS (Mark Dilger)
    AS なしでカラムラベルとして使用できない
    キーワードの数を減らす
    – There are now 90% fewer restricted keywords.
    制限のあるキーワードが 90% 減りました。
    で、具体的に
    なにが減ったの?

    View Slide

  13. 制限でなくなったキーワードを探す
    ● PostgreSQL 14 のリリースノートには、それ以上の情報は書かれていない。
    –   にゃーん
    ● 過去の Commitfestからそれっぽい改善内容を探してみる。
    ● ”Allow most keywords to be used as column labels without requiring AS. ”
    – https://github.com/postgres/postgres/commit/06a7c3154f5bfad65549810cc84f0e3a77
    b408bf
    (2020-09-19)
    – "can be bare column label " という直交するキーワードのプロパティを考案して、
    それをマークするという方式・・・らしい。
    完全に理解した
    (理解していない)

    View Slide

  14. 制限でなくなったキーワードを探す
    ● この改善項目の修正内容( github )
    興味がある人は
    ここから修正方式を
    調べてみよう

    View Slide

  15. 制限でなくなったキーワードを探す
    ● 一般の利用者である自分にとっては、どういうキーワードが
    制限から外れたのか、そこがわかればいいのですよ。
    ● 構文解析周りのコードを見ればわかると予想。
    – src/backend/parser/gram.y
    – 15532 行にあった “ bare_label_keyword” があやしい。
    bare_label_keyword:
    ABORT_P
    | ABSOLUTE_P
    | ACCESS
    | ACTION
    | ADD_P
    | ADMIN
    | AFTER
    (以下略)

    View Slide

  16. 制限でなくなったキーワードを探す
    ● “bare_label_keyword” の最初にあった” ABORT_P” を試す。
    – たぶん、 ABORT のことだろう(てきとう)
    testdb=# SELECT 1 AS ABORT;
    abort
    -------
    1
    (1 row)
    testdb=# SELECT 1 ABORT;
    ERROR: syntax error at or near "ABORT"
    LINE 1: SELECT 1 ABORT;
    PostgreSQL 13
    testdb=# SELECT 1 AS ABORT;
    abort
    -------
    1
    (1 row)
    testdb=# SELECT 1 ABORT;
    abort
    -------
    1
    (1 row)
    PostgreSQL 14
    それっぽい

    View Slide

  17. いろいろ調べた
    ● DML 系のキーワード
    キーワード PostgreSQL 13 PostgreSQL 14
    DELETE × ○
    INSERT × ○
    SELECT × ○
    TRUNCATE × ○
    UPDATE × ○
    FROM × ×
    WHERE × ×
    ORDER × ×
    句を示す
    キーワードは
    14 でも NG

    View Slide

  18. いろいろ調べた
    ● DML の例
    testdb=# SELECT 'SELECT' SELECT;
    ERROR: syntax error at or near "SELECT"
    LINE 1: SELECT 'SELECT' SELECT;
    ^
    testdb=# SELECT'SELECT'SELECT;
    ERROR: syntax error at or near "SELECT"
    LINE 1: SELECT'SELECT'SELECT;
    ^
    PostgreSQL 13
    testdb=# SELECT 'SELECT' SELECT;
    select
    --------
    SELECT
    (1 row)
    testdb=# SELECT'SELECT'SELECT;
    select
    --------
    SELECT
    (1 row)
    PostgreSQL 14

    View Slide

  19. いろいろ調べた
    ● DML の例(おまけ)
    – CREATE TYPE と組み合わせてより楽しいクエリに
    testdb=# CREATE TYPE UPDATE AS ENUM ('UPDATE');
    CREATE TYPE
    testdb=# CREATE TABLE TRUNCATE (INSERT UPDATE);
    CREATE TABLE
    testdb=# INSERT INTO TRUNCATE VALUES ('UPDATE');
    INSERT 0 1
    testdb=# SELECT INSERT::UPDATE DELETE FROM TRUNCATE;
    delete
    --------
    UPDATE
    (1 row)
    PostgreSQL 14

    View Slide

  20. いろいろ調べた
    ● DDL 系のキーワード
    キーワード PostgreSQL 13 PostgreSQL 14
    CREATE × ×
    ALTER × ○
    DROP × ○
    TABLE × ○
    INDEX × ○ CREATE だけは
    14 でもダメ

    View Slide

  21. いろいろ調べた
    ● DDL の例
    testdb=# SELECT 'CREATE' DROP;
    ERROR: syntax error at or near "DROP"
    LINE 1: SELECT 'CREATE' DROP;
    ^
    testdb=# SELECT 'DROP' CREATE;
    ERROR: syntax error at or near "CREATE"
    LINE 1: SELECT 'DROP' CREATE;
    ^
    PostgreSQL 13
    testdb=# SELECT 'CREATE' DROP;
    drop
    --------
    CREATE
    (1 row)
    testdb=# SELECT 'DROP' CREATE;
    ERROR: syntax error at or near "CREATE"
    LINE 1: SELECT 'DROP' CREATE;
    ^
    PostgreSQL 14

    View Slide

  22. いろいろ調べた
    ● DCL 系のキーワード
    キーワード PostgreSQL 13 PostgreSQL 14
    BEGIN × ○
    COMMIT × ○
    END × ○
    SAVEPOINT × ○
    ROLLBACK × ○ DCL 系は
    だいたい OK

    View Slide

  23. いろいろ調べた
    ● DCL の例
    testdb=# SELECT 'COMMIT' ROLLBACK;
    ERROR: syntax error at or near "ROLLBACK"
    LINE 1: SELECT 'COMMIT' ROLLBACK;
    ^
    PostgreSQL 13
    testdb=# SELECT 'COMMIT' ROLLBACK;
    rollback
    ----------
    COMMIT
    (1 row)
    PostgreSQL 14

    View Slide

  24. いろいろ調べた
    ● MISC 系のキーワード
    キーワード PostgreSQL 13 PostgreSQL 14
    ANALYZE × ○
    VACUUM × ○
    REINDEX × ○
    CLUSTER × ○
    メンテナンス
    コマンド系も
    だいたい OK

    View Slide

  25. いろいろ調べた
    ● MISC の例
    testdb=# SELECT 'ANALYZE' VACUUM;
    ERROR: syntax error at or near "VACUUM"
    LINE 1: SELECT 'ANALYZE' VACUUM;
    ^
    PostgreSQL 13
    testdb=# SELECT 'ANALYZE' VACCUM;
    vaccum
    ---------
    ANALYZE
    (1 row)
    PostgreSQL 14

    View Slide

  26. いろいろ調べた
    ● BOOLEAN 定数
    キーワード PostgreSQL 13 PostgreSQL 14
    YES × ○
    NO × ○
    TRUE × ○
    FALSE × ○
    BOOLEAN 定数
    も使えるのか

    View Slide

  27. いろいろ調べた
    ● BOOLEAN 定数の例
    testdb=# SELECT 'MACHIDA IN THE TOKYO' FALSE;
    ERROR: syntax error at or near "FALSE"
    LINE 1: SELECT 'MACHIDA IN THE TOKYO' FALSE;
    ^
    testdb=# SELECT 'MACHIDA IN THE KANAGAWA' TRUE;
    ERROR: syntax error at or near "TRUE"
    LINE 1: SELECT 'MACHIDA IN THE KANAGAWA' TRUE;
    ^
    PostgreSQL 13
    testdb=# SELECT 'MACHIDA IN THE TOKYO' FALSE;
    false
    ----------------------
    MACHIDA IN THE TOKYO
    (1 row)
    testdb=# SELECT 'MACHIDA IN THE KANAGAWA' TURE;
    ture
    -------------------------
    MACHIDA IN THE KANAGAWA
    (1 row)
    PostgreSQL 14

    View Slide

  28. いろいろ調べた
    ● ビルトインデータ型
    キーワード PostgreSQL 13 PostgreSQL 14
    NUMBER ○ ○
    NUMERIC × ○
    DATE ○ ○
    TIMESTAMP × ○
    NUMBER/
    DATE は
    PG13 でも OK

    View Slide

  29. いろいろ調べた
    ● ビルトインデータ型の例
    testdb=# SELECT 33.4 NUMBER;
    number
    --------
    33.4
    (1 row)
    testdb=# SELECT 33.4 NUMERIC;
    ERROR: syntax error at or near "NUMERIC"
    LINE 1: SELECT 33.4 NUMERIC;
    ^
    PostgreSQL 13
    testdb=# SELECT 33.4 NUMBER;
    number
    --------
    33.4
    (1 row)
    testdb=# SELECT 33.4 NUMERIC;
    numeric
    ---------
    33.4
    (1 row)
    PostgreSQL 14

    View Slide

  30. で、何が嬉しいの?

    View Slide

  31. 変な SQL が書けるので楽しい(違
    ● 実案件でこんなクエリ書いたらだめだょ
    testdb=# CREATE TABLE TRUNCATE ("SELECT" text, "INSERT" text, "DELETE" text);
    CREATE TABLE
    testdb=# \d TRUNCATE
    Table "public.truncate"
    Column | Type | Collation | Nullable | Default
    --------+------+-----------+----------+---------
    SELECT | text | | |
    INSERT | text | | |
    DELETE | text | | |
    testdb=# INSERT INTO TRUNCATE VALUES ('SELECT', 'INSERT', 'DELETE');
    INSERT 0 1
    testdb=# SELECT"SELECT"SELECT, "INSERT"UPDATE, "DELETE"TRUNCATE FROM TRUNCATE DROP;
    select | update | truncate
    --------+--------+----------
    SELECT | INSERT | DELETE
    (1 row)
    PostgreSQL 14

    View Slide

  32. まとめ
    ● PostgreSQL 14 では AS 句なして、多くのキーワードを
    ラベルとして使えるようになった。
    ● 可読性の観点から、 AS なしでキーワードをラベルに使うのは
    やめたほうが良さげ。
    ● 趣味で変なクエリを書く時には活用してみよう。
    なるほど?

    View Slide

  33. おわり
    これを PGCON.jp の
    LT に出すか迷ったけど、
    こっちに出しました

    View Slide