Cool hack with recursive queries

Started by Gregory Starkabout 17 years ago19 messages
#1Gregory Stark
stark@enterprisedb.com

So based on Graeme Job's T-SQL hack over at thedailywtf.com I adapted the
T-SQL code to Postgres and got this. Thought others might find it amusing.

WITH RECURSIVE Z(IX, IY, CX, CY, X, Y, I) AS (
SELECT IX, IY, X::float, Y::float, X::float, Y::float, 0
FROM (select -2.2 + 0.031 * i, i from generate_series(0,101) as i) as xgen(x,ix),
(select -1.5 + 0.031 * i, i from generate_series(0,101) as i) as ygen(y,iy)
UNION ALL
SELECT IX, IY, CX, CY, X * X - Y * Y + CX AS X, Y * X * 2 + CY, I + 1
FROM Z
WHERE X * X + Y * Y < 16::float
AND I < 100
)
SELECT array_to_string(array_agg(SUBSTRING(' .,,,-----++++%%%%@@@@#### ', LEAST(GREATEST(I,1),27), 1)),'')
FROM (
SELECT IX, IY, MAX(I) AS I
FROM Z
GROUP BY IY, IX
ORDER BY IY, IX
) AS ZT
GROUP BY IY
ORDER BY IY

--
Gregory Stark
EnterpriseDB http://www.enterprisedb.com
Ask me about EnterpriseDB's Slony Replication support!

#2Grzegorz Jaskiewicz
gj@pointblue.com.pl
In reply to: Gregory Stark (#1)
Re: Cool hack with recursive queries

On 2008-11-19, at 21:53, Gregory Stark wrote:

So based on Graeme Job's T-SQL hack over at thedailywtf.com I
adapted the
T-SQL code to Postgres and got this. Thought others might find it
amusing.

hohoho, nice. That's even better than mine "with recursive" PI
generator :)

#3David Rowley
dgrowley@gmail.com
In reply to: Gregory Stark (#1)
Re: Cool hack with recursive queries

Gregory Stark wrote:

So based on Graeme Job's T-SQL hack over at thedailywtf.com I adapted the
T-SQL code to Postgres and got this. Thought others might find it amusing.

WITH RECURSIVE Z(IX, IY, CX, CY, X, Y, I) AS (
SELECT IX, IY, X::float, Y::float, X::float, Y::float, 0
FROM (select -2.2 + 0.031 * i, i from
generate_series(0,101) as i) as xgen(x,ix),
(select -1.5 + 0.031 * i, i from
generate_series(0,101) as i) as ygen(y,iy)
UNION ALL
SELECT IX, IY, CX, CY, X * X - Y * Y + CX AS X, Y * X * 2
+ CY, I + 1
FROM Z
WHERE X * X + Y * Y < 16::float
AND I < 100
)
SELECT array_to_string(array_agg(SUBSTRING(' .,,,-----++++%%%%@@@@####
', LEAST(GREATEST(I,1),27), 1)),'')
FROM (
SELECT IX, IY, MAX(I) AS I
FROM Z
GROUP BY IY, IX
ORDER BY IY, IX
) AS ZT
GROUP BY IY
ORDER BY IY

That's pretty amazing.

I think we should add a regression test with that. :)

David.

#4Tatsuo Ishii
ishii@postgresql.org
In reply to: Gregory Stark (#1)
Re: Cool hack with recursive queries

So based on Graeme Job's T-SQL hack over at thedailywtf.com I adapted the
T-SQL code to Postgres and got this. Thought others might find it amusing.

WITH RECURSIVE Z(IX, IY, CX, CY, X, Y, I) AS (
SELECT IX, IY, X::float, Y::float, X::float, Y::float, 0
FROM (select -2.2 + 0.031 * i, i from generate_series(0,101) as i) as xgen(x,ix),
(select -1.5 + 0.031 * i, i from generate_series(0,101) as i) as ygen(y,iy)
UNION ALL
SELECT IX, IY, CX, CY, X * X - Y * Y + CX AS X, Y * X * 2 + CY, I + 1
FROM Z
WHERE X * X + Y * Y < 16::float
AND I < 100
)
SELECT array_to_string(array_agg(SUBSTRING(' .,,,-----++++%%%%@@@@#### ', LEAST(GREATEST(I,1),27), 1)),'')
FROM (
SELECT IX, IY, MAX(I) AS I
FROM Z
GROUP BY IY, IX
ORDER BY IY, IX
) AS ZT
GROUP BY IY
ORDER BY IY

Is it a Mandelbrot? How nice!
--
Tatsuo Ishii
SRA OSS, Inc. Japan

#5Harald Armin Massa
haraldarminmassa@gmail.com
In reply to: Gregory Stark (#1)
Re: Cool hack with recursive queries

1st) it turns out PostgreSQL allows code that is more compact than
MSQL: 19 lines instead of 46 lines
2nd) now there will be a really compelling reason for DBAs worldwide
to upgrade to 8.4; after release everyone without Mandelbrot in SQL is
just a lame noob
3rd) maybe THAT could be the final straw to argue against MySQL: "But
it cannot do Mandelbrot, so it is not l33t" It's easier then to argue
ACID and stuff.

--
GHUM Harald Massa
persuadere et programmare
Harald Armin Massa
Spielberger Straße 49
70435 Stuttgart
0173/9409607
no fx, no carrier pigeon
-
EuroPython 2009 will take place in Birmingham - Stay tuned!

#6David Fetter
david@fetter.org
In reply to: David Rowley (#3)
Re: Cool hack with recursive queries

On Wed, Nov 19, 2008 at 10:21:06PM -0000, David Rowley wrote:

Gregory Stark wrote:

So based on Graeme Job's T-SQL hack over at thedailywtf.com I adapted the
T-SQL code to Postgres and got this. Thought others might find it amusing.

That's pretty amazing.

I think we should add a regression test with that. :)

+1 for adding a regression test :)

Cheers,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david.fetter@gmail.com

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

#7Alvaro Herrera
alvherre@commandprompt.com
In reply to: David Fetter (#6)
Re: Cool hack with recursive queries

David Fetter escribi�:

On Wed, Nov 19, 2008 at 10:21:06PM -0000, David Rowley wrote:

Gregory Stark wrote:

So based on Graeme Job's T-SQL hack over at thedailywtf.com I adapted the
T-SQL code to Postgres and got this. Thought others might find it amusing.

That's pretty amazing.

I think we should add a regression test with that. :)

+1 for adding a regression test :)

