Thread: 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 -- Gregory Stark EnterpriseDB http://www.enterprisedb.com Ask me about EnterpriseDB's Slony Replication support!
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 :)
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.
> 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
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!
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
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
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
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
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
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
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
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.
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. +
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
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
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.
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
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