Achilleas Mantzios <a.mantzios@xxxxxxxxxxxxxxxxxxxx> writes: > Στις 16/11/24 12:55, ο/η Max Ulidtko έγραψε: >> The issue I'm hitting with it is exemplified by server logs like this: >> >> 2024-11-16 10:28:19.928 UTC [46] LOG: execute <unnamed>: CREATE VIEW >> public.foobar (alg, hash) AS VALUES ('md5', $1); >> 2024-11-16 10:28:19.928 UTC [46] DETAIL: parameters: $1 = >> 'test-param-value' >> 2024-11-16 10:28:19.928 UTC [46] ERROR: there is no parameter $1 at >> character 57 > At least for SQL level prepared statements the statement has to be one of : > |SELECT|, |INSERT|, |UPDATE|, |DELETE|, |MERGE|, or |VALUES| > |so CREATE is not valid, and I guess the extended protocol prepared > statements aint no different in this regard. Indeed. To some extent this is an implementation limitation: the parameter is received (and printed if you have logging enabled), but it's not passed down to utility statements such as CREATE VIEW. But the reason nobody's been in a hurry to lift that restriction is that doing so would open a large can of semantic worms. In a case like CREATE VIEW, exactly what is this statement supposed to mean? I assume you were hoping that it would result in replacement of the Param by a Const representing the CREATE-time value of the parameter, but why is that a sane definition? It's certainly not what a Param normally does. On the other hand, if CREATE VIEW stores the Param as a Param (which is what I think would happen if we just extended the parameter-passing plumbing), that's unlikely to lead to a good outcome either. There might not be any $1 available when the view is used, and if there is one it's not necessarily of the right data type. So, pending some defensible design for what should happen and a patch implementing that, we've just left it at the status quo, which is that Params are only available to the DML statements Achilleas mentioned. regards, tom lane