testcontainers / testcontainers/testcontainers-java
[Bug]: Can't create procedure without breaking SQL
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Java
- Estrellas
- 8.7k
- Forks
- 1.9k
- Merge medio
- 2 d 17 h
- PR fusionados (30 d)
- 9
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Empieza con ScriptUtils, que el informe identifica como el componente que analiza el script inicial en transacciones. Reproduce el script de procedimiento de PostgreSQL proporcionado primero con un procedimiento y después con dos procedimientos, incluido el punto y coma después de END; se considera terminado cuando ambos scripts se ejecutan sin errores de comillas de dólar sin terminar.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- java, postgresql
- Área
- databases
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100