I can’t seem to be able to create migration with simplest sql to create PostgreSQL procedure.
Error is:
Exception data:
Severity: ERROR
SqlState: 42601
MessageText: syntax error at end of input
Position: 186
File: scan.l
Line: 1184
Routine: scanner_yyerror
Sql code works fine when executed in pgAdmin.
protected override void Up(MigrationBuilder migrationBuilder)
{
var sp = @"CREATE PROCEDURE reset_primary_holder()
LANGUAGE SQL
BEGIN ATOMIC
SELECT * FROM id.users;
END;";
migrationBuilder.Sql(sp);
}
What am I doing wrong?
2
Answers
In the end only viable solution was to to use different syntax:
This syntax is not mentioned in documentation on stored procedures and since this is my first PG procedure / function it was not immediately obvious to me that there is alternative.
Thanks @Shay for pointing me in the right direction.
Npgsql (the ADO.NET driver, not the EF provider) by default parses SQL to find semicolons and rewrite statements, and the new PostgreSQL syntax breaks that parser; see https://github.com/npgsql/npgsql/issues/4445.
The general recommended fix is to add the following to the start of your program:
This disables statement parsing/rewriting altogether; it means you need to use positional parameter placeholders (
$1
,$2
instead of@p1
,@p2
) – see the docs.However, EF is unfortunately not yet compatible with this mode, so you’ll have to make do without this syntax…