testcontainers / testcontainers/testcontainers-java
[Bug]: Can't create procedure without breaking SQL
オープン
まだ誰も着手していません。
type/bug
- 主要言語
- Java
- スター
- 8.7k
- フォーク
- 1.9k
- 平均マージ
- 2日 17時間
- マージ済み PR(30日)
- 9
説明
Module
PostgreSQL
Testcontainers version
postgres:15.3
Using the latest Testcontainers version?
Yes
Host OS
Windows
Host Arch
x86
Docker version
Server: Docker Desktop 4.26.1 (131620)
Engine:
Version: 24.0.7
API version: 1.43 (minimum version 1.12)
Go version: go1.20.10
Git commit: 311b9ff
Built: Thu Oct 26 09:08:02 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.25
GitCommit: d8f198a4ed8892c764191ef7b3b06d8a2eeb5c7f
runc:
Version: 1.1.10
GitCommit: v1.1.10-0-g18a0cb0
docker-init:
Version: 0.19.0
GitCommit: de40ad0
What happened?
I'm trying to create a procedure with following script
CREATE OR REPLACE PROCEDURE get_user(
OUT user_ref refcursor,
IN ID numeric)
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
OPEN user_ref FOR
SELECT username, create_date
FROM users
WHERE id = ID
ORDER BY modified_dttm;
END;
$BODY$;
And i'm getting next error
Caused by: org.postgresql.util.PSQLException: Unterminated dollar quote started at position 99 in SQL CREATE OR REPLACE PROCEDURE get_user( OUT user_ref refcursor, IN ID numeric) LANGUAGE 'plpgsql' AS $BODY$ BEGIN
OPEN user_ref FOR
SELECT username, create_date
FROM users
WHERE id = ID
ORDER BY modified_dttm;
END. Expected terminating $$
It can be solved by removing semicolon after END. After this it works, but only if I try to create one procedure in a row.
CREATE OR REPLACE PROCEDURE get_user(
OUT user_ref refcursor,
IN ID numeric)
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
OPEN user_ref FOR
SELECT username, create_date
FROM users
WHERE id = ID
ORDER BY modified_dttm;
END
$BODY$;
But if there two such procedures in a row they wont work. Problem is related with how ScriptUtils parse initial script into transactions.
Relevant log output
Caused by: org.postgresql.util.PSQLException: Unterminated dollar quote started at position 99 in SQL CREATE OR REPLACE PROCEDURE get_user( OUT user_ref refcursor, IN ID numeric) LANGUAGE 'plpgsql' AS $BODY$ BEGIN
OPEN user_ref FOR
SELECT username, create_date
FROM users
WHERE id = ID
ORDER BY modified_dttm;
END. Expected terminating $$
Additional Information
No response
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
レポートで初期スクリプトをトランザクションに解析するコンポーネントとして特定されている ScriptUtils から始めます。提供された PostgreSQL の procedure スクリプトを、まず 1 つの procedure、次に 2 つの procedure で再現し、END; の後のセミコロンも含めます。両方のスクリプトが unterminated-dollar-quote エラーなしで実行されれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- java, postgresql
- 領域
- databases
- issue の種類
- バグ
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100