From: | Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com> |
---|---|
To: | Joel Jacobson <joel(at)compiler(dot)org> |
Cc: | Bruce Momjian <bruce(at)momjian(dot)us>, "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
Subject: | Re: set_config() documentation clarification |
Date: | 2021-01-06 18:39:42 |
Message-ID: | CAFj8pRDoAQVeyWLXQ1krdq-1yq1uXgbrfQRNnkEJ9WL38Z=gbw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
>
>
>
>> SET
>> g = year % 19,
>> c = year / 100,
>> h = (c - c/4 - (8*c + 13)/25 + 19*g + 15) % 30,
>> i = h - (h/28)*(1 - (h/28)*(29/(h + 1))*((21 - g)/11)),
>> j = year + year/4 + i + 2 - c + c/4) % 7,
>> p = i - j,
>> easter_month = 3 + (p + 26)/30,
>> easter_day = 1 + (p + 27 + (p + 6)/40) % 31
>> SELECT make_date(year, easter_month, easter_day)
>>
>> or maybe even WITH like this:
>>
>> WITH
>> year % 19 AS g ,
>> year / 100 AS c,
>> (c - c/4 - (8*c + 13)/25 + 19*g + 15) % 30 AS h,
>> h - (h/28)*(1 - (h/28)*(29/(h + 1))*((21 - g)/11)) AS i,
>> year + year/4 + i + 2 - c + c/4) % 7 AS j,
>> i - j AS p,
>> 3 + (p + 26)/30 AS easter_month,
>> 1 + (p + 27 + (p + 6)/40) % 31 AS easter_day
>> SELECT make_date(year, easter_month, easter_day)
>>
>
> I do not think this clause is necessary (because we have PLpgSQL or C),
> but other people can have different opinions (and it is true, so this
> feature can have some performance benefit - because it enhances the
> possibilities of inlined expressions and custom (own) extensions are
> prohibited in cloud environments (and will be) ). Theoretically the
> implementation of this feature should not be hard, because these variables
> are very local only (the scope is just row), so this is just a game for
> parser and for expression's interpreter. But if you introduce this feature,
> then it is better to use syntax that is used by some other well known
> systems (Oracle or others).
>
The name for this feature can be "row scope variables" and yes, in OLAP
queries there are repeated expressions where this feature can be useful.
postgres=# explain verbose select make_date(year, easter_month,
easter_day) from (select year, 3 + (p + 26)/30 AS easter_month, 1 + (p +
27 + (p + 6)/40) % 31 AS easter_day from ( select year, i - j AS p from
(select year, i, (year + year/4 + i + 2 - c + c/4) % 7 AS j from (select
year, c, h - (h/28)*(1 - (h/28)*(29/(h + 1))*((21 - g)/11)) AS i from
(select year, g, c, (c - c/4 - (8*c + 13)/25 + 19*g + 15) % 30 AS h from
(select year, year % 19 as g, year / 100 as c from
generate_series(2019,2020) g(year) offset 0) s1 offset 0) s2 offset 0) s3
offset 0) s4 offset 0) s5 offset 0) s6;
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ QUERY
PLAN │
╞═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
│ Subquery Scan on s6 (cost=0.00..0.35 rows=2 width=4)
│
│ Output: make_date(s6.year, s6.easter_month, s6.easter_day)
│
│ -> Subquery Scan on s5 (cost=0.00..0.33 rows=2 width=12)
│
│ Output: s5.year, (3 + ((s5.p + 26) / 30)), (1 + (((s5.p + 27) +
((s5.p + 6) / 40)) % 31)) │
│ -> Subquery Scan on s4 (cost=0.00..0.26 rows=2 width=8)
│
│ Output: s4.year, (s4.i - s4.j)
│
│ -> Subquery Scan on s3 (cost=0.00..0.24 rows=2 width=12)
│
│ Output: s3.year, s3.i, ((((((s3.year + (s3.year / 4))
+ s3.i) + 2) - s3.c) + (s3.c / 4)) % 7) │
│ -> Subquery Scan on s2 (cost=0.00..0.18 rows=2
width=12) │
│ Output: s2.year, s2.c, (s2.h - ((s2.h / 28) *
(1 - (((s2.h / 28) * (29 / (s2.h + 1))) * ((21 - s2.g) / 11))))) │
│ -> Subquery Scan on s1 (cost=0.00..0.10
rows=2 width=16) │
│ Output: s1.year, s1.g, s1.c, (((((s1.c -
(s1.c / 4)) - (((8 * s1.c) + 13) / 25)) + (19 * s1.g)) + 15) % 30) │
│ -> Function Scan on
pg_catalog.generate_series g (cost=0.00..0.03 rows=2 width=12)
│
│ Output: g.year, (g.year % 19),
(g.year / 100) │
│ Function Call:
generate_series(2019, 2020)
│
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
(15 rows)
Pavel
From | Date | Subject | |
---|---|---|---|
Next Message | Andres Freund | 2021-01-06 18:56:27 | Re: data_checksums enabled by default (was: Move --data-checksums to common options in initdb --help) |
Previous Message | Michael Banck | 2021-01-06 18:27:44 | Re: data_checksums enabled by default (was: Move --data-checksums to common options in initdb --help) |