[pgpool-general-jp: 1272] Re: ダブルクオーテーションで囲われているテーブルに対するクエリキャッシュが効きません

Yugo Nagata nagata @ sraoss.co.jp
2014年 4月 24日 (木) 20:25:35 JST


西澤さん

長田です。ご報告ありがとうございます。

On Thu, 24 Apr 2014 11:57:38 +0900
(株)電算 西澤 晃一 <n2316 @ ndensan.co.jp> wrote:

> お世話になります。西澤と申します。
> ダブルクオーテーションで囲われているテーブルに対するクエリキャッシュが効きません。
> 
> postgresql 9.3.4
> pgpool II 3.3.2
> を使っています。
> 
> 下記のようにダブルクオーテーションをテーブルにつけて利用しています。
> CREATE TABLE someschema."PiyoTab" (
> "hogeCol1" integer,
> "hogeCol2" text
> );
> 
> このようなテーブルの場合、クエリキャッシュが効きません。
> pgpoolのログを見ると、下記のようにダブルクオーテーションがtrimされたクエリが発行されています。
> 
> 2014-04-23 17:33:02 LOG:   pid 21974: DB node id: 0 backend pid: 9217 statement: SELECT count(*) FROM pg_catalog.pg_class AS c WHERE c.oid = pgpool_regclass('someschema.PiyoTab') AND c.relpersistence = 'u'

「クエリキャッシュが効かない」という現象が正確にはどのような挙動かはわかりませんが、
こちらの環境で  テーブル名がダブルクォートされている場合に、このテーブルを更新しても
キャッシュが無効化されない、という現象を確認しました。

=# INSERT INTO "Hoge" VALUES (10)
INSERT 0 1
=# SELECT * FROM "Hoge"
 i
----
 10
(1 row)
=# INSERT INTO "Hoge" VALUES (20)
INSERT 0 1
=# SELECT * FROM "Hoge"
 i
----
 10

原因は恐らくご指摘の通りダブルクォートが trim されているためだと思われます。

# pgpool_regclass('sc."HHHH"') では正しい OID が返るが、
# pgpool_regclass('sc.HHHH')では 0(無効な Oid を意味する)が返る。

> 
> ダブルクオーテーションをtrimする特別な理由があるのでしょうか。
> pgpool_regclass('someschema.PiyoTab') の部分が
> pgpool_regclass('someschema."PiyoTab"') となるのが望ましいです。
> 下記のようにtrimをかけていると思しき箇所を修正してみましたが挙動は変わりませんでした。

以下は insert lock に関わる部分ですが、今回のクォーテーション除去処理は
pool_relcache.c の pool_search_relcache() で行われています。

私の方で解析と修正を行い、問題ないようでしたらこの ML にパッチを投稿します。

> 
> $ diff pool_process_query.c pool_process_query.c.original
> 3071c3071
> < /* if (*p != '"') */
> ---
> > if (*p != '"')
> 
> 
> /* --------------------------------------------
>   (株)電算  西澤 晃一(にしざわ こういち)
>  -------------------------------------------- */
> 
> _______________________________________________
> pgpool-general-jp mailing list
> pgpool-general-jp @ sraoss.jp
> http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp


-- 
Yugo Nagata <nagata @ sraoss.co.jp>


pgpool-general-jp メーリングリストの案内