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)

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

  3. この発表から得られるもの • このレーダーチャートから察してください。 即応性 汎用性 持続性 ぬこ性 実用性 0 5

    明後日から 使えるゆるい 無駄知識
  4. 今日のお題 AS なしラベルの制限解除

  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% 減りました。 なるほど?
  6. それだけじゃわかんないよ 具体的に何が 改善されたのか 一般の利用者の 俺にはわかんないよ 90% 改善した っ・・・!! ぽすぐれの人って いつもそうですよね・・・!

    一般の利用者を なんだと思ってるんですか!?
  7. カラムラベルって?

  8. カラムラベル • PostgreSQL では(他の RDBMS でもそうだと思うけど) SELECT リストの項目に「 AS 別名」でラベルを付与できる

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

    testdb=# SELECT 1 AS foo; foo ----- 1 (1 row) testdb=# SELECT 1 foo; foo ----- 1 (1 row)
  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 の 「キーワード」をラベルに 指定するときに発生する
  11. PostgreSQL 14 で制限から外れたキーワード

  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% 減りました。 で、具体的に なにが減ったの?
  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 " という直交するキーワードのプロパティを考案して、 それをマークするという方式・・・らしい。 完全に理解した (理解していない)
  14. 制限でなくなったキーワードを探す • この改善項目の修正内容( github ) 興味がある人は ここから修正方式を 調べてみよう

  15. 制限でなくなったキーワードを探す • 一般の利用者である自分にとっては、どういうキーワードが 制限から外れたのか、そこがわかればいいのですよ。 • 構文解析周りのコードを見ればわかると予想。 – src/backend/parser/gram.y – 15532

    行にあった “ bare_label_keyword” があやしい。 bare_label_keyword: ABORT_P | ABSOLUTE_P | ACCESS | ACTION | ADD_P | ADMIN | AFTER (以下略)
  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 それっぽい
  17. いろいろ調べた • DML 系のキーワード キーワード PostgreSQL 13 PostgreSQL 14 DELETE

    × ◦ INSERT × ◦ SELECT × ◦ TRUNCATE × ◦ UPDATE × ◦ FROM × × WHERE × × ORDER × × 句を示す キーワードは 14 でも NG
  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
  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
  20. いろいろ調べた • DDL 系のキーワード キーワード PostgreSQL 13 PostgreSQL 14 CREATE

    × × ALTER × ◦ DROP × ◦ TABLE × ◦ INDEX × ◦ CREATE だけは 14 でもダメ
  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
  22. いろいろ調べた • DCL 系のキーワード キーワード PostgreSQL 13 PostgreSQL 14 BEGIN

    × ◦ COMMIT × ◦ END × ◦ SAVEPOINT × ◦ ROLLBACK × ◦ DCL 系は だいたい OK
  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
  24. いろいろ調べた • MISC 系のキーワード キーワード PostgreSQL 13 PostgreSQL 14 ANALYZE

    × ◦ VACUUM × ◦ REINDEX × ◦ CLUSTER × ◦ メンテナンス コマンド系も だいたい OK
  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
  26. いろいろ調べた • BOOLEAN 定数 キーワード PostgreSQL 13 PostgreSQL 14 YES

    × ◦ NO × ◦ TRUE × ◦ FALSE × ◦ BOOLEAN 定数 も使えるのか
  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
  28. いろいろ調べた • ビルトインデータ型 キーワード PostgreSQL 13 PostgreSQL 14 NUMBER ◦

    ◦ NUMERIC × ◦ DATE ◦ ◦ TIMESTAMP × ◦ NUMBER/ DATE は PG13 でも OK
  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
  30. で、何が嬉しいの?

  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
  32. まとめ • PostgreSQL 14 では AS 句なして、多くのキーワードを ラベルとして使えるようになった。 • 可読性の観点から、

    AS なしでキーワードをラベルに使うのは やめたほうが良さげ。 • 趣味で変なクエリを書く時には活用してみよう。 なるほど?
  33. おわり これを PGCON.jp の LT に出すか迷ったけど、 こっちに出しました