It's too slow for that :-(

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

#8Zdenek Kotala
Zdenek.Kotala@Sun.COM
In reply to: Alvaro Herrera (#7)
Re: Cool hack with recursive queries

Alvaro Herrera napsal(a):

David Fetter escribi�:

On Wed, Nov 19, 2008 at 10:21:06PM -0000, David Rowley wrote:

Gregory Stark wrote:

So based on Graeme Job's T-SQL hack over at thedailywtf.com I adapted the
T-SQL code to Postgres and got this. Thought others might find it amusing.

That's pretty amazing.

I think we should add a regression test with that. :)

+1 for adding a regression test :)

It's too slow for that :-(

I takes 2.6 second on my laptop. I think it is not so bad.

Zdenek

#9Merlin Moncure
mmoncure@gmail.com
In reply to: Zdenek Kotala (#8)
Re: Cool hack with recursive queries

On Fri, Nov 21, 2008 at 3:06 PM, Zdenek Kotala <Zdenek.Kotala@sun.com> wrote:

I takes 2.6 second on my laptop. I think it is not so bad.

Time: 694.512 ms

:-)

merlin

#10David Fetter
david@fetter.org
In reply to: Zdenek Kotala (#8)
Re: Cool hack with recursive queries

On Fri, Nov 21, 2008 at 09:06:13PM +0100, Zdenek Kotala wrote:

Alvaro Herrera napsal(a):

David Fetter escribi�:

On Wed, Nov 19, 2008 at 10:21:06PM -0000, David Rowley wrote:

Gregory Stark wrote:

So based on Graeme Job's T-SQL hack over at thedailywtf.com I
adapted the T-SQL code to Postgres and got this. Thought others
might find it amusing.

That's pretty amazing.

I think we should add a regression test with that. :)

+1 for adding a regression test :)

It's too slow for that :-(

I takes 2.6 second on my laptop. I think it is not so bad.

About 2.0 on my OS/X laptop. Could this be a problem on whatever
architecture/OS/compiler combo you have?

Cheers,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david.fetter@gmail.com

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

