CTEs are not as-if-memoized in SQL Server either. I can't find any
standards language saying if they should or shouldn't be, which
typically indicates "anything goes".

On Sat, Jan 20, 2018 at 5:57 PM, petern <peter.nichvolo...@gmail.com> wrote:
> Exactly.  But that doesn't resolve the problem of duplicated
> non-deterministic tables in a CTE.
> CTE is the acryonym for Common TABLE Expression, not Common View
> Expression.
>
> eg:  WITH x AS (<query with non-deterministic rows>)
>        SELECT * FROM x UNION SELECT * FROM x; --Should return just x, not
> x1 UNION x2.
>
> Peter
>
> On Sat, Jan 20, 2018 at 3:17 PM, Shane Dev <devshan...@gmail.com> wrote:
>
>> The following statement executes the random() function twice -
>>
>> sqlite> select random() union all select random();
>> random()
>> 2678358683566407062
>> -5528866137931448843
>> sqlite> explain select random() union all select random();
>> addr  opcode         p1    p2    p3    p4             p5  comment
>> ----  -------------  ----  ----  ----  -------------  --  -------------
>> 0     Init           0     1     0                    00
>> 1     Function0      0     0     1     random(0)      00
>> 2     ResultRow      1     1     0                    00
>> 3     Function0      0     0     1     random(0)      00
>> 4     ResultRow      1     1     0                    00
>> 5     Halt           0     0     0                    00
>>
>> but if random() is replaced with round(1.1) -
>>
>> sqlite> select round(1.1) union all select round(1.1);
>> round(1.1)
>> 1.0
>> 1.0
>> sqlite> explain select round(1.1) union all select round(1.1);
>> addr  opcode         p1    p2    p3    p4             p5  comment
>> ----  -------------  ----  ----  ----  -------------  --  -------------
>> 0     Init           0     6     0                    00
>> 1     Copy           2     1     0                    00
>> 2     ResultRow      1     1     0                    00
>> 3     Copy           2     1     0                    00
>> 4     ResultRow      1     1     0                    00
>> 5     Halt           0     0     0                    00
>> 6     Real           0     3     0     1.1            00
>> 7     Function0      1     3     2     round(1)       01
>> 8     Goto           0     1     0                    00
>>
>> It seems to be executed once only. Does this happen because random() is
>> flagged non-deterministic?
>>
>>
>> On 19 January 2018 at 09:10, Clemens Ladisch <clem...@ladisch.de> wrote:
>>
>> > petern wrote:
>> > > WITH flips(s) AS (VALUES (random()>0), (random()>0), (random()>0))
>> > > SELECT sum(s),(SELECT sum(s) FROM flips) FROM flips;
>> > > sum(s),"(SELECT sum(s) FROM flips)"
>> > > 1,3
>> > > --Expected output is 1,1.
>> > >
>> > > Why isn't the constant notional table table [flips] materialized just
>> > once
>> > > per CTE?
>> > >
>> > > FYI.  PostgreSQL 9.6 materializes [flips] exactly once per CTE-users
>> >
>> > Its documentation says:
>> > <https://www.postgresql.org/docs/9.6/static/queries-with.html>
>> > | A useful property of WITH queries is that they are evaluated only once
>> > | per execution of the parent query, even if they are referred to more
>> > | than once by the parent query or sibling WITH queries. Thus, expensive
>> > | calculations that are needed in multiple places can be placed within
>> > | a WITH query to avoid redundant work. Another possible application is
>> > | to prevent unwanted multiple evaluations of functions with side-
>> > | effects. However, the other side of this coin is that the optimizer is
>> > | less able to push restrictions from the parent query down into a WITH
>> > | query than an ordinary subquery.
>> >
>> > This is an implementation detail of Postgres, and it is not required by
>> > the SQL specification.  SQLite chose the other side of the coin.
>> >
>> >
>> > Regards,
>> > Clemens
>> > _______________________________________________
>> > sqlite-users mailing list
>> > sqlite-users@mailinglists.sqlite.org
>> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>> >
>> _______________________________________________
>> sqlite-users mailing list
>> sqlite-users@mailinglists.sqlite.org
>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users



-- 
Cory Nelson
http://int64.org
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to