diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 0a93ec70b0c..21342e8a9d7 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -347,8 +347,17 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt) * We have three cases to deal with: DEFAULT VALUES (selectStmt == NULL), * VALUES list, or general SELECT input. We special-case VALUES, both for * efficiency and so we can handle DEFAULT specifications. + * + * The grammar allows attaching ORDER BY, LIMIT, FOR UPDATE, or WITH to a + * VALUES clause. If we have any of those, treat it as a general SELECT; + * so it will work, but you can't use DEFAULT items together with those. */ - isGeneralSelect = (selectStmt && selectStmt->valuesLists == NIL); + isGeneralSelect = (selectStmt && (selectStmt->valuesLists == NIL || + selectStmt->sortClause != NIL || + selectStmt->limitOffset != NULL || + selectStmt->limitCount != NULL || + selectStmt->lockingClause != NIL || + selectStmt->withClause != NULL)); /* * If a non-nil rangetable/namespace was passed in, and we are doing