diff --git a/src/postgres_deparse.c b/src/postgres_deparse.c index 054500ed..e4cac50c 100644 --- a/src/postgres_deparse.c +++ b/src/postgres_deparse.c @@ -2267,9 +2267,11 @@ static void deparseSelectStmt(StringInfo str, SelectStmt *stmt) if (IsA(stmt->limitCount, A_Const) && castNode(A_Const, stmt->limitCount)->isnull) appendStringInfoString(str, "ALL"); - else + else if (stmt->limitOption == LIMIT_OPTION_WITH_TIES) deparseCExpr(str, stmt->limitCount); - + else + deparseExpr(str, stmt->limitCount); + appendStringInfoChar(str, ' '); if (stmt->limitOption == LIMIT_OPTION_WITH_TIES) @@ -4899,13 +4901,15 @@ static void deparseCreateFunctionStmt(StringInfo str, CreateFunctionStmt *create /* RETURN or BEGIN ... END */ if (IsA(create_function_stmt->sql_body, ReturnStmt)) + { deparseReturnStmt(str, castNode(ReturnStmt, create_function_stmt->sql_body)); + } else { appendStringInfoString(str, "BEGIN ATOMIC "); - if (linitial(create_function_stmt->sql_body) != NULL) + if (IsA(create_function_stmt->sql_body, List), linitial((List *) create_function_stmt->sql_body) != NULL) { - List *body_stmt_list = castNode(List, linitial(create_function_stmt->sql_body)); + List *body_stmt_list = castNode(List, linitial((List *) create_function_stmt->sql_body)); foreach(lc, body_stmt_list) { if (IsA(lfirst(lc), ReturnStmt)) diff --git a/test/deparse_tests.c b/test/deparse_tests.c index b94c94da..2860797d 100644 --- a/test/deparse_tests.c +++ b/test/deparse_tests.c @@ -397,6 +397,7 @@ const char* tests[] = { "CREATE PROCEDURE do_nothing() LANGUAGE sql BEGIN ATOMIC END", "CREATE PROCEDURE returns_one() LANGUAGE sql BEGIN ATOMIC RETURN 1; END", "CREATE PROCEDURE updates_and_returns_one() LANGUAGE sql BEGIN ATOMIC UPDATE tbl SET a = 1; RETURN 1; END", + "SELECT 1 FROM tbl LIMIT COALESCE($1, $2)", }; size_t testsLength = __LINE__ - 4;