I am sending new update. The code is less ugly, and the current functionality is +/- final for first stage. It should be good enough for playing and testing this concept.
What is supported:
1. scalar, composite and array variables
2. composite can be defined on place or some composite type can be used
3. variable, or any field of variable, can have defined default value
4. variable is database object - the access rights are required
5. the values are stored in binary form with defined typmod
An usage is very simple: postgres=# create variable foo as numeric default 0; CREATE VARIABLE postgres=# select foo; ┌─────┐ │ foo │ ╞═════╡ │ 0 │ └─────┘ (1 row)
postgres=# let foo = pi(); LET postgres=# select foo; ┌──────────────────┐ │ foo │ ╞══════════════════╡ │ 3.14159265358979 │ └──────────────────┘ (1 row)
postgres=# create variable boo as (x numeric default 0, y numeric default 0); CREATE VARIABLE postgres=# let boo.x = 100; LET postgres=# select boo; ┌─────────┐ │ boo │ ╞═════════╡ │ (100,0) │ └─────────┘ (1 row)