Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

とある 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% 減りました。 なるほど?

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

カラムラベルって?

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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 の 「キーワード」をラベルに 指定するときに発生する

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

とある 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% 減りました。 で、具体的に なにが減ったの?

Slide 13

Slide 13 text

制限でなくなったキーワードを探す ● 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 " という直交するキーワードのプロパティを考案して、 それをマークするという方式・・・らしい。 完全に理解した (理解していない)

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

制限でなくなったキーワードを探す ● “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 それっぽい

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

いろいろ調べた ● 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

Slide 19

Slide 19 text

いろいろ調べた ● 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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

いろいろ調べた ● 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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

いろいろ調べた ● 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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

いろいろ調べた ● 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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

いろいろ調べた ● 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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

いろいろ調べた ● ビルトインデータ型の例 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

Slide 30

Slide 30 text

で、何が嬉しいの?

Slide 31

Slide 31 text

変な 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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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