#11Tom Lane
tgl@sss.pgh.pa.us
In reply to: David Fetter (#10)
Re: Cool hack with recursive queries

David Fetter <david@fetter.org> writes:

On Fri, Nov 21, 2008 at 09:06:13PM +0100, Zdenek Kotala wrote:

I takes 2.6 second on my laptop. I think it is not so bad.

About 2.0 on my OS/X laptop. Could this be a problem on whatever
architecture/OS/compiler combo you have?

Not everyone is using fast new laptops.

This is a cool hack, agreed, but that doesn't make it a useful
regression test. Whatever value it might have isn't going to
repay the community-wide expenditure of cycles.

regards, tom lane

#12David Fetter
david@fetter.org
In reply to: Tom Lane (#11)
Re: Cool hack with recursive queries

On Fri, Nov 21, 2008 at 04:11:11PM -0500, Tom Lane wrote:

David Fetter <david@fetter.org> writes:

On Fri, Nov 21, 2008 at 09:06:13PM +0100, Zdenek Kotala wrote:

I takes 2.6 second on my laptop. I think it is not so bad.

About 2.0 on my OS/X laptop. Could this be a problem on whatever
architecture/OS/compiler combo you have?

Not everyone is using fast new laptops.

Possibly not, but this could be a way to flush out inconsistencies
among floating point units or, more importantly, implementations of
NUMERIC.

This is a cool hack, agreed, but that doesn't make it a useful
regression test. Whatever value it might have isn't going to repay
the community-wide expenditure of cycles.

What's the slowest it runs?

Cheers,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david.fetter@gmail.com

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

#13Alvaro Herrera
alvherre@commandprompt.com
In reply to: David Fetter (#12)
Re: Cool hack with recursive queries

David Fetter escribi�:

On Fri, Nov 21, 2008 at 04:11:11PM -0500, Tom Lane wrote:

This is a cool hack, agreed, but that doesn't make it a useful
regression test. Whatever value it might have isn't going to repay
the community-wide expenditure of cycles.

What's the slowest it runs?

If we want to do some advocacy with it, how about making some banners?
Posters? Flyers?

Or go blog about it.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

#14Bruce Momjian
bruce@momjian.us
In reply to: Alvaro Herrera (#13)
Re: Cool hack with recursive queries

Alvaro Herrera wrote:

David Fetter escribi?:

On Fri, Nov 21, 2008 at 04:11:11PM -0500, Tom Lane wrote:

This is a cool hack, agreed, but that doesn't make it a useful
regression test. Whatever value it might have isn't going to repay
the community-wide expenditure of cycles.

What's the slowest it runs?

If we want to do some advocacy with it, how about making some banners?
Posters? Flyers?

Or go blog about it.

Agreed, there is great PR advantage to this, like us running on a PS2.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ If your life is a hard drive, Christ can be your backup. +

#15Stefan Kaltenbrunner
stefan@kaltenbrunner.cc
In reply to: Tom Lane (#11)
Re: Cool hack with recursive queries

Tom Lane wrote:

David Fetter <david@fetter.org> writes:

On Fri, Nov 21, 2008 at 09:06:13PM +0100, Zdenek Kotala wrote:

I takes 2.6 second on my laptop. I think it is not so bad.

About 2.0 on my OS/X laptop. Could this be a problem on whatever
architecture/OS/compiler combo you have?

Not everyone is using fast new laptops.

This is a cool hack, agreed, but that doesn't make it a useful
regression test. Whatever value it might have isn't going to
repay the community-wide expenditure of cycles.

FWIW:

Time: 46719.632 ms

on my ARM based buildfarm box ...

Stefan

#16David Fetter
david@fetter.org
In reply to: Bruce Momjian (#14)
Re: Cool hack with recursive queries

On Fri, Nov 21, 2008 at 04:33:16PM -0500, Bruce Momjian wrote:

Alvaro Herrera wrote:

David Fetter escribi?:

On Fri, Nov 21, 2008 at 04:11:11PM -0500, Tom Lane wrote:

This is a cool hack, agreed, but that doesn't make it a useful
regression test. Whatever value it might have isn't going to repay
the community-wide expenditure of cycles.

What's the slowest it runs?

If we want to do some advocacy with it, how about making some banners?
Posters? Flyers?

Or go blog about it.

Agreed, there is great PR advantage to this, like us running on a PS2.

I think our ability to make a return map is way cooler than our
running on a PS2, but that's just me ;)

Anyhow, I put it in my 8.4 talk, which I gave today at the first
annual PGDay Argentina :)

Cheers,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david.fetter@gmail.com

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

#17Alvaro Herrera
alvherre@commandprompt.com
In reply to: Gregory Stark (#1)
Re: Cool hack with recursive queries

Gregory Stark wrote:

WITH RECURSIVE Z(IX, IY, CX, CY, X, Y, I) AS (
SELECT IX, IY, X::float, Y::float, X::float, Y::float, 0
FROM (select -2.2 + 0.031 * i, i from generate_series(0,101) as i) as xgen(x,ix),
(select -1.5 + 0.031 * i, i from generate_series(0,101) as i) as ygen(y,iy)
UNION ALL
SELECT IX, IY, CX, CY, X * X - Y * Y + CX AS X, Y * X * 2 + CY, I + 1
FROM Z
WHERE X * X + Y * Y < 16::float
AND I < 100
)
SELECT array_to_string(array_agg(SUBSTRING(' .,,,-----++++%%%%@@@@#### ', LEAST(GREATEST(I,1),27), 1)),'')
FROM (
SELECT IX, IY, MAX(I) AS I
FROM Z
GROUP BY IY, IX
ORDER BY IY, IX
) AS ZT
GROUP BY IY
ORDER BY IY

FWIW you can halve the running time by restricting I to 27 instead of
100 in the recursive term, and obtain the same result.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

#18David Fetter
david@fetter.org
In reply to: Alvaro Herrera (#17)
Re: Cool hack with recursive queries

On Sun, Nov 23, 2008 at 12:34:21AM -0300, Alvaro Herrera wrote:

Gregory Stark wrote:

WITH RECURSIVE Z(IX, IY, CX, CY, X, Y, I) AS (
[elided]

FWIW you can halve the running time by restricting I to 27 instead of
100 in the recursive term, and obtain the same result.

I found it easier to read this way:

WITH RECURSIVE
Z(Ix, Iy, Cx, Cy, X, Y, I)
AS (
SELECT Ix, Iy, X::float, Y::float, X::float, Y::float, 0
FROM
(SELECT -2.2 + 0.031 * i, i FROM generate_series(0,101) AS i) AS xgen(x,ix)
CROSS JOIN
(SELECT -1.5 + 0.031 * i, i FROM generate_series(0,101) AS i) AS ygen(y,iy)
UNION ALL
SELECT Ix, Iy, Cx, Cy, X * X - Y * Y + Cx AS X, Y * X * 2 + Cy, I + 1
FROM Z
WHERE X * X + Y * Y < 16::float
AND I < 27
),
Zt (Ix, Iy, I) AS (
SELECT Ix, Iy, MAX(I) AS I
FROM Z
GROUP BY Iy, Ix
ORDER BY Iy, Ix
)
SELECT array_to_string(
array_agg(
SUBSTRING(' .,,,-----++++%%%%@@@@#### ', LEAST(GREATEST(I,1),27), 1)
),''
)
FROM Zt
GROUP BY Iy
ORDER BY Iy;

Cheers,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david.fetter@gmail.com

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

#19David Fetter
david@fetter.org
In reply to: David Fetter (#18)
Re: Cool hack with recursive queries

On Sun, Nov 23, 2008 at 11:49:31AM -0800, David Fetter wrote:

On Sun, Nov 23, 2008 at 12:34:21AM -0300, Alvaro Herrera wrote:

Gregory Stark wrote:

WITH RECURSIVE Z(IX, IY, CX, CY, X, Y, I) AS (
[elided]

FWIW you can halve the running time by restricting I to 27 instead of
100 in the recursive term, and obtain the same result.

I found it easier to read this way:

WITH RECURSIVE
Z(Ix, Iy, Cx, Cy, X, Y, I)

With the I < 27 in the first part, the second part doesn't need a
LEAST, so it now reads:

WITH RECURSIVE
Z(Ix, Iy, Cx, Cy, X, Y, I)
AS (
SELECT Ix, Iy, X::float, Y::float, X::float, Y::float, 0
FROM
(SELECT -2.2 + 0.031 * i, i FROM generate_series(0,101) AS i) AS xgen(x,ix)
CROSS JOIN
(SELECT -1.5 + 0.031 * i, i FROM generate_series(0,101) AS i) AS ygen(y,iy)
UNION ALL
SELECT Ix, Iy, Cx, Cy, X * X - Y * Y + Cx AS X, Y * X * 2 + Cy, I + 1
FROM Z
WHERE X * X + Y * Y < 16::float
AND I < 27
),
Zt (Ix, Iy, I) AS (
SELECT Ix, Iy, MAX(I) AS I
FROM Z
GROUP BY Iy, Ix
ORDER BY Iy, Ix
)
SELECT array_to_string(
array_agg(
SUBSTRING(' .,,,-----++++%%%%@@@@#### ', GREATEST(I,1), 1)
),''
)
FROM Zt
GROUP BY Iy
ORDER BY Iy;

That cuts it to 786ms or so on my laptop :)

Cheers,
David.
--
David Fetter <david@fetter.org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david.fetter@gmail.com

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate