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

pgunconf27-PG14-fix-fewer-restricted-keywords-p...

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. とある 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% 減りました。 なるほど?
  2. 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 の 「キーワード」をラベルに 指定するときに発生する
  3. とある 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% 減りました。 で、具体的に なにが減ったの?
  4. 制限でなくなったキーワードを探す • 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 " という直交するキーワードのプロパティを考案して、 それをマークするという方式・・・らしい。 完全に理解した (理解していない)
  5. 制限でなくなったキーワードを探す • “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 それっぽい
  6. いろいろ調べた • DML 系のキーワード キーワード PostgreSQL 13 PostgreSQL 14 DELETE

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

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

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

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

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

    ◦ NUMERIC × ◦ DATE ◦ ◦ TIMESTAMP × ◦ NUMBER/ DATE は PG13 でも OK
  18. いろいろ調べた • ビルトインデータ型の例 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
  19. 変な 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
  20. まとめ • PostgreSQL 14 では AS 句なして、多くのキーワードを ラベルとして使えるようになった。 • 可読性の観点から、

    AS なしでキーワードをラベルに使うのは やめたほうが良さげ。 • 趣味で変なクエリを書く時には活用してみよう。 なるほど?