Skip to content

The EXECUTE STATEMENT preparser does not know about the CALL statement #7825

Open
@sim1984

Description

@sim1984

Firebird 6.0 added the ability to call stored procedures using a CALL statement.

However, the EXECUTE STATEMENT preparser is not aware of the CALL statement and therefore cannot work with named parameters.

SET TERM ^;

CREATE PROCEDURE SP_CALL_TEST(
  IN_A INT, 
  IN_B INT
) RETURNS (
  OUT_C INT,
  OUT_D INT
)
AS
BEGIN
  OUT_C = IN_A + IN_B;
  OUT_D = IN_A + 1;
END
^

EXECUTE BLOCK
RETURNS (
  OUT_C INT,
  OUT_D INT
)
AS
  DECLARE IN_A INT = 1;
  DECLARE IN_B INT = 2;
BEGIN
  -- OK
  EXECUTE STATEMENT ('EXECUTE PROCEDURE SP_CALL_TEST(?, ?)')
  (:IN_A, :IN_B)
  INTO OUT_C, OUT_D;

  SUSPEND;

  -- OK
  CALL SP_CALL_TEST(:IN_A, :IN_B, :OUT_C, :OUT_D);
  SUSPEND;

  -- OK
  EXECUTE STATEMENT ('CALL SP_CALL_TEST(?, ?, ?, ?)')
  (:IN_A, :IN_B)
  INTO OUT_C, OUT_D;

  SUSPEND;

  -- OK
  EXECUTE STATEMENT ('CALL SP_CALL_TEST(IN_A => ?, IN_B => ?, OUT_C => ?, OUT_D => ?)')
  (:IN_A, :IN_B)
  INTO OUT_C, OUT_D;

  SUSPEND;

  -- OK
  EXECUTE STATEMENT ('EXECUTE PROCEDURE SP_CALL_TEST(:IN_A, :IN_B)')
  (IN_A := :IN_A, IN_B := :IN_B)
  INTO OUT_C, OUT_D;

  SUSPEND;

  -- OK
  EXECUTE PROCEDURE SP_CALL_TEST(IN_A => :IN_A, IN_B => :IN_B)
  RETURNING_VALUES OUT_C, OUT_D;
  SUSPEND;

  -- OK
  EXECUTE STATEMENT ('EXECUTE PROCEDURE SP_CALL_TEST(IN_A => :IN_A, IN_B => :IN_B)')
  (IN_A := :IN_A, IN_B := :IN_B)
  INTO OUT_C, OUT_D;

  SUSPEND;

  -- OK
  CALL SP_CALL_TEST(IN_A => :IN_A, IN_B => :IN_B, OUT_C => :OUT_C, OUT_D => :OUT_D);
  SUSPEND;


  -- Error. The execute statement preparser does not know about the CALL statement,
  -- and therefore cannot work with named parameters.
/*
  EXECUTE STATEMENT ('CALL SP_CALL_TEST(:IN_A, :IN_B, ?, ?)')
  (IN_A := 1, IN_B := 2)
  INTO OUT_C, OUT_D;

  SUSPEND;

  EXECUTE STATEMENT ('CALL SP_CALL_TEST(IN_A => :IN_A, IN_B => :IN_B, OUT_C => ?, OUT_D => ?)')
  (IN_A := 1, IN_B := 2)
  INTO OUT_C, OUT_D;

  SUSPEND;
*/
END
^

SET TERM ;^

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions