testcontainers / testcontainers/testcontainers-java

[Bug]: Can't create procedure without breaking SQL

Abierto
#8,059 3 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

type/bug
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

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. 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

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.