Thread
Commits
-
Tighten enforcement of variable CONSTANT markings in plpgsql.
- ccd10a9bfa54 15.0 landed
-
Missing can't-assign-to-constant checks in plpgsql
Tom Lane <tgl@sss.pgh.pa.us> — 2022-04-28T21:52:09Z
I happened to notice that there are a couple of places in plpgsql that will let you assign a new value to a variable that's marked CONSTANT: * We don't complain if an output parameter in a CALL statement is constant. * We don't complain if a refcursor variable is constant, even though OPEN may assign a new value to it. The attached quick-hack patch closes both of these oversights. Perhaps the OPEN change is a little too aggressive, since if you give the refcursor variable some non-null initial value, OPEN won't change it; in that usage a CONSTANT marking could be allowed. But I really seriously doubt that anybody out there is marking such variables as constants, so I thought throwing the error at compile time was better than postponing it to runtime so we could handle that. Regardless of which way we handle that point, I'm inclined to change this only in HEAD. Probably people wouldn't thank us for making the back branches more strict. regards, tom lane PS: I didn't do it here, but I'm kind of tempted to pull out all the cursor-related tests in plpgsql.sql and move them to a new test file under src/pl/plpgsql/src/sql/. They look pretty self-contained, and I doubt they're worth keeping in the core tests.
-
Re: Missing can't-assign-to-constant checks in plpgsql
Pavel Stehule <pavel.stehule@gmail.com> — 2022-04-28T22:11:09Z
čt 28. 4. 2022 v 23:52 odesílatel Tom Lane <tgl@sss.pgh.pa.us> napsal: > I happened to notice that there are a couple of places in plpgsql > that will let you assign a new value to a variable that's marked > CONSTANT: > > * We don't complain if an output parameter in a CALL statement > is constant. > > * We don't complain if a refcursor variable is constant, even > though OPEN may assign a new value to it. > > The attached quick-hack patch closes both of these oversights. > > Perhaps the OPEN change is a little too aggressive, since if > you give the refcursor variable some non-null initial value, > OPEN won't change it; in that usage a CONSTANT marking could > be allowed. But I really seriously doubt that anybody out > there is marking such variables as constants, so I thought > throwing the error at compile time was better than postponing > it to runtime so we could handle that. > > Regardless of which way we handle that point, I'm inclined to > change this only in HEAD. Probably people wouldn't thank us > for making the back branches more strict. > +1 I can implement these checks in plpgsql_check. So possible issues can be detected and fixed on older versions by using plpgsql_check. Regards Pavel > regards, tom lane > > PS: I didn't do it here, but I'm kind of tempted to pull out > all the cursor-related tests in plpgsql.sql and move them to > a new test file under src/pl/plpgsql/src/sql/. They look > pretty self-contained, and I doubt they're worth keeping in > the core tests. > >
-
Re: Missing can't-assign-to-constant checks in plpgsql
Tom Lane <tgl@sss.pgh.pa.us> — 2022-04-30T15:57:55Z
Pavel Stehule <pavel.stehule@gmail.com> writes: > čt 28. 4. 2022 v 23:52 odesílatel Tom Lane <tgl@sss.pgh.pa.us> napsal: >> Perhaps the OPEN change is a little too aggressive, since if >> you give the refcursor variable some non-null initial value, >> OPEN won't change it; in that usage a CONSTANT marking could >> be allowed. But I really seriously doubt that anybody out >> there is marking such variables as constants, so I thought >> throwing the error at compile time was better than postponing >> it to runtime so we could handle that. >> >> Regardless of which way we handle that point, I'm inclined to >> change this only in HEAD. Probably people wouldn't thank us >> for making the back branches more strict. > +1 After sleeping on it, I got cold feet about breaking arguably legal code, so I made OPEN check at runtime instead. Which was probably a good thing anyway, because it made me notice that exec_stmt_forc() needed a check too. AFAICS there are no other places in pl_exec.c that are performing assignments to variables not checked at parse time. Pushed that way. regards, tom lane
-
Re: Missing can't-assign-to-constant checks in plpgsql
Pavel Stehule <pavel.stehule@gmail.com> — 2022-05-01T17:25:17Z
Hi >> Regardless of which way we handle that point, I'm inclined to >> change this only in HEAD. Probably people wouldn't thank us >> for making the back branches more strict. >> > > +1 > > I can implement these checks in plpgsql_check. So possible issues can be > detected and fixed on older versions by using plpgsql_check. > new related checks are implemented on plpgsql_check 2.1.4 Regards Pavel > > Regards > > Pavel > > >> regards, tom lane >> >> PS: I didn't do it here, but I'm kind of tempted to pull out >> all the cursor-related tests in plpgsql.sql and move them to >> a new test file under src/pl/plpgsql/src/sql/. They look >> pretty self-contained, and I doubt they're worth keeping in >> the core tests. >> >>