diff options
-rw-r--r-- | doc/TODO.detail/alpha | 317 | ||||
-rw-r--r-- | doc/TODO.detail/default | 59 | ||||
-rw-r--r-- | doc/TODO.detail/distinct | 483 | ||||
-rw-r--r-- | doc/TODO.detail/flock | 351 | ||||
-rw-r--r-- | doc/TODO.detail/fsync | 69 | ||||
-rw-r--r-- | doc/TODO.detail/function | 616 | ||||
-rw-r--r-- | doc/TODO.detail/limit | 5708 | ||||
-rw-r--r-- | doc/TODO.detail/null | 119 | ||||
-rw-r--r-- | doc/TODO.detail/pg_shadow | 55 | ||||
-rw-r--r-- | doc/TODO.detail/primary | 805 |
10 files changed, 0 insertions, 8582 deletions
diff --git a/doc/TODO.detail/alpha b/doc/TODO.detail/alpha deleted file mode 100644 index 76c352760da..00000000000 --- a/doc/TODO.detail/alpha +++ /dev/null @@ -1,317 +0,0 @@ -From owner-pgsql-hackers@hub.org Fri May 14 16:00:46 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id QAA02173 - for <maillist@candle.pha.pa.us>; Fri, 14 May 1999 16:00:44 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id QAA02824 for <maillist@candle.pha.pa.us>; Fri, 14 May 1999 16:00:45 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id PAA47798; - Fri, 14 May 1999 15:57:54 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Fri, 14 May 1999 15:54:30 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id PAA47191 - for pgsql-hackers-outgoing; Fri, 14 May 1999 15:54:28 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -Received: from thelab.hub.org (nat194.147.mpoweredpc.net [142.177.194.147]) - by hub.org (8.9.3/8.9.3) with ESMTP id PAA46457 - for <pgsql-hackers@postgresql.org>; Fri, 14 May 1999 15:49:35 -0400 (EDT) - (envelope-from scrappy@hub.org) -Received: from localhost (scrappy@localhost) - by thelab.hub.org (8.9.3/8.9.1) with ESMTP id QAA16128; - Fri, 14 May 1999 16:49:44 -0300 (ADT) - (envelope-from scrappy@hub.org) -X-Authentication-Warning: thelab.hub.org: scrappy owned process doing -bs -Date: Fri, 14 May 1999 16:49:44 -0300 (ADT) -From: The Hermit Hacker <scrappy@hub.org> -To: pgsql-hackers@postgreSQL.org -cc: Jack Howarth <howarth@nitro.med.uc.edu> -Subject: [HACKERS] postgresql bug report (fwd) -Message-ID: <Pine.BSF.4.05.9905141649150.47191-100000@thelab.hub.org> -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: ROr - - -Marc G. Fournier ICQ#7615664 IRC Nick: Scrappy -Systems Administrator @ hub.org -primary: scrappy@hub.org secondary: scrappy@{freebsd|postgresql}.org - ----------- Forwarded message ---------- -Date: Fri, 14 May 1999 14:50:58 -0400 -From: Jack Howarth <howarth@nitro.med.uc.edu> -To: scrappy@hub.org -Subject: postgresql bug report - -Marc, - In porting the RedHat 6.0 srpm set for a linuxppc release we -believe a bug has been identified in -the postgresql source for 6.5-0.beta1. Our development tools are as -follows... - -glibc 2.1.1 pre 2 -linux 2.2.6 -egcs 1.1.2 -the latest binutils snapshot - -The bug that we see is that when egcs compiles postgresql at -O1 or -higher (-O0 is fine), -postgresql creates incorrectly formed databases such that when the user -does a destroydb -the database can not be destroyed. Franz Sirl has identified the problem -as follows... - - it seems that this problem is a type casting/promotion bug in the -source. The - routine _bt_checkkeys() in backend/access/nbtree/nbtutils.c calls -int2eq() in - backend/utils/adt/int.c via a function pointer -*fmgr_faddr(&key[0].sk_func). As - the type information for int2eq is lost via the function pointer, -the compiler - passes 2 ints, but int2eq expects 2 (preformatted in a 32bit reg) -int16's. - This particular bug goes away, if I for example change int2eq to: - - bool - int2eq(int32 arg1, int32 arg2) - { - return (int16)arg1 == (int16)arg2; - } - - This moves away the type casting/promotion "work" from caller to the -callee and - is probably the right thing to do for functions used via function -pointers. - -...because of the large number of changes required to do this, Franz -thought we should -pass this on to the postgresql maintainers for correction. Please feel -free to contact -Franz Sirl (Franz.Sirl-kernel@lauterbach.com) if you have any questions -on this bug -report. - --- ------------------------------------------------------------------------------- -Jack W. Howarth, Ph.D. 231 Bethesda Avenue -NMR Facility Director Cincinnati, Ohio 45267-0524 -Dept. of Molecular Genetics phone: (513) 558-4420 -Univ. of Cincinnati College of Medicine fax: (513) 558-8474 - - - - - - -From gatgul@voicenet.com Thu Jul 22 21:58:42 1999 -Received: from voicenet.com (mail12.voicenet.com [207.103.0.6]) - by candle.pha.pa.us (8.9.0/8.9.0) with SMTP id VAA20482 - for <maillist@candle.pha.pa.us>; Thu, 22 Jul 1999 21:58:39 -0400 (EDT) -Received: (qmail 17312 invoked from network); 23 Jul 1999 01:58:33 -0000 -Received: from dialpool1745.voicenet.com (HELO voicenet.com) (209.71.57.45) - by mail12.voicenet.com with SMTP; 23 Jul 1999 01:58:33 -0000 -Sender: gat -Message-ID: <3797CB70.7554322B@voicenet.com> -Date: Thu, 22 Jul 1999 21:54:56 -0400 -From: Uncle George <gatgul@voicenet.com> -Organization: Big Endian -X-Mailer: Mozilla 4.07 [en] (X11; I; Linux 2.0.36 i686) -MIME-Version: 1.0 -To: Bruce Momjian <maillist@candle.pha.pa.us> -Subject: Re: [PORTS] RedHat6.0 & Alpha -References: <199907221830.OAA06403@candle.pha.pa.us> -Content-Type: multipart/mixed; boundary="------------8DF2D5BA86BB12328C66DD16" -Status: ROr - -This is a multi-part message in MIME format. ---------------8DF2D5BA86BB12328C66DD16 -Content-Type: text/plain; charset=us-ascii -Content-Transfer-Encoding: 7bit - -Bruce Momjian wrote: - -> -> Can I now put back optimization to -O2 on alpha? Please send me your -> other diffs. -> - ---------------8DF2D5BA86BB12328C66DD16 -Content-Type: application/octet-stream; name="g.gz" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename="g.gz" - -H4sICMDHlzcAA2cA1D1rc9tGkp/pXzFyKjFJQyIwAElQkrWl2MpGV36kJMWX2r09FkiCFNYg -SAOgYieb++3XPTN4cgACfNiyatcBgUFPv6enZ6Zx0gn8cWdkjT/Y3qRjjcd2EHTureCe/TNd -eeOT8ZN2u01OKjQ8WfjOrHF3vyL/tXIJpYSqp4Z5Sk2iDQaDJ8fHx5XApCFo6intnXY1DqGd -/WOIUU3Ru4T9JOQ7xxu7q4lNnqZAn9w/hUfwv5XjhTp9ckTwLlzTJvyj9cgH+3MLHv8JTxq+ -Ha58jzR52xb5P3h4Bg//koMwREMZDPmryAWOM1wdb4HzKytczctxbnLCWtioFPlCWABCQJPD -kElC63YVrafFspjYU8ezyS8312+uaKPR0FTD7Jq6BJfxveU38Z8EFUIa0ALecm0Pu2/wFxqN -+zPGwqiziIk1O8sRXtablNSeDr0PIlIb9+QFUdmLAACuA+cPezFlJDHmNTpt8nLhPdh+SBid -4YJAD/bM9km7g3xHCPekzQnQyP+SJiBHjskz8oxDuCffvxDknXGqIllFHBE4CY4cBCf+dh3M -pAbvjULftvE/48V8afl2mZORNN7W0UhAZaBop2rv1KAlzqanGOq6s1mFjht0RivHDR0viG03 -0rpRiIY7ni+Fv7EUwi9GayYsLLhpAYNHabvLwDIELPA7HBZcrMFiINYgMPfDqFhzP5Wp4MYD -PfOLYiqEG0JMxOUGmipCjgDC5TqFMrkZA6WnR3KT9U6NvHhkLG1GlFktKXMjUmhePjJZMyIi -gBK+oKQ43kJSxXhvZJvgPse7kHMZ9OuIIgIvoULqPTWqaFrsPfMoWKMgdOY2InE5ChbuKrTv -4Dfikvk9Snz3lGSaXgc/2tOFbzfhlVELmzUitI815rNsN7BJ4WsjBTjV4l4VcaWxtZTgyvk0 -iTk2Efg9J40sGeBVsRUZ4QWTwqEIkDKfwjBBB4XGgB4eyWFDAnTP/puwes3EcaQ0W1ybxXWk -Box/1FA0XS3U4ag7ubrV7DDr9H37d98J7ei/byzPWUoHGnnDokFmUDTIyME0/tuecAgaDjBG -91TvFQ8wvcFA6asGlw52wW/EwWID/1D20fWf0UWj7S0m9i+hD1o1Xiw/vxv92x6HTQ9Y81y0 -cKbN6+CyGTVUyHsQrdAu/Gs28Ua7RaIWreOLB8t37QfocbUEwOG9EwxTt86id/8SF3kZ8DHF -moQdFLSU+/kmtfmeB5B+Vx2c6uapOijmuG6khnTSbjQQyGKFweAxMJLFRwF59ukZxkdPPz1l -rTrwLzOMNiixeEE4/PF9rLr4oIHNfTtYuSHwj1sVcHhpue5i3KRMcRlNHA8h5p3w4Ba0DR5y -jVT63TR/lj4Qao1cm3VojUPbPzk5kaDjTFJcKUKGadDLxXxueZPrSWNMz4TaY68pbtTsVfCg -Rq8y2s2eonWNhPh9/nW4JxwtFq6Qnf0RmWUSy59pLGpgl3QtboDH5MUL9iw13KYAeXZ1QEdl -gNywBBDJTjzRJSPA8/TPIrhlCBbBfVEB8GwLhC+qwN0C4YtChPGmALx0q4vqeQmcuVMdznEZ -nFUNhNolgCbOQ3VAnSLWO5PdjIIhhP5EWHLsUA5uySKeYVjH12toM9paEfLxr2K7rg32aDNY -NywFu5udbwO5oqVvAbqirW8DuaK11xbgc7n8srZfG+rxZqirLZBtbwSLfqE22E65DjMvsTeD -Y8jmTBx/E61rKlpfzc2cQvtTGIdfQ/yVOKxYY/B2LvzgiiTiMRGGvb+8+fnVze0/QOgaz63B -ndvrf1w1ecsWNE23OUPK2vjaq8u7y6gRtsLec8m4pGsxMxPkZGdmEnISzn49ehK5lVBVNC2Y -WKE8w5hvssPUgwPITfZ0/VQvySZq3YGi9Xrp4Nq3XcwnsLg/FfaH9zbLzfqe5RKY4c+tEKcB -FhHtSRBCfDx7shYOJ/CaN7Zrhc4DT0LgzdLgGACuxtDJvBGGyhM2ucMW4RyE8UMYRkl4JKCf -jtMPSADXwzDOqqwRhHqSvtkinJat6JMKbKAp2sCMPQD5/d6BMU5tcZ0MQuh6TB4WziTBnIbz -ddYrJO4ffGY4j0Vx9+bdq19fv2vyRuH8+CKcDz/bFkzWda2r91RV5YYkbThfeAqh3QHd0Gxi -fVYgJDJYKybIAVWoGq+mbEmYnKrKknpOvhIHZKLWu31F7xnZHCWieru0PNSUhBFD/CeA21l2 -iKeJaFMvpxSRrzsxArkaNoCGUKzpALmAhZnNPm7CgtsJ3pYLIDK5NRngg7NtUJUy0DQVfZDJ -HMw/hMwHPFgucw6+DU4zACfA0Ikekd+d8J6Ad10u4Ba4Do3ALJ2ENHYOLNUpWgMDUmCzCeNQ -y2WMwySGy94HBfdx3Lr88fbu+s3Vm+u3TXwZ2keUhoBQqsHlb1GDmGERRjEhQoRgWqBmaR/5 -BfggUtBxLDSh8mQ0AH3BmoUUL1gc9GV4I9MZQzMVg2Z0BlmydFkSjI/4fCwBECubLKakKTLw -SMlz1OBEzpxJaWKASRzeup5kXVSiJ5hiD1mw+PLXm5urt3dDQSZPmzL+/d0OX6583/bCO9/y -AmscOgvvFtmG0JpJjs+gumJARJDShQPRV1P+Z+teOqUPe+OBVOZ6XzEMIy/zuVONJ8exO9vA -FJglfSWhG4ZipHMPhyNwf1LnY/FhBd/tKUayKot8EWQjaypxJv6R4oyIVdJkAYNiyNVHiH0R -zwFRKSCmHz3gQzbZ/SX4sP0IsV/dKGOPVG36XcUwaVptHC89nEb8wnThdIoUM2IIztCIE8AQ -lMxGcOCMGAY3gEEJrJymKJnhNn49oy7RzeML5P4qQKLuhtdv765u3l++HsL/r1+RH34gIabl -rt+y31m2RWkKIaeZ3QwVkoAFGqx/qv9qARAx9oqGrqyh9q+WiO8NE5zsoJfWsQMxTShTKbfW -VAwVK61Xj5KPUmU0B8DX1HJtV9WVrhpvwspYH4nhgkdvlvKnDiMyBCf2vUaDjP54K4GUuq42 -ULrJLrfU9H5mS5QGTH7GQlkfdAUmDwuf2B9XQB1M9FNRq8jaCUj2x9wksmhYPkq7nEjmN1ev -UebkP/8h3IXkHmR4o56lEoEcTihJJwrEPPurIXZUipibT+V8OcTOy/CafT28Lkr59fUEeV4q -yNnXQ+wihxj3XbqhdAeqJJu3V3MXabw48MhRmc1JyGnGtkB3Ln9Rkw2yjvIAy7zDo6XjqAYd -8drfI6TjvDoZs0dMxkUNaTxirTqvoVWzR0zHRSkd0jjIhKDO1DKbxPhfPDPPe7so0nLBUXzM -hXp5Jx/PILJJ2nhRjbHLKYgAGR9aOAg0Qxlf+BTTpIZiZvNOOxEggvyC/D6P5g9GkFRCmqmY -2cQh/4OxqAqN4M6/vpAMVTENc11I29Pw+OSkgyUZW1oSjFVfX0jdnmL2jO0sSULA45OQAZbU -lVhSFQJnj0FCfaqYprqdhCQEPD4J9cCG+hIbarAwvJIiPgZ3Z4KiZVNSeyDj8UmrD2SaEnsS -c6WqtM4egcgGqqEMNEkYsTstX1VuRXt6pu7CCjdsHBJtdtg5JCDkDiJqvVPaL9k6pKuKpqe2 -DpGVBxBZknbi4Gaa0QqT7QGxfJuslpjHnZxkhHZ8PPn3nGi0o/U6g54Q1xH5DplJ+HHaSdN1 -vNUnTJPGd4ZDy13eW8Nhi7D7R9GDX9/eXv50Nfzp9bvLu1sUZHQmN/MA7wP9zjTKOkSUxEr1 -2CjBR2olcqT239VgPM3kUB0jXEyyxzrAcMA+DOKt5iPb5zujmF6Y4lZsTexuz0CDQjDieAU0 -iu1ftGg0CvbmNUWD+PCHOBgsbmNquJWsXjL8e5nhdK/4c8P3irF/zvad6LQBgMRGQDwH5u1A -l3xUhcCun1mGdmgBnbQenVTISesdUk69PuCfXeHZJ/4V5aT1UnLCI6H7ltNAGygD8Iw5e5ru -pI/sLCIDU2RPWAugVE6okxJ6dJqT04BqykBfs6e94S+VUxr7mvZUhS6pnHSIFQyatycpnZX1 -kdNJhZxk9rQ/Oel9wH/NnvaGf0U5VbanKnQVRSAAekOUw1rsEOOw9/MRjnmqdUtOwqpKdms0 -MnrtPGRwv/DZTuKnwCbJmUjxklCXoPBMZCx33m1mnXyHbrmUN3Qro56qXYVqefqNNUSYlyjF -w0gOYbqlaGR0Knc+VKOtswYWDLGCYDW3gQHOzFOIpkKINnPCQCHP/kd9JsqGuOHCarqK2JrP -15glu/UFwyNKsyzfmlLO8S9JqfCglQiWippSheqpGaI4T+Z4ib9wjKg2RfoURu5ofHQ6IjnH -ovXEuODQqBxF+n2Mj8VZrtufb+6Gb67f8kS67S5mzaubm3c3CnnK3z8lz76fPCNjaxXYAXd6 -K29i++Blfn+qcLhnGaAXAujlb3z2yOlMHRaQ0yk5bVKLzvj9eC6ZUJ4a7+BnesfJl2GDVPz6 -QKFGt+hUEXYRnyrKK4DsGA5jtaEBzH7R0Z4EZsWjPVK8TVWhZuyh/kKbwXeHCL3ZisWb7tWI -KcmrYiElJiiNGSfF6/SyA2263lMMc5DzvrgKnl4G5zulxOE/PEQWa3WS8jD4+VVBblRYpv6x -bgTFj3VXBVV4sBtBuWEdUOdlkGohdV6G1KwWUhdlkGohdVGCFOXyE4YX1fLZSn6Uy68qqDL5 -UTesA6pEftSthVSZ/OisFlIl8qOzWkiVym+PBkj3aIF0fyZI92iDdH9GSPdohQbdoxule/Sj -dH+OlO7Rk9L9uVK6qxQTcB/sz1PHD8LYpbY3mXe7QJodvtlW103FGGi5qcO2w3T1A+RY9ix1 -gpz/LB606wM+qgB4Q9UGOeDzCnC3Qfi8AsIbKjbIAV9UgLsNwhebEaa1dALLHKZ0gv8sDgTq -Az6qALiWTkSAzyvA3Qbh8woI19KJCPBFBbjbIHxRAeGDOQp6ME9BD+Uq6MF8BT2Us6AH8xZG -PXdRZwip5y/qjCH1HEaNQaSex6gzitRzGTWGkXo+Y6NmbA57ijtop1Vj3R112tKkhTHQlV5X -yyUt/kmNf02ch3RExKB3sqGQEyXhgBOreRLx5VE7tjBvtlbHE1/jpcyqBoqyYmYxKH58qSoo -WT2zBNSqFlqykmYxLFHTrCqstapmaViONy7mMtwSdZ8wVSlNdoIv43LiofNmOcWvcTlVnVzL -5BSD4nKqCkompwTUqhZaMjnFsIScqsKSySmGJeQk53IiJ1ya0+Sipnu0DLpH06D7tA26V+Og -e/QldI/OhO7Tm9BdOdbJufk57vbIuXm4V+zo5/H+oUoIfF8m/3m8x6WSzZXC2idiBt0VWJ7N -U2ucZ/ORlL3QULrqhrfyuxRSa1BadJhFrFCq4gj3oAvDu5FLdmw3vOfWyNZCm/JRvn6U9Lwg -SMqN+fUBH1cBXKuQYQS5XQFyvVqGEeROBcg46mwS0vPnxWP8JhnDcFUeIdSfPT8viFZz8UJ9 -wMdVANeScQS5XQFyPRlHkDsVIG+UMbwukXEmrDiIKdKD2SI9nDHSA1pjPYOo4/TqWUQdr1fT -JOq4vZo2sYnTewlj6qPzfQWdqgc5Mv7vi40/G+IcBGmjJtabQO8U/uT823r0E+9GZTjktudU -CY2kWwe7PaWX1G6UsF+EZvn9NOxW/dCs1x1Af2Zuu02+Pykv0t3FOz7TzGBf7dmJGT1AbiD5 -+FE8ELkA0PYrRu/Rpib2jPyNm+dp2Qw6mOOhn3rwzzfDj/UsQb9CiF8Z/Rh8Cv3K8EvQZ/rS -10Ek+e1ZEpFUtOLCxRHEIP3wtEJYEtG7Rd/nW/adF2WNrqUJ3qjr6OFpBa+5BdnSfHiFvos2 -SXuieNOGvdhJsx02ZCdA8iWrjdNuyddy+OeccmVxRV1gARLrAmfLezlYeRe4QNrhH8t8kWDx -hSl4FG+G/86ZTuwp+fX2avjLu9vr34Z4Tg+dXfImtP+EZR6wNdavEifBOm1ylHuPD0zxq4DL -iISjM94YD5kt3Al53z92grnYTZh8tsrIFt5dp5NryCEJZLUih2GD7VXm1y3W4dkhSJeKXO8r -mtFLibwQfVal6I8lrj29/fX16xbi3wg/AeruYmyxg6FNQQRuuf4BL1M1yOC/fyavzOYl7f/i -5GcPEnI8E5HthCf0RjbhlrTJ4SPdMKupCtXik0uiPmOmkCcByVOhXs28FqF+hX/EnshhxZix -jjVDq9EI7HEUJYB4HyzXwaOSChmxT8KR2cLxZmSxCrF8pG95MxC/R4IFGOjcxqMqgVAXxpyk -7DZGGgNVY3WmUncvwNnopviaLSdMMH5vhDH1T4P5SjRKdwhrfUWnqeOC5O/Og+3hgaCM7xPj -BRrblTdzneCeb1V+AFwcwA3wZAddgYona2caIieN5xrWPGocRcqq23Mehn+wH5PFauQC86bA -vSRo5RSkyo4emgLhK+Nt+WsUoYdL3ywr37+BQKnIerqiZ+omyD6dCPwgoJ82L3EGDzQsf2lN -WZkz9PrJN8fE+q70A4xrxK0VmkVYsQwvg8D2w9y3HN+jejP3p/EDXJua0dT5Nb1nALV6Kl18 -QGqFaNeKPcmkjBMbbMnhE16Ijh/E2C8XpDrQHyi6KRnL3r67G8I48aqI0EtkySOQqkkVPdnx -WBf/b0dOA1Mx1PhQDB7H4o5kOHU8J7Sbrbxe5p5nv7jKn8VyiYP4qG5yURVZgmf/063evru9 -u7xJKhSvP796m8DgXyVtSLBH1NmijqorRlJRoz6dr3J1M2R0r/vVuNju4+CETAMMzVAMqkmq -g++hGKWAZH/cphp4jj/rBThlhYh/unx9e3WWBSSvBk41xcieDz8E3UJv9lD9+3DskKoF7QN7 -8qm9LHlefvh9DGLFE2VGN5fyWcP7mxWLoQJ5/VKxuPkg9jGIpQvW1st/A20N729WLF2dkVcm -ltljFEv2kwhFeH+zYmHk5VPyOa17jE7MBGsZbLCWb9iJweTASJ1olmrdYxTLoKd01Q3W8u2K -pdtVlW43VfGHvOQ1IZLPnixY+oHls+OQB4jk9PCvpEVxZ9SwfIaQfnl9NfDoF/wil+1Hs5n8 -Zy9FAZYISKsl6ud1ewOl209VQNgPJWKZouYcwDo7DKGFKw6rue07402LG1GrXdY2Ihjp1zXt -VDVO9ZKCMxp4Za2fqljE5MT/Ylm85bAxtcWvho4nSogEoc9zmZPVfP45WiQMPy/ni0msWOL9 -95bfYN/yOUvdZGu54nuMApdEU3bDRUz3a+Mi5RO4G6rGfMIPyYTDB8tv/sCg8Ll/YLN7w6m/ -mA8BmybDKNUCc7vWcul+HnKsxNtKhGSkhoAG6Nvc+mAPufZlupn6tp3tm3FPYCi4tW8MxYLe -jojKVdDQFa3XVaVKuMufRGlw1XMoNEesbqe/Z5RVhKy6pBKxcXI2nC8j3eVEaFLtPSQRXMsf -YkcYEwWCeZBod0WiivzMwpls8GasxQ6ejL2fK5sFb9MyL9bvKtpAkwcxC/xSNrKs+c6ZFOxl -YFkoaIiJ4JWH1Y/siUJGq5DxGu/ye6IEUrJ1muJhKBXzQJa/6Qy+/RF6yGypEAjtioS2CQlR -KIYpqmCVUK3NrMrvB9gOy9R+gDVkN55S44xLb1LYB+NyJ9oYSrlTinI2FikueDq0oQ3mEbfa -wURiGJnBXj+l/dLBHsu8pYtIApNtVtSJ/G5DdBMEOA7BZAa4zL+8F9jjhcc4DR4DBtbpwocf -vvUZBt2TJEsbr3yNlniZDMiS0MAKw9yInFvpSn2X2k+term2dxbXqkt/L+ALECGmDumowsr5 -25gs/Ay9bAGvjCypS2ML++m1VmiKqowksaLt9yRY2mNn6oBiO6DOLbJ0V0HyafnR59AOToro -y4gIy+TZXk2J+PCKIjYhmOlNCAfElTPfzTEfe3tB3Bps57jL+E41qlCq7o/vl6hqd6CSfCIz -FCQlt9sPazJIe3dU1Lm1bEKrH395+fPlzbvrV4pgTOYWuEUEkPJXYqOCAQTR/QmnEkFCULsS -JPxxni6p4HSNVdpLBBfNM5n2wCRTIKq1JIqGFxElXBjjsr0GnLO6Dj0OJDPbuj1ybpX3KKNZ -p7qi6+ohXboYanbz6XmHFy3s0i6grx/SmZejv6Uvl5AjlY6pKbpppjQy2JdfFGTlnXhQ4sWL -ZGAaij5Iu4fDISnG0SDL70bA/fck2IHX/CPj2uHcdkTMNn4b+oidmoCTvVnguvm6X/dwrltO -VDXfXYWoAvddEtZCU2tzAM1b7RZAcxiZAFrFbBlM4QsDaO6wMtkycne/mINzer0YfwAWhPiy -eazRY02N2R7X6WRFPIPVCDMv/CZ+6sGbRYo0jy4SK05V76zsRveGlTDYeXzl5VwlFunGx8x+ -GUabEOYScbyxu5rYHWs8toOgc28F9yf3KalLn1eWt/TtfF60d6rSYknTHoSB/XgvDtBkgwHg -XmiC4CYwJoXRl0wX7AMwCrkO7bnIHZPQiZNkMDfFV6Yrb3wy5lNQAW7FmYhP8RCCOCzywf7c -OitqZDTFb96KyFuZCArPAhW3YoXSjaheOoJblrU0oy8VlLXEWTrOzIt7hRYma9IupjIZM4rh -sFq3/9/dtTS3bQPhc/MrlFNcj/KQLCl2eu5ML31M07uGth7mVCI1Ip1M8+sLYPHGLoiVHdvx -xSNL3y6XiwWIBRcfdEmt7ssi7Gl8U+3XZ3+IPyKOBbJxxWWmoXXneZyGht400NA+6MW289BN -PkxDh8MCPAau7+pdXzcdOu7EEPbQEyuI1zPnn6YLevSZLcYip/YKNkVowYIPDN36vnWi4s9v -b259b5vvqqPjw1eIWEW9cjNkREG98uT93+UinQIBz9OlW169hPU5DAtUpGVYoBotxDL0bhl6 -t8N61ZcSCxwuZVjgaCnE3jEUa46VgruT670UdBToVZME1WVhiqC2kHr64FuV1Bq6c1DqjY61 -PBADieBaEQPo+JOnmyQRWMcnWoTmSX4xCbl0UXzb+Rin5dKpiUFgjETNZlZR3Rzu+iVMiFCN -M++sifOqWapJcqq2VgQXA/cYHFsRtqxUkZyJEELEt+mxB0kT1Ri3fuJORzefa+4aY7dPbt3o -mhG6VCjWWdp4DE0zGmNomrMYRbN008TDKJqje0pTsWNomm0dQ9OE6iiapZvmRUfRLN28QMkx -mKNwVqjkiMhROCtYcnziWGxNeV0owwqOwnmdKEPujcJ53SjD0R3DCzi408E25oREETRlGwqn -WdlwOE28huIz3GooPqRjTB8mMd0iiqCZFVE4zZ6Iw2mGRBSfYUFE8SHTIealHJMhjue1cpaR -EBfgtnOGWRDHM+M0xxCIC3DvIENnh7ooQ8xHtAHvAlmCPVQg4sVDrYgIWtCAzfOWoCIDXCSo -uXl+EVRkgDPEpQEyR4/yAC9jF5+CXFQthEM+rNdoHiof1m/dTs6HzVs7Ih8mSDWIjJiBpvmr -iayYgaaJponMeBhde7kxA02ThFH5MQOeIfPCc2QSfL8s2al90DQZ1L7sNNmUglBpcuBaPE3G -IXGaHLXRvdJkUhczTS6M3Tp7FguRJnPQLN3lY0udPeGESJMZaJZPMucFEGkyA83ySYatn0qT -OXCeV3ihkjs2g0qTWXBWJPLCJXcWBZUms+A87bxuxIiZgjMbqDTZQsg0uejh7NJkFrz02e+l -yRx8yFlLpckDiFIXuDSZBS91gZcmc/A5F3hpMsOrOb5dOk1mCXDbubiNvDSZh2cGankzeWky -x0VcPPcCWVpWMk0mZ25empyd3Q1ySWbTZI65nMtEaXImozglTcZeI08WH8aTj8F56n+tj2/b -w81OllbetPuDSJW7thnJmgVZ39Cpgspm/XV03R/X6+7daPTP7bpbC9vWWkPXt0eoNjtsl9X+ -cGxvRlWzGq3Wm7qBHxol/F5XGkU+uO6ls2/2B7MeYRYjrlN/KexMY+VCgllRuE6nzwp7qbGy -JgLA8hOleTqLzdCqUTOmsR3a5sQOKLmQaFN1IfDmIy1xaSWEzUZCfEQl2nol4WofDGyHoWCX -Bneugbg79JZZCQ630kZbvVFhGYZSUoVjpbkfUYNk3Eqki2QBd/+gMjIdkjJJGUhlWSfdd6BB -78mD8Hflxc8q/HWnN70/G/4I9qHCv9QMyuYXF/4lDjEBX+KPxwp59AlwNR9PJ1dhJdGq6uMH -C9S3fTHkh4oM1D5e5D92ZSdajdFYuSAT6JBfup3AWkSRocmqObk7VQaV+uStIcEX4lrpEpKF -y0sFiswPvkxiS3eomqU2Vol/Fl/oWxOf/Btzv2r80qDOMDfFotau/b/W5mH6DE9JQkp3QOTD -G8zLi2lqgbza+y2iA/Og7h2YouRGDBdqNPTJ/ei4N8YjXnMagPD/cCAkzmjar2eyujPJfnVz -iuQ39E3e2b5osz5ZdBd3n3LR7emiu9MN3haJjgJR278r3Qddy03iIKClRQOdLNsUXVfNHfTA -Gbxy+k4DJzw7XuaICffGGSq1N2xWNDw4MiVs1h5JlA2AmGjBkKfBz26sy/suGt3KwXYFtAS8 -5YB3HDO2BPjHHJfQfSpTuet1Gu1TCZRv497PMGx3D4dsi2STFWt93SbxZ/yAyQknDuUI72KH -cYQTb7OufB+zE38jwnhL3dwjQtovLNlgjHKPr+oYm6Cfwya+w+05LzS+9QjFDOwCKSSiC6SQ -UC651kkWIsHrpH6oqEVH6Y+z8dSRLPoWwdqHcLVd+lArwt5/6V1omXWhjPl+07cruyYT1VYY -jKyMMIVtFGTa2+o6gIRXEpKrvt1Y4yIM6F6pGg0aInSvVI1GCHkdX0nau8nYq+tBNri9ILdx -tlgtkS0bZ0sKMSaqAg69i87uozXjmI4AZBx7lhEAnS8bAT7kySOAttdGAGrv40QANiZczBbj -i/kFNibIZUsxjMKq5dHwXZ2jkSCxWw62p7CvY2yONQ2vSyL5zTxLwC8CCRVRRrsPEd+pbeRL -qS8ohjI73rXvkN70XH03UKaRoTh7QN+he00/fBzP3AlNkL7Lo4iAaBVS+b6CxW54Ap6bH392 -bystJVnwzgNWIli0YMk6BkjLRQyyIBentOqAd8KtBDiWixwLUyzmioZjgqB04V79vvSNSe9H -vg8wmtxrgADovR0AjWpbc1QTrdtN94HHaTcI0JA950FbDnSyWw4XS1sOcE/YcmgPnC7GkuYl -fBL4drU3ot3EzWlFUIODbX/XxpEb5mPf8NidEodo8WwL56iKiCbOce10hkzGH0G1gEiprIMm -5gRCdDTXAs2aKbDraQFg7IGmDB9Mz6ApB/vqSU053FtzDEPPtynRXjoX4+0inq/VtnRbtql9 -3qYDjPzJtv0A7tB23qN7PLKfg7kDfMugFEomEmo8UzOJwdFMXUaNZfoibjJmHIPF/LN0DESf -JTX6Lo7BImi+uBjPF/ZlvCVK2lc31Wp1XO6r5m5zpv8TtyX+eg9qS/AOD2pL6syjZJf6JExd -2IjKTq/12cwm1u8DEJ2JOdV1F+l8qw4DABeYScsjuUAvJT25C9CouJqO51eW7CXRsmsGDVvu -2q0PEj3D+2+Kyxzar+tjXspzcY3zpkvN6j+/EUTeQ1oMxUFWk8mnjS79v9Om6YuQSNJu05H0 -I7gNovDp3IYxFNkjsWkWJAc5kQXJKYiP3Z58ms4yHGyXYzcrFjOfuhstZm+v6757J4xYH9Ux -nOrshLU8DbJXlXrXbX8ryUK7en/Y/Td6A7nQm7Eq0tute1AlCRT//KyL9kZfb6se2EXrb/It -frUTknX3Th4U+vfvv44u3s/fCxtNPZ+9oFIdLA7/kv7sv4PRQ5lBwNzulWTUU2uE6n4di99z -u1/o9tTtwq9ld4u19kTks5Opz9/rjmsfHY5t30pF3StDX2gmm/7SvJGIKzDSqWz+lOFwfq1m -jYzTE+P1HcYJfYRoySlyhGjJSWfUVU83uOTEKEIUPczUX7TAGt6uemgl+JqHvZ77teyEJCQe -wgNeeQcgh+oU16C+0rTfp0pgKnPefzvY4k97jLgO82+N8Q4cx/6TnC79oU+YWv5mTl41fcyN -MY/Vx1yNU75zFdR2xAdHloDL6lHiQ/aKNHPMoOpRsh0hdt337gF6qYAZ+s5Kd2sFwe6QDxPl -/wOU7Ogc2/cAAA== ---------------8DF2D5BA86BB12328C66DD16-- - - - diff --git a/doc/TODO.detail/default b/doc/TODO.detail/default deleted file mode 100644 index 41d6627ec42..00000000000 --- a/doc/TODO.detail/default +++ /dev/null @@ -1,59 +0,0 @@ -From tgl@sss.pgh.pa.us Sun May 23 18:59:22 1999 -Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [206.210.65.6]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id SAA08491 - for <maillist@candle.pha.pa.us>; Sun, 23 May 1999 18:59:21 -0400 (EDT) -Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) - by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id SAA27952; - Sun, 23 May 1999 18:58:53 -0400 (EDT) -To: Bruce Momjian <maillist@candle.pha.pa.us> -cc: PostgreSQL-development <pgsql-hackers@postgreSQL.org> -Subject: Re: [HACKERS] DEFAULT fixed -In-reply-to: Your message of Sat, 22 May 1999 21:12:19 -0400 (EDT) - <199905230112.VAA13489@candle.pha.pa.us> -Date: Sun, 23 May 1999 18:58:52 -0400 -Message-ID: <27950.927500332@sss.pgh.pa.us> -From: Tom Lane <tgl@sss.pgh.pa.us> -Status: ROr - -Actually, it's not as fixed as all that... - -create table foo1 (a char(5) default '', b int4); -insert into foo1 (b) values (334); -select * from foo1; -a | b ------+--- - |334 -(1 row) - -Good, the basic case is fixed, but: - -create table foo2 (a char(5) default text '', b int4); -insert into foo2 (b) values (334); -select * from foo2; -a| b --+-- - |16 -(1 row) - -Ooops. - -What you seem to have done is twiddle the handling of DEFAULT clauses -so that the value stored for the default expression is pre-coerced to the -column type. That's good as far as it goes, but it fails in cases where -the stored value has to be of a different type. - -My guess is that what *really* ought to happen here is that -transformInsertStmt should check the type of the value it's gotten from -the default clause and apply coerce_type if necessary. - -Unless someone can come up with a less artificial example than the one -above, I'm inclined to leave it alone for 6.5. This is the same code -area that will have to be redone to fix the INSERT ... SELECT problem -I was chasing earlier today: coercion of the values produced by SELECT -will have to wait until the tail end of transformInsertStmt, and we -might as well make wrong-type default constants get fixed in the same -place. So I'm not eager to write some throwaway code to patch a problem -that no one is likely to see in practice. What's your feeling about it? - - regards, tom lane - diff --git a/doc/TODO.detail/distinct b/doc/TODO.detail/distinct deleted file mode 100644 index 2e8f0c51d05..00000000000 --- a/doc/TODO.detail/distinct +++ /dev/null @@ -1,483 +0,0 @@ -From owner-pgsql-sql@hub.org Sat Jul 10 16:31:14 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id QAA03701 - for <maillist@candle.pha.pa.us>; Sat, 10 Jul 1999 16:31:13 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id QAA10295 for <maillist@candle.pha.pa.us>; Sat, 10 Jul 1999 16:29:57 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id QAA13874; - Sat, 10 Jul 1999 16:23:11 -0400 (EDT) - (envelope-from owner-pgsql-sql@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sat, 10 Jul 1999 16:21:15 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id QAA13331 - for pgsql-sql-outgoing; Sat, 10 Jul 1999 16:21:14 -0400 (EDT) - (envelope-from owner-pgsql-sql@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-sql@postgreSQL.org using -f -Received: from ra.sai.msu.su (ra.sai.msu.su [158.250.29.2]) - by hub.org (8.9.3/8.9.3) with ESMTP id QAA13055; - Sat, 10 Jul 1999 16:16:42 -0400 (EDT) - (envelope-from oleg@sai.msu.su) -Received: from ra (ra [158.250.29.2]) - by ra.sai.msu.su (8.9.1/8.9.1) with SMTP id AAA06017; - Sun, 11 Jul 1999 00:16:40 +0400 (MSD) -Date: Sun, 11 Jul 1999 00:16:39 +0400 (MSD) -From: Oleg Bartunov <oleg@sai.msu.su> -X-Sender: megera@ra -Reply-To: Oleg Bartunov <oleg@sai.msu.su> -To: hackers@postgreSQL.org -cc: pgsql-sql@postgreSQL.org -Subject: [SQL] SELECT DISTINCT question -Message-ID: <Pine.GSO.3.96.SK.990711000908.2043R-100000@ra> -Organization: Sternberg Astronomical Institute (Moscow University) -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Sender: owner-pgsql-sql@postgreSQL.org -Precedence: bulk -Status: RO - -I got a problem with query: - -select distinct (date), bytes from access_log; - -which works but not as I expect. I thought this query will select -all rows with distinct values of 'date' column, but it get -distinct pairs 'date, bytes' . From documnetation I see - -"DISTINCT will eliminate all duplicate rows from the selection. -DISTINCT ON column will eliminate all duplicates in the specified column; -this is equivalent to using GROUP BY column. -ALL will return all candidate rows, including duplicates." - -discovery=> select distinct on date,bytes from access_log; -ERROR: parser: parse error at or near "," - - Regards, - - Oleg -_____________________________________________________________ -Oleg Bartunov, sci.researcher, hostmaster of AstroNet, -Sternberg Astronomical Institute, Moscow University (Russia) -Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/ -phone: +007(095)939-16-83, +007(095)939-23-83 - - - - -From owner-pgsql-sql@hub.org Sat Jul 10 18:01:17 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id SAA04878 - for <maillist@candle.pha.pa.us>; Sat, 10 Jul 1999 18:01:16 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id RAA12755 for <maillist@candle.pha.pa.us>; Sat, 10 Jul 1999 17:35:02 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id RAA24997; - Sat, 10 Jul 1999 17:28:17 -0400 (EDT) - (envelope-from owner-pgsql-sql@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sat, 10 Jul 1999 17:23:39 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id RAA24524 - for pgsql-sql-outgoing; Sat, 10 Jul 1999 17:23:38 -0400 (EDT) - (envelope-from owner-pgsql-sql@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-sql@postgreSQL.org using -f -Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [209.114.166.2] (may be forged)) - by hub.org (8.9.3/8.9.3) with ESMTP id RAA24227; - Sat, 10 Jul 1999 17:19:43 -0400 (EDT) - (envelope-from tgl@sss.pgh.pa.us) -Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) - by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id RAA05709; - Sat, 10 Jul 1999 17:18:28 -0400 (EDT) -To: Oleg Bartunov <oleg@sai.msu.su> -cc: hackers@postgreSQL.org, pgsql-sql@postgreSQL.org -Subject: [SQL] Re: [HACKERS] SELECT DISTINCT question -In-reply-to: Your message of Sun, 11 Jul 1999 00:16:39 +0400 (MSD) - <Pine.GSO.3.96.SK.990711000908.2043R-100000@ra> -Date: Sat, 10 Jul 1999 17:18:28 -0400 -Message-ID: <5707.931641508@sss.pgh.pa.us> -From: Tom Lane <tgl@sss.pgh.pa.us> -Sender: owner-pgsql-sql@postgreSQL.org -Precedence: bulk -Status: RO - -Oleg Bartunov <oleg@sai.msu.su> writes: -> discovery=> select distinct on date,bytes from access_log; -> ERROR: parser: parse error at or near "," - -The syntax for SELECT DISTINCT ON is just as brain-damaged as the -functionality itself: there's no comma after the column name. -You want - -select distinct on date date,bytes from access_log; - -The reason the functionality is brain-damaged is that there's no way to -know which tuple out of the set of tuples with a given "date" value will -be the one returned. - -SELECT DISTINCT ON is not in SQL92, and I think it shouldn't be in -Postgres either... - - regards, tom lane - - -From owner-pgsql-sql@hub.org Sun Jul 11 12:01:23 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id MAA26263 - for <maillist@candle.pha.pa.us>; Sun, 11 Jul 1999 12:01:22 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id LAA14891 for <maillist@candle.pha.pa.us>; Sun, 11 Jul 1999 11:56:47 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id LAA09165; - Sun, 11 Jul 1999 11:51:27 -0400 (EDT) - (envelope-from owner-pgsql-sql@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sun, 11 Jul 1999 11:49:46 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id LAA08263 - for pgsql-sql-outgoing; Sun, 11 Jul 1999 11:49:45 -0400 (EDT) - (envelope-from owner-pgsql-sql@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-sql@postgreSQL.org using -f -Received: from trends.net (root@clio.trends.ca [209.47.148.2]) - by hub.org (8.9.3/8.9.3) with ESMTP id LAA05079; - Sun, 11 Jul 1999 11:41:38 -0400 (EDT) - (envelope-from oleg@sai.msu.su) -Received: from ra.sai.msu.su (ra.sai.msu.su [158.250.29.2]) - by trends.net (8.8.8/8.8.8) with ESMTP id CAA21557; - Sun, 11 Jul 1999 02:23:01 -0400 (EDT) -Received: from ra (ra [158.250.29.2]) - by ra.sai.msu.su (8.9.1/8.9.1) with SMTP id KAA18412; - Sun, 11 Jul 1999 10:09:24 +0400 (MSD) -Date: Sun, 11 Jul 1999 10:09:24 +0400 (MSD) -From: Oleg Bartunov <oleg@sai.msu.su> -X-Sender: megera@ra -To: Tom Lane <tgl@sss.pgh.pa.us> -cc: hackers@postgreSQL.org, pgsql-sql@postgreSQL.org -Subject: Re: [SQL] Re: [HACKERS] SELECT DISTINCT question -In-Reply-To: <5707.931641508@sss.pgh.pa.us> -Message-ID: <Pine.GSO.3.96.SK.990711100405.2043V-100000@ra> -Organization: Sternberg Astronomical Institute (Moscow University) -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Sender: owner-pgsql-sql@postgreSQL.org -Precedence: bulk -Status: RO - -On Sat, 10 Jul 1999, Tom Lane wrote: - -> Date: Sat, 10 Jul 1999 17:18:28 -0400 -> From: Tom Lane <tgl@sss.pgh.pa.us> -> To: Oleg Bartunov <oleg@sai.msu.su> -> Cc: hackers@postgreSQL.org, pgsql-sql@postgreSQL.org -> Subject: [SQL] Re: [HACKERS] SELECT DISTINCT question -> -> Oleg Bartunov <oleg@sai.msu.su> writes: -> > discovery=> select distinct on date,bytes from access_log; -> > ERROR: parser: parse error at or near "," -> -> The syntax for SELECT DISTINCT ON is just as brain-damaged as the -> functionality itself: there's no comma after the column name. -> You want -> -> select distinct on date date,bytes from access_log; -> - -thanks, this works. But why parser complains about such query: - -discovery=> select distinct on a.date a.date, a.bytes from access_log a; -ERROR: parser: parse error at or near "." - -In this query I could just omit '.', but in more complex query -I probably could need one. - -> The reason the functionality is brain-damaged is that there's no way to -> know which tuple out of the set of tuples with a given "date" value will -> be the one returned. -> -> SELECT DISTINCT ON is not in SQL92, and I think it shouldn't be in -> Postgres either... - - -I'm not an SQL expert, but if it works and this feature is in standard -but only syntax is diffrent, why just not to use standard - -select distinct(date), bytes from access_log; - -Or I'm missing here ? - - - Regards, - Oleg -> -> regards, tom lane -> - -_____________________________________________________________ -Oleg Bartunov, sci.researcher, hostmaster of AstroNet, -Sternberg Astronomical Institute, Moscow University (Russia) -Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/ -phone: +007(095)939-16-83, +007(095)939-23-83 - - - -From owner-pgsql-hackers@hub.org Sun Jul 11 12:01:26 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id MAA26269 - for <maillist@candle.pha.pa.us>; Sun, 11 Jul 1999 12:01:25 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id LAA15017 for <maillist@candle.pha.pa.us>; Sun, 11 Jul 1999 11:59:07 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id LAA09118; - Sun, 11 Jul 1999 11:51:21 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sun, 11 Jul 1999 11:49:44 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id LAA06345 - for pgsql-hackers-outgoing; Sun, 11 Jul 1999 11:46:14 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from trends.net (root@clio.trends.ca [209.47.148.2]) - by hub.org (8.9.3/8.9.3) with ESMTP id LAA05079; - Sun, 11 Jul 1999 11:41:38 -0400 (EDT) - (envelope-from oleg@sai.msu.su) -Received: from ra.sai.msu.su (ra.sai.msu.su [158.250.29.2]) - by trends.net (8.8.8/8.8.8) with ESMTP id CAA21557; - Sun, 11 Jul 1999 02:23:01 -0400 (EDT) -Received: from ra (ra [158.250.29.2]) - by ra.sai.msu.su (8.9.1/8.9.1) with SMTP id KAA18412; - Sun, 11 Jul 1999 10:09:24 +0400 (MSD) -Date: Sun, 11 Jul 1999 10:09:24 +0400 (MSD) -From: Oleg Bartunov <oleg@sai.msu.su> -X-Sender: megera@ra -To: Tom Lane <tgl@sss.pgh.pa.us> -cc: hackers@postgreSQL.org, pgsql-sql@postgreSQL.org -Subject: Re: [SQL] Re: [HACKERS] SELECT DISTINCT question -In-Reply-To: <5707.931641508@sss.pgh.pa.us> -Message-ID: <Pine.GSO.3.96.SK.990711100405.2043V-100000@ra> -Organization: Sternberg Astronomical Institute (Moscow University) -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -On Sat, 10 Jul 1999, Tom Lane wrote: - -> Date: Sat, 10 Jul 1999 17:18:28 -0400 -> From: Tom Lane <tgl@sss.pgh.pa.us> -> To: Oleg Bartunov <oleg@sai.msu.su> -> Cc: hackers@postgreSQL.org, pgsql-sql@postgreSQL.org -> Subject: [SQL] Re: [HACKERS] SELECT DISTINCT question -> -> Oleg Bartunov <oleg@sai.msu.su> writes: -> > discovery=> select distinct on date,bytes from access_log; -> > ERROR: parser: parse error at or near "," -> -> The syntax for SELECT DISTINCT ON is just as brain-damaged as the -> functionality itself: there's no comma after the column name. -> You want -> -> select distinct on date date,bytes from access_log; -> - -thanks, this works. But why parser complains about such query: - -discovery=> select distinct on a.date a.date, a.bytes from access_log a; -ERROR: parser: parse error at or near "." - -In this query I could just omit '.', but in more complex query -I probably could need one. - -> The reason the functionality is brain-damaged is that there's no way to -> know which tuple out of the set of tuples with a given "date" value will -> be the one returned. -> -> SELECT DISTINCT ON is not in SQL92, and I think it shouldn't be in -> Postgres either... - - -I'm not an SQL expert, but if it works and this feature is in standard -but only syntax is diffrent, why just not to use standard - -select distinct(date), bytes from access_log; - -Or I'm missing here ? - - - Regards, - Oleg -> -> regards, tom lane -> - -_____________________________________________________________ -Oleg Bartunov, sci.researcher, hostmaster of AstroNet, -Sternberg Astronomical Institute, Moscow University (Russia) -Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/ -phone: +007(095)939-16-83, +007(095)939-23-83 - - - -From owner-pgsql-sql@hub.org Sun Jul 11 12:01:16 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id MAA26248 - for <maillist@candle.pha.pa.us>; Sun, 11 Jul 1999 12:01:15 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id LAA14635 for <maillist@candle.pha.pa.us>; Sun, 11 Jul 1999 11:52:26 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id LAA07748; - Sun, 11 Jul 1999 11:47:08 -0400 (EDT) - (envelope-from owner-pgsql-sql@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sun, 11 Jul 1999 11:44:34 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id LAA05445 - for pgsql-sql-outgoing; Sun, 11 Jul 1999 11:44:33 -0400 (EDT) - (envelope-from owner-pgsql-sql@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-sql@postgreSQL.org using -f -Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [209.114.166.2] (may be forged)) - by hub.org (8.9.3/8.9.3) with ESMTP id LAA04477; - Sun, 11 Jul 1999 11:40:31 -0400 (EDT) - (envelope-from tgl@sss.pgh.pa.us) -Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) - by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id LAA15131; - Sun, 11 Jul 1999 11:38:44 -0400 (EDT) -To: Oleg Bartunov <oleg@sai.msu.su> -cc: hackers@postgreSQL.org, pgsql-sql@postgreSQL.org -Subject: Re: [SQL] Re: [HACKERS] SELECT DISTINCT question -In-reply-to: Your message of Sun, 11 Jul 1999 10:09:24 +0400 (MSD) - <Pine.GSO.3.96.SK.990711100405.2043V-100000@ra> -Date: Sun, 11 Jul 1999 11:38:43 -0400 -Message-ID: <15129.931707523@sss.pgh.pa.us> -From: Tom Lane <tgl@sss.pgh.pa.us> -Sender: owner-pgsql-sql@postgreSQL.org -Precedence: bulk -Status: RO - -Oleg Bartunov <oleg@sai.msu.su> writes: -> thanks, this works. But why parser complains about such query: - -> discovery=> select distinct on a.date a.date, a.bytes from access_log a; -> ERROR: parser: parse error at or near "." - -Probably the grammar specifies just <column name> and not anything -more complex after DISTINCT ON. It'd be risky to try to accept a -general expression after ON, due to the silly decision to leave out -any terminating punctuation. - ->> SELECT DISTINCT ON is not in SQL92, and I think it shouldn't be in ->> Postgres either... - -> I'm not an SQL expert, but if it works and this feature is in standard -> but only syntax is diffrent, - -No, there is no feature in SQL that allows DISTINCT on a subset of -columns, period. This is not merely a matter of syntax, it's a -fundamental semantic issue. - -> why just not to use standard -> -> select distinct(date), bytes from access_log; -> -> Or I'm missing here ? - -I don't think that does what you expect it to (hint: the -parentheses are redundant). - - regards, tom lane - - -From owner-pgsql-sql@hub.org Tue Jul 13 18:02:01 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id SAA07953 - for <maillist@candle.pha.pa.us>; Tue, 13 Jul 1999 18:02:00 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id RAA14528 for <maillist@candle.pha.pa.us>; Tue, 13 Jul 1999 17:46:12 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id RAA96029; - Tue, 13 Jul 1999 17:42:37 -0400 (EDT) - (envelope-from owner-pgsql-sql@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Tue, 13 Jul 1999 17:33:35 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id RAA94598 - for pgsql-sql-outgoing; Tue, 13 Jul 1999 17:33:33 -0400 (EDT) - (envelope-from owner-pgsql-sql@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-sql@postgreSQL.org using -f -Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [209.114.166.2]) - by hub.org (8.9.3/8.9.3) with ESMTP id RAA94565; - Tue, 13 Jul 1999 17:33:19 -0400 (EDT) - (envelope-from tgl@sss.pgh.pa.us) -Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) - by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id RAA24415; - Tue, 13 Jul 1999 17:31:49 -0400 (EDT) -To: Hannu Krosing <hannu@trust.ee> -cc: hackers@postgreSQL.org, pgsql-sql@postgreSQL.org -Subject: [SQL] Re: [HACKERS] SELECT DISTINCT question -In-reply-to: Your message of Tue, 13 Jul 1999 23:50:57 +0300 - <378BA6B1.2B226DDB@trust.ee> -Date: Tue, 13 Jul 1999 17:31:48 -0400 -Message-ID: <24413.931901508@sss.pgh.pa.us> -From: Tom Lane <tgl@sss.pgh.pa.us> -Sender: owner-pgsql-sql@postgreSQL.org -Precedence: bulk -Status: ROr - -Hannu Krosing <hannu@trust.ee> writes: ->> "DISTINCT will eliminate all duplicate rows from the selection. ->> DISTINCT ON column will eliminate all duplicates in the specified column; ->> this is equivalent to using GROUP BY column." - -> If it is equivalent to GROUP BY then it should allow only aggregates -> in non-distinct columns, like: -> select distinct on date date, sum(bytes) from access_log; -> If it does not, then it should be files as a bug imho. - -It does not. Whether that is a bug is hard to say, since there is no -standard I know of that says what it *is* supposed to do. - -If you look at the select_distinct_on regress test outputs, I bet you -will be even less happy: - -QUERY: SELECT DISTINCT ON string4 two, string4, ten - FROM tmp - ORDER BY two using <, string4 using <, ten using <; -two|string4|ten ----+-------+--- - 0|AAAAxx | 0 - 0|HHHHxx | 0 - 0|OOOOxx | 0 - 0|VVVVxx | 0 - 1|AAAAxx | 1 - 1|HHHHxx | 1 - 1|OOOOxx | 1 - 1|VVVVxx | 1 -(8 rows) - -That's not exactly my idea of "distinct" values of string4 --- -but apparently whoever made up the regress test thought it was OK! - -Can anyone defend this feature or provide a coherent definition -of what it's supposed to be doing? My urge to rip it out is -growing stronger and stronger... - - regards, tom lane - - -From tgl@sss.pgh.pa.us Thu Sep 23 17:27:49 1999 -Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [209.114.166.2]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id RAA25975 - for <maillist@candle.pha.pa.us>; Thu, 23 Sep 1999 17:27:48 -0400 (EDT) -Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) - by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id RAA15769; - Thu, 23 Sep 1999 17:27:38 -0400 (EDT) -To: Bruce Momjian <maillist@candle.pha.pa.us> -cc: Hannu Krosing <hannu@trust.ee>, hackers@postgreSQL.org, - pgsql-sql@postgreSQL.org -Subject: Re: [SQL] Re: [HACKERS] SELECT DISTINCT question -In-reply-to: Your message of Thu, 23 Sep 1999 13:18:18 -0400 (EDT) - <199909231718.NAA19629@candle.pha.pa.us> -Date: Thu, 23 Sep 1999 17:27:37 -0400 -Message-ID: <15767.938122057@sss.pgh.pa.us> -From: Tom Lane <tgl@sss.pgh.pa.us> -Status: ROr - -Bruce Momjian <maillist@candle.pha.pa.us> writes: -> Tom, any status on this DISTINCT ON ripout? - -I haven't done anything about it, if that's what you mean. - -I didn't get any indication of whether anyone else agreed with me -(maybe the lack of loud complaints should be taken as consent?) - - regards, tom lane - diff --git a/doc/TODO.detail/flock b/doc/TODO.detail/flock deleted file mode 100644 index 93d4e18e43d..00000000000 --- a/doc/TODO.detail/flock +++ /dev/null @@ -1,351 +0,0 @@ -From tgl@sss.pgh.pa.us Sun Aug 30 11:25:23 1998 -Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [206.210.65.6]) - by candle.pha.pa.us (8.8.5/8.8.5) with ESMTP id LAA12607 - for <maillist@candle.pha.pa.us>; Sun, 30 Aug 1998 11:25:20 -0400 (EDT) -Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) - by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id LAA15788; - Sun, 30 Aug 1998 11:23:38 -0400 (EDT) -To: Bruce Momjian <maillist@candle.pha.pa.us> -cc: dz@cs.unitn.it (Massimo Dal Zotto), hackers@postgreSQL.org -Subject: Re: [HACKERS] flock patch breaks things here -In-reply-to: Your message of Sun, 30 Aug 1998 08:19:52 -0400 (EDT) - <199808301219.IAA08821@candle.pha.pa.us> -Date: Sun, 30 Aug 1998 11:23:38 -0400 -Message-ID: <15786.904490618@sss.pgh.pa.us> -From: Tom Lane <tgl@sss.pgh.pa.us> -Status: RO - -Bruce Momjian <maillist@candle.pha.pa.us> writes: -> Can't we just have configure check for flock(). Another idea is to -> create a 'pid' file in the pgsql/data/base directory, and do a kill -0 -> to see if it is stil running before removing the lock. - -The latter approach is what I was going to suggest. Writing a pid file -would be a fine idea anyway --- for one thing, it makes it a lot easier -to write a "kill the postmaster" script. Given that the postmaster -should write a pid file, a new postmaster should look for an existing -pid file, and try to do a kill(pid, 0) on the number contained therein. -If this doesn't return an error, then you figure there is already a -postmaster running, complain, and exit. Otherwise you figure you is it, -(re)write the pid file and away you go. Then pqcomm.c can just -unconditionally delete any old file that's in the way of making the -pipe. - -The pidfile checking and creation probably ought to go in postmaster.c, -not down inside pqcomm.c. I never liked the fact that a critical -interlock function was being done by a low-level library that one might -not even want to invoke (if all your clients are using TCP, opening up -the Unix-domain socket is a waste of time, no?). - -BTW, there is another problem with relying on flock on the socket file -for this purpose: it opens up a hole for a denial-of-service attack. -Anyone who can write the file can flock it. (We already had a problem -with DOS via creating a dummy file at /tmp/.s.PGSQL.5432, but it would -be harder to spot the culprit with an flock-based interference.) - - regards, tom lane - -From owner-pgsql-hackers@hub.org Sun Aug 30 12:27:41 1998 -Received: from hub.org (hub.org [209.47.148.200]) - by candle.pha.pa.us (8.8.5/8.8.5) with ESMTP id MAA12976 - for <maillist@candle.pha.pa.us>; Sun, 30 Aug 1998 12:27:37 -0400 (EDT) -Received: from localhost (majordom@localhost) by hub.org (8.8.8/8.7.5) with SMTP id MAA09234; Sun, 30 Aug 1998 12:24:51 -0400 (EDT) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sun, 30 Aug 1998 12:23:26 +0000 (EDT) -Received: (from majordom@localhost) by hub.org (8.8.8/8.7.5) id MAA09167 for pgsql-hackers-outgoing; Sun, 30 Aug 1998 12:23:25 -0400 (EDT) -Received: from mambo.cs.unitn.it (mambo.cs.unitn.it [193.205.199.204]) by hub.org (8.8.8/8.7.5) with SMTP id MAA09150 for <hackers@postgreSQL.org>; Sun, 30 Aug 1998 12:23:08 -0400 (EDT) -Received: from boogie.cs.unitn.it (dz@boogie [193.205.199.79]) by mambo.cs.unitn.it (8.6.12/8.6.12) with ESMTP id SAA29572; Sun, 30 Aug 1998 18:21:42 +0200 -Received: (from dz@localhost) by boogie.cs.unitn.it (8.8.5/8.6.9) id SAA05993; Sun, 30 Aug 1998 18:21:41 +0200 -From: Massimo Dal Zotto <dz@cs.unitn.it> -Message-Id: <199808301621.SAA05993@boogie.cs.unitn.it> -Subject: Re: [HACKERS] flock patch breaks things here -To: hackers@postgreSQL.org (PostgreSQL Hackers) -Date: Sun, 30 Aug 1998 18:21:41 +0200 (MET DST) -Cc: tgl@sss.pgh.pa.us (Tom Lane) -In-Reply-To: <15786.904490618@sss.pgh.pa.us> from "Tom Lane" at Aug 30, 98 11:23:38 am -X-Mailer: ELM [version 2.4 PL24 ME4] -MIME-Version: 1.0 -Content-Type: text/plain; charset=iso-8859-1 -Content-Transfer-Encoding: 8bit -Sender: owner-pgsql-hackers@hub.org -Precedence: bulk -Status: ROr - -> -> Bruce Momjian <maillist@candle.pha.pa.us> writes: -> > Can't we just have configure check for flock(). Another idea is to -> > create a 'pid' file in the pgsql/data/base directory, and do a kill -0 -> > to see if it is stil running before removing the lock. -> -> The latter approach is what I was going to suggest. Writing a pid file -> would be a fine idea anyway --- for one thing, it makes it a lot easier -> to write a "kill the postmaster" script. Given that the postmaster -> should write a pid file, a new postmaster should look for an existing -> pid file, and try to do a kill(pid, 0) on the number contained therein. -> If this doesn't return an error, then you figure there is already a -> postmaster running, complain, and exit. Otherwise you figure you is it, -> (re)write the pid file and away you go. Then pqcomm.c can just -> unconditionally delete any old file that's in the way of making the -> pipe. -> -> The pidfile checking and creation probably ought to go in postmaster.c, -> not down inside pqcomm.c. I never liked the fact that a critical -> interlock function was being done by a low-level library that one might -> not even want to invoke (if all your clients are using TCP, opening up -> the Unix-domain socket is a waste of time, no?). -> -> BTW, there is another problem with relying on flock on the socket file -> for this purpose: it opens up a hole for a denial-of-service attack. -> Anyone who can write the file can flock it. (We already had a problem -> with DOS via creating a dummy file at /tmp/.s.PGSQL.5432, but it would -> be harder to spot the culprit with an flock-based interference.) - -This came to my mind, but I didn't think this would have happened so -quickly. In my opinion the socket and the pidfile should be created in a -directory owned by postgres, for example /tmp/.Pgsql-unix, like does X. - --- -Massimo Dal Zotto - -+----------------------------------------------------------------------+ -| Massimo Dal Zotto email: dz@cs.unitn.it | -| Via Marconi, 141 phone: ++39-461-534251 | -| 38057 Pergine Valsugana (TN) www: http://www.cs.unitn.it/~dz/ | -| Italy pgp: finger dz@tango.cs.unitn.it | -+----------------------------------------------------------------------+ - - -From owner-pgsql-hackers@hub.org Sun Aug 30 13:01:10 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.8.5/8.8.5) with ESMTP id NAA13785 - for <maillist@candle.pha.pa.us>; Sun, 30 Aug 1998 13:01:09 -0400 (EDT) -Received: from hub.org (hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id MAA29386 for <maillist@candle.pha.pa.us>; Sun, 30 Aug 1998 12:58:24 -0400 (EDT) -Received: from localhost (majordom@localhost) by hub.org (8.8.8/8.7.5) with SMTP id MAA11406; Sun, 30 Aug 1998 12:54:48 -0400 (EDT) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sun, 30 Aug 1998 12:52:22 +0000 (EDT) -Received: (from majordom@localhost) by hub.org (8.8.8/8.7.5) id MAA11310 for pgsql-hackers-outgoing; Sun, 30 Aug 1998 12:52:20 -0400 (EDT) -Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [206.210.65.6]) by hub.org (8.8.8/8.7.5) with ESMTP id MAA11296 for <hackers@postgreSQL.org>; Sun, 30 Aug 1998 12:52:13 -0400 (EDT) -Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) - by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id MAA16094; - Sun, 30 Aug 1998 12:50:55 -0400 (EDT) -To: Massimo Dal Zotto <dz@cs.unitn.it> -cc: hackers@postgreSQL.org (PostgreSQL Hackers) -Subject: Re: [HACKERS] flock patch breaks things here -In-reply-to: Your message of Sun, 30 Aug 1998 18:21:41 +0200 (MET DST) - <199808301621.SAA05993@boogie.cs.unitn.it> -Date: Sun, 30 Aug 1998 12:50:55 -0400 -Message-ID: <16092.904495855@sss.pgh.pa.us> -From: Tom Lane <tgl@sss.pgh.pa.us> -Sender: owner-pgsql-hackers@hub.org -Precedence: bulk -Status: RO - -Massimo Dal Zotto <dz@cs.unitn.it> writes: -> In my opinion the socket and the pidfile should be created in a -> directory owned by postgres, for example /tmp/.Pgsql-unix, like does X. - -The pidfile belongs at the top level of the database directory (eg, -/usr/local/pgsql/data/postmaster.pid), because what it actually -represents is that there is a postmaster running *for that database -group*. - -If you want to support multiple database sets on one machine (which I -do), then the interlock has to be per database directory. Putting the -pidfile into a common directory would mean we'd have to invent some -kind of pidfile naming convention to keep multiple postmasters from -tromping on each other. This is unnecessarily complex. - -I agree with you that putting the socket file into a less easily munged -directory than /tmp would be a good idea for security. But that's a -separate issue. On machines that understand stickybits for directories, -the security hole is not really very big. - -At this point, the fact that /tmp/.s.PGSQL.port# is the socket path is -effectively a version-independent aspect of the FE/BE protocol, and so -we can't change it without breaking old applications. I'm not sure that -that's worth the security improvement. - -What I'd like to see someday is a postmaster command line switch to tell -it to use *only* TCP connections and not create a Unix socket at all. -That hasn't been possible so far, because we were relying on the socket -file to provide a safety interlock against starting multiple -postmasters. But an interlock using a pidfile would be much better. -(Look around; *every* other Unix daemon I know of that wants to ensure -that there's only one of it uses a pidfile interlock. Not file locking. -There's a reason why that's the well-trodden path.) - - regards, tom lane - - -From owner-pgsql-hackers@hub.org Sun Aug 30 15:31:13 1998 -Received: from hub.org (hub.org [209.47.148.200]) - by candle.pha.pa.us (8.8.5/8.8.5) with ESMTP id PAA15275 - for <maillist@candle.pha.pa.us>; Sun, 30 Aug 1998 15:31:11 -0400 (EDT) -Received: from localhost (majordom@localhost) by hub.org (8.8.8/8.7.5) with SMTP id PAA22194; Sun, 30 Aug 1998 15:27:20 -0400 (EDT) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sun, 30 Aug 1998 15:23:58 +0000 (EDT) -Received: (from majordom@localhost) by hub.org (8.8.8/8.7.5) id PAA21800 for pgsql-hackers-outgoing; Sun, 30 Aug 1998 15:23:57 -0400 (EDT) -Received: from thelab.hub.org (nat0118.mpoweredpc.net [142.177.188.118]) by hub.org (8.8.8/8.7.5) with ESMTP id PAA21696 for <hackers@postgreSQL.org>; Sun, 30 Aug 1998 15:22:51 -0400 (EDT) -Received: from localhost (scrappy@localhost) - by thelab.hub.org (8.9.1/8.8.8) with SMTP id QAA18542; - Sun, 30 Aug 1998 16:21:29 -0300 (ADT) - (envelope-from scrappy@hub.org) -X-Authentication-Warning: thelab.hub.org: scrappy owned process doing -bs -Date: Sun, 30 Aug 1998 16:21:28 -0300 (ADT) -From: The Hermit Hacker <scrappy@hub.org> -To: Tom Lane <tgl@sss.pgh.pa.us> -cc: Massimo Dal Zotto <dz@cs.unitn.it>, - PostgreSQL Hackers <hackers@postgreSQL.org> -Subject: Re: [HACKERS] flock patch breaks things here -In-Reply-To: <16092.904495855@sss.pgh.pa.us> -Message-ID: <Pine.BSF.4.02.9808301618350.343-100000@thelab.hub.org> -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Sender: owner-pgsql-hackers@hub.org -Precedence: bulk -Status: RO - -On Sun, 30 Aug 1998, Tom Lane wrote: - -> Massimo Dal Zotto <dz@cs.unitn.it> writes: -> > In my opinion the socket and the pidfile should be created in a -> > directory owned by postgres, for example /tmp/.Pgsql-unix, like does X. -> -> The pidfile belongs at the top level of the database directory (eg, -> /usr/local/pgsql/data/postmaster.pid), because what it actually -> represents is that there is a postmaster running *for that database -> group*. - - I have to agree with this one...but then it also negates the -argument about the flock() DoS...*grin* - - BTW...I like the kill(pid,0) solution myself, primarily because it -is, i think, the most portable solution. - - I would not consider a patch to remove the flock() solution and -replace it with the kill(pid,0) solution a new feature, just an -improvement of an existing one...either way, moving the pid file (or -socket, for that matter) from /tmp should be listed as a security related -requirement for v6.4 :) - -Marc G. Fournier -Systems Administrator @ hub.org -primary: scrappy@hub.org secondary: scrappy@{freebsd|postgresql}.org - - - -From owner-pgsql-hackers@hub.org Sun Aug 30 22:41:10 1998 -Received: from hub.org (hub.org [209.47.148.200]) - by candle.pha.pa.us (8.8.5/8.8.5) with ESMTP id WAA01526 - for <maillist@candle.pha.pa.us>; Sun, 30 Aug 1998 22:41:08 -0400 (EDT) -Received: from localhost (majordom@localhost) by hub.org (8.8.8/8.7.5) with SMTP id WAA29298; Sun, 30 Aug 1998 22:38:18 -0400 (EDT) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sun, 30 Aug 1998 22:35:05 +0000 (EDT) -Received: (from majordom@localhost) by hub.org (8.8.8/8.7.5) id WAA29203 for pgsql-hackers-outgoing; Sun, 30 Aug 1998 22:35:03 -0400 (EDT) -Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [206.210.65.6]) by hub.org (8.8.8/8.7.5) with ESMTP id WAA29017 for <hackers@postgreSQL.org>; Sun, 30 Aug 1998 22:34:55 -0400 (EDT) -Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) - by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id WAA20075; - Sun, 30 Aug 1998 22:34:41 -0400 (EDT) -To: The Hermit Hacker <scrappy@hub.org> -cc: PostgreSQL Hackers <hackers@postgreSQL.org> -Subject: Re: [HACKERS] flock patch breaks things here -In-reply-to: Your message of Sun, 30 Aug 1998 16:21:28 -0300 (ADT) - <Pine.BSF.4.02.9808301618350.343-100000@thelab.hub.org> -Date: Sun, 30 Aug 1998 22:34:40 -0400 -Message-ID: <20073.904530880@sss.pgh.pa.us> -From: Tom Lane <tgl@sss.pgh.pa.us> -Sender: owner-pgsql-hackers@hub.org -Precedence: bulk -Status: ROr - -The Hermit Hacker <scrappy@hub.org> writes: -> either way, moving the pid file (or -> socket, for that matter) from /tmp should be listed as a security related -> requirement for v6.4 :) - -Huh? There is no pid file being generated in /tmp (or anywhere else) -at the moment. If we do add one, it should not go into /tmp for the -reasons I gave before. - -Where the Unix-domain socket file lives is an entirely separate issue. - -If we move the socket out of /tmp then we have just kicked away all the -work we did to preserve backwards compatibility of the FE/BE protocol -with existing clients. Being able to talk to a 1.0 client isn't much -good if you aren't listening where he's going to try to contact you. -So I think I have to vote in favor of leaving the socket where it is. - - regards, tom lane - - -From owner-pgsql-hackers@hub.org Mon Aug 31 11:31:19 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.8.5/8.8.5) with ESMTP id LAA21195 - for <maillist@candle.pha.pa.us>; Mon, 31 Aug 1998 11:31:13 -0400 (EDT) -Received: from hub.org (hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id LAA06827 for <maillist@candle.pha.pa.us>; Mon, 31 Aug 1998 11:17:41 -0400 (EDT) -Received: from localhost (majordom@localhost) by hub.org (8.8.8/8.7.5) with SMTP id LAA24792; Mon, 31 Aug 1998 11:12:18 -0400 (EDT) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Mon, 31 Aug 1998 11:10:31 +0000 (EDT) -Received: (from majordom@localhost) by hub.org (8.8.8/8.7.5) id LAA24742 for pgsql-hackers-outgoing; Mon, 31 Aug 1998 11:10:29 -0400 (EDT) -Received: from trillium.nmsu.edu (trillium.NMSU.Edu [128.123.5.15]) by hub.org (8.8.8/8.7.5) with ESMTP id LAA24725 for <hackers@postgreSQL.org>; Mon, 31 Aug 1998 11:10:22 -0400 (EDT) -Received: (from brook@localhost) - by trillium.nmsu.edu (8.8.8/8.8.8) id JAA03282; - Mon, 31 Aug 1998 09:09:01 -0600 (MDT) -Date: Mon, 31 Aug 1998 09:09:01 -0600 (MDT) -Message-Id: <199808311509.JAA03282@trillium.nmsu.edu> -From: Brook Milligan <brook@trillium.NMSU.Edu> -To: tgl@sss.pgh.pa.us -CC: dg@informix.com, hackers@postgreSQL.org -In-reply-to: <23042.904573041@sss.pgh.pa.us> (message from Tom Lane on Mon, 31 - Aug 1998 10:17:21 -0400) -Subject: Re: [HACKERS] flock patch breaks things here -References: <23042.904573041@sss.pgh.pa.us> -Sender: owner-pgsql-hackers@hub.org -Precedence: bulk -Status: ROr - - I just came up with an idea that might help alleviate the /tmp security - exposure without creating a backwards-compatibility problem. It works - like this: - - 1. During installation, create a subdirectory of /tmp to hold Postgres' - socket files and associated pid lockfiles. This subdirectory should be - owned by the Postgres superuser and have permissions 755 - (world-readable, writable only by Postgres superuser). Maybe call it - /tmp/.pgsql --- the name should start with a dot to keep it out of the - way. (Bruce points out that some systems clear /tmp during reboot, so - it might be that a postmaster will have to be prepared to recreate this - directory at startup --- anyone know if subdirectories of /tmp are - zapped too? My system doesn't do that...) - - ... - - I notice that on my system, the X11 socket files in /tmp/.X11-unix are - actually symlinks to socket files in /usr/spool/sockets/X11. I dunno if - it's worth our trouble to get into putting our sockets under /usr/spool - or /var/spool or whatever --- seems like another configuration choice to - mess up. It'd be nice if the socket directory lived somewhere where the - parent dirs weren't world-writable, but this would mean one more thing - that you have to have root permissions for in order to install pgsql. - -It seems like we need a directory for locks (= pid files) and one for -sockets (perhaps the same one). I strongly suggest that the location -for these be configurable. By default, it might make sense to put -them in ~pgsql/locks and ~pgsql/sockets. It is easy (i.e., I'll be -glad to do it) to modify configure.in to take options like - - --lock-dir=/var/spool/lock - --socket-dir=/var/spool/sockets - -that set cc defines and have the code respond accordingly. This way, -those who don't care (or don't have root access) can use the defaults, -whereas those with root access who like to keep locks and sockets in a -common place can do so easily. Either way, multiple postmasters (all -compiled with the same options of course) can check the appropriate -locks in the well-known places. Finally, drop the link into /tmp for -the old socket and document that it will be disappearing at some -point, and all is fine. - -If someone wants to give me some guidance on what preprocessor -variables should be set in response to the above options (or something -like them), I'll do the configure stuff. - -Cheers, -Brook - - diff --git a/doc/TODO.detail/fsync b/doc/TODO.detail/fsync deleted file mode 100644 index ae6de567fde..00000000000 --- a/doc/TODO.detail/fsync +++ /dev/null @@ -1,69 +0,0 @@ -From owner-pgsql-general@hub.org Fri Dec 18 06:31:23 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id GAA05554 - for <maillist@candle.pha.pa.us>; Fri, 18 Dec 1998 06:31:21 -0500 (EST) -Received: from hub.org (majordom@hub.org [209.47.145.100]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id EAA21127 for <maillist@candle.pha.pa.us>; Fri, 18 Dec 1998 04:46:38 -0500 (EST) -Received: from localhost (majordom@localhost) - by hub.org (8.9.1/8.9.1) with SMTP id EAA01409; - Fri, 18 Dec 1998 04:44:19 -0500 (EST) - (envelope-from owner-pgsql-general@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Fri, 18 Dec 1998 04:43:22 +0000 (EST) -Received: (from majordom@localhost) - by hub.org (8.9.1/8.9.1) id EAA01093 - for pgsql-general-outgoing; Fri, 18 Dec 1998 04:43:18 -0500 (EST) - (envelope-from owner-pgsql-general@postgreSQL.org) -Received: from dune.krs.ru (dune.krs.ru [195.161.16.38]) - by hub.org (8.9.1/8.9.1) with ESMTP id EAA01067 - for <pgsql-general@postgreSQL.org>; Fri, 18 Dec 1998 04:43:09 -0500 (EST) - (envelope-from vadim@krs.ru) -Received: from krs.ru (localhost.krs.ru [127.0.0.1]) - by dune.krs.ru (8.8.8/8.8.7) with ESMTP id QAA16201; - Fri, 18 Dec 1998 16:41:44 +0700 (KRS) - (envelope-from vadim@krs.ru) -Message-ID: <367A2354.E998763@krs.ru> -Date: Fri, 18 Dec 1998 16:41:40 +0700 -From: Vadim Mikheev <vadim@krs.ru> -Organization: OJSC Rostelecom (Krasnoyarsk) -X-Mailer: Mozilla 4.5 [en] (X11; I; FreeBSD 2.2.6-RELEASE i386) -X-Accept-Language: ru, en -MIME-Version: 1.0 -To: Anton de Wet <adw@obsidian.co.za> -CC: pgsql-general@postgreSQL.org -Subject: Re: [GENERAL] Why PostgreSQL is better than other commerial softwares? -References: <Pine.LNX.4.04.9812181046030.9458-100000@ra.obsidian.co.za> -Content-Type: text/plain; charset=us-ascii -Content-Transfer-Encoding: 7bit -Sender: owner-pgsql-general@postgreSQL.org -Precedence: bulk -Status: RO - -Anton de Wet wrote: -> -> > -> > Often quick mailing list support? -> -> :-) -> -> While on the subject I finally found the solution to a problem I (and one -> or two other people) posted about without answer. (So sometimes it's slow -> mailing list support). -> -> In importing about 5 million records (which I copy in blocks of 10000) the -> copy became linearly slower. After a friend RTFM and refered me, I used -> the -F switch (passed by the postmaster to the backend processes) and the -> time became linear and a LOT shorter. Import time for the 5000000 records -> now the same (or maybe even slightly faster, I didn't accurately time -> them) as importing the data into oracle on the same machine. - -"While on the subject..." -:) - -This is the problem of buffer manager, known for very long time: -when copy eats all buffers, manager begins write/fsync each -durty buffer to free buffer for new data. All updated relations -should be fsynced _once_ @ transaction commit. You would get -the same results without -F... -I still have no time to implement this -:( - -Vadim - - diff --git a/doc/TODO.detail/function b/doc/TODO.detail/function deleted file mode 100644 index d10a75a6f5e..00000000000 --- a/doc/TODO.detail/function +++ /dev/null @@ -1,616 +0,0 @@ -From tgl@sss.pgh.pa.us Mon Jun 14 20:50:41 1999 -Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [206.210.65.6]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id UAA19110 - for <maillist@candle.pha.pa.us>; Mon, 14 Jun 1999 20:50:39 -0400 (EDT) -Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) - by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id UAA21506; - Mon, 14 Jun 1999 20:51:07 -0400 (EDT) -To: Bruce Momjian <maillist@candle.pha.pa.us> -cc: Roman.Hodek@informatik.uni-erlangen.de, olly@lfix.co.uk, - PostgreSQL-development <pgsql-hackers@postgreSQL.org> -Subject: Cleaning up function interface (was Re: Patch for m68k architecture) -In-reply-to: Your message of Mon, 14 Jun 1999 17:53:25 -0400 (EDT) - <199906142153.RAA16276@candle.pha.pa.us> -Date: Mon, 14 Jun 1999 20:51:06 -0400 -Message-ID: <21504.929407866@sss.pgh.pa.us> -From: Tom Lane <tgl@sss.pgh.pa.us> -Status: RO - -Bruce Momjian <maillist@candle.pha.pa.us> writes: ->> ANSI C says results are undefined if you call a function via pointer ->> and the pointer is declared to return another type than the function ->> actually returns. So m68k compilers conform to the standard here. - -> Yes, we admit that we break the standard with fmgr_ptr, because we -> return a variety of values depending on what function they call. It -> appears the egcs optimization on the powerpc or alpha cause a problem -> when optimization is -O2, but not -O. We may see more platforms with -> problems as optimizers get smarter. - -Seeing as how we also know that the function-call interface ought to be -redesigned to handle NULLs better, maybe we should just bite the bullet -and fix all of these problems at once by adopting a new standard -interface for everything that can be called via fmgr. It'd uglify the -code, no doubt, but I think we are starting to see an accumulation of -problems that justify doing something. - -Here is a straw-man proposal: - - Datum function (bool *resultnull, - Datum *args, - bool *argnull, - int nargs) - -args[i] is the i'th parameter, or undefined (perhaps always 0?) -when argnull[i] is true. The function is responsible for setting -*resultnull, and returns a Datum value if *resultnull is false. -Most standard functions could ignore nargs since they'd know what it -should be, but we ought to pass it for flexibility. - -A useful addition to this scheme would be for fmgr to preset *resultnull -to the OR of the input argnull[] array just before calling the function. -In the typical case where the function is "strict" (ie, result is NULL -if any input is NULL), this would save the function from having to look -at argnull[] at all; it'd just check *resultnull and immediately return -if true. - -As an example, int4 addition goes from - -int32 -int4pl(int32 arg1, int32 arg2) -{ - return arg1 + arg2; -} - -to - -Datum -int4pl (bool *resultnull, Datum *args, bool *argnull, int nargs) -{ - if (*resultnull) - return (Datum) 0; /* value doesn't really matter ... */ - /* we can ignore argnull and nargs */ - - return Int32GetDatum(DatumGetInt32(args[0]) + DatumGetInt32(args[1])); -} - -This is, of course, much uglier than the existing code, but we might be -able to improve matters with some well-chosen macros for the boilerplate -parts. What we actually end up writing might look something like - -Datum -int4pl (PG_FUNCTION_ARGS) -{ - PG_STRICT_FUNCTION( /* encapsulates null check */ - PG_ARG0_INT32; - PG_ARG1_INT32; - - PG_RESULT_INT32( arg0 + arg1 ); - ); -} - -where the macros expand to things like "int32 arg0 = DatumGetInt32(args[0])" -and "return Int32GetDatum( x )". It'd be worth a little thought to -try to set up a group of macros like that, I think. - - regards, tom lane - -From owner-pgsql-hackers@hub.org Wed Sep 22 20:31:02 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id UAA15611 - for <maillist@candle.pha.pa.us>; Wed, 22 Sep 1999 20:31:01 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id UAA02926 for <maillist@candle.pha.pa.us>; Wed, 22 Sep 1999 20:21:24 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id UAA75413; - Wed, 22 Sep 1999 20:09:35 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 22 Sep 1999 20:08:50 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id UAA75058 - for pgsql-hackers-outgoing; Wed, 22 Sep 1999 20:06:58 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [209.114.166.2]) - by hub.org (8.9.3/8.9.3) with ESMTP id UAA74982 - for <pgsql-hackers@postgreSQL.org>; Wed, 22 Sep 1999 20:06:25 -0400 (EDT) - (envelope-from tgl@sss.pgh.pa.us) -Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) - by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id UAA06411 - for <pgsql-hackers@postgreSQL.org>; Wed, 22 Sep 1999 20:05:40 -0400 (EDT) -To: pgsql-hackers@postgreSQL.org -Subject: [HACKERS] Progress report: buffer refcount bugs and SQL functions -Date: Wed, 22 Sep 1999 20:05:39 -0400 -Message-ID: <6408.938045139@sss.pgh.pa.us> -From: Tom Lane <tgl@sss.pgh.pa.us> -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -I have been finding a lot of interesting stuff while looking into -the buffer reference count/leakage issue. - -It turns out that there were two specific things that were camouflaging -the existence of bugs in this area: - -1. The BufferLeakCheck routine that's run at transaction commit was -only looking for nonzero PrivateRefCount to indicate a missing unpin. -It failed to notice nonzero LastRefCount --- which meant that an -error in refcount save/restore usage could leave a buffer pinned, -and BufferLeakCheck wouldn't notice. - -2. The BufferIsValid macro, which you'd think just checks whether -it's handed a valid buffer identifier or not, actually did more: -it only returned true if the buffer ID was valid *and* the buffer -had positive PrivateRefCount. That meant that the common pattern - if (BufferIsValid(buf)) - ReleaseBuffer(buf); -wouldn't complain if it were handed a valid but already unpinned buffer. -And that behavior masks bugs that result in buffers being unpinned too -early. For example, consider a sequence like - -1. LockBuffer (buffer now has refcount 1). Store reference to - a tuple on that buffer page in a tuple table slot. -2. Copy buffer reference to a second tuple-table slot, but forget to - increment buffer's refcount. -3. Release second tuple table slot. Buffer refcount drops to 0, - so it's unpinned. -4. Release original tuple slot. Because of BufferIsValid behavior, - no assert happens here; in fact nothing at all happens. - -This is, of course, buggy code: during the interval from 3 to 4 you -still have an apparently valid tuple reference in the original slot, -which someone might try to use; but the buffer it points to is unpinned -and could be replaced at any time by another backend. - -In short, we had errors that would mask both missing-pin bugs and -missing-unpin bugs. And naturally there were a few such bugs lurking -behind them... - -3. The buffer refcount save/restore stuff, which I had suspected -was useless, is not only useless but also buggy. The reason it's -buggy is that it only works if used in a nested fashion. You could -save state A, pin some buffers, save state B, pin some more -buffers, restore state B (thereby unpinning what you pinned since -the save), and finally restore state A (unpinning the earlier stuff). -What you could not do is save state A, pin, save B, pin more, then -restore state A --- that might unpin some of A's buffers, or some -of B's buffers, or some unforeseen combination thereof. If you -restore A and then restore B, you do not necessarily return to a zero- -pins state, either. And it turns out the actual usage pattern was a -nearly random sequence of saves and restores, compounded by a failure to -do all of the restores reliably (which was masked by the oversight in -BufferLeakCheck). - - -What I have done so far is to rip out the buffer refcount save/restore -support (including LastRefCount), change BufferIsValid to a simple -validity check (so that you get an assert if you unpin something that -was pinned), change ExecStoreTuple so that it increments the refcount -when it is handed a buffer reference (for symmetry with ExecClearTuple's -decrement of the refcount), and fix about a dozen bugs exposed by these -changes. - -I am still getting Buffer Leak notices in the "misc" regression test, -specifically in the queries that invoke more than one SQL function. -What I find there is that SQL functions are not always run to -completion. Apparently, when a function can return multiple tuples, -it won't necessarily be asked to produce them all. And when it isn't, -postquel_end() isn't invoked for the function's current query, so its -tuple table isn't cleared, so we have dangling refcounts if any of the -tuples involved are in disk buffers. - -It may be that the save/restore code was a misguided attempt to fix -this problem. I can't tell. But I think what we really need to do is -find some way of ensuring that Postquel function execution contexts -always get shut down by the end of the query, so that they don't leak -resources. - -I suppose a straightforward approach would be to keep a list of open -function contexts somewhere (attached to the outer execution context, -perhaps), and clean them up at outer-plan shutdown. - -What I am wondering, though, is whether this addition is actually -necessary, or is it a bug that the functions aren't run to completion -in the first place? I don't really understand the semantics of this -"nested dot notation". I suppose it is a Berkeleyism; I can't find -anything about it in the SQL92 document. The test cases shown in the -misc regress test seem peculiar, not to say wrong. For example: - -regression=> SELECT p.hobbies.equipment.name, p.hobbies.name, p.name FROM person p; -name |name |name --------------+-----------+----- -advil |posthacking|mike -peet's coffee|basketball |joe -hightops |basketball |sally -(3 rows) - -which doesn't appear to agree with the contents of the underlying -relations: - -regression=> SELECT * FROM hobbies_r; -name |person ------------+------ -posthacking|mike -posthacking|jeff -basketball |joe -basketball |sally -skywalking | -(5 rows) - -regression=> SELECT * FROM equipment_r; -name |hobby --------------+----------- -advil |posthacking -peet's coffee|posthacking -hightops |basketball -guts |skywalking -(4 rows) - -I'd have expected an output along the lines of - -advil |posthacking|mike -peet's coffee|posthacking|mike -hightops |basketball |joe -hightops |basketball |sally - -Is the regression test's expected output wrong, or am I misunderstanding -what this query is supposed to do? Is there any documentation anywhere -about how SQL functions returning multiple tuples are supposed to -behave? - - regards, tom lane - -************ - - -From owner-pgsql-hackers@hub.org Thu Sep 23 11:03:19 1999 -Received: from hub.org (hub.org [216.126.84.1]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id LAA16211 - for <maillist@candle.pha.pa.us>; Thu, 23 Sep 1999 11:03:17 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id KAA58151; - Thu, 23 Sep 1999 10:53:46 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Thu, 23 Sep 1999 10:53:05 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id KAA57948 - for pgsql-hackers-outgoing; Thu, 23 Sep 1999 10:52:23 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [209.114.166.2]) - by hub.org (8.9.3/8.9.3) with ESMTP id KAA57841 - for <hackers@postgreSQL.org>; Thu, 23 Sep 1999 10:51:50 -0400 (EDT) - (envelope-from tgl@sss.pgh.pa.us) -Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) - by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id KAA14211; - Thu, 23 Sep 1999 10:51:10 -0400 (EDT) -To: Andreas Zeugswetter <andreas.zeugswetter@telecom.at> -cc: hackers@postgreSQL.org -Subject: Re: [HACKERS] Progress report: buffer refcount bugs and SQL functions -In-reply-to: Your message of Thu, 23 Sep 1999 10:07:24 +0200 - <37E9DFBC.5C0978F@telecom.at> -Date: Thu, 23 Sep 1999 10:51:10 -0400 -Message-ID: <14209.938098270@sss.pgh.pa.us> -From: Tom Lane <tgl@sss.pgh.pa.us> -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -Andreas Zeugswetter <andreas.zeugswetter@telecom.at> writes: -> That is what I use it for. I have never used it with a -> returns setof function, but reading the comments in the regression test, -> -- mike needs advil and peet's coffee, -> -- joe and sally need hightops, and -> -- everyone else is fine. -> it looks like the results you expected are correct, and currently the -> wrong result is given. - -Yes, I have concluded the same (and partially fixed it, per my previous -message). - -> Those that don't have a hobbie should return name|NULL|NULL. A hobbie -> that does'nt need equipment name|hobbie|NULL. - -That's a good point. Currently (both with and without my uncommitted -fix) you get *no* rows out from ExecTargetList if there are any Iters -that return empty result sets. It might be more reasonable to treat an -empty result set as if it were NULL, which would give the behavior you -suggest. - -This would be an easy change to my current patch, and I'm prepared to -make it before committing what I have, if people agree that that's a -more reasonable definition. Comments? - - regards, tom lane - -************ - - -From owner-pgsql-hackers@hub.org Thu Sep 23 04:31:15 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id EAA11344 - for <maillist@candle.pha.pa.us>; Thu, 23 Sep 1999 04:31:15 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id EAA05350 for <maillist@candle.pha.pa.us>; Thu, 23 Sep 1999 04:24:29 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id EAA85679; - Thu, 23 Sep 1999 04:16:26 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Thu, 23 Sep 1999 04:09:52 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id EAA84708 - for pgsql-hackers-outgoing; Thu, 23 Sep 1999 04:08:57 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -Received: from gandalf.telecom.at (gandalf.telecom.at [194.118.26.84]) - by hub.org (8.9.3/8.9.3) with ESMTP id EAA84632 - for <hackers@postgresql.org>; Thu, 23 Sep 1999 04:08:03 -0400 (EDT) - (envelope-from andreas.zeugswetter@telecom.at) -Received: from telecom.at (w0188000580.f000.d0188.sd.spardat.at [172.18.65.249]) - by gandalf.telecom.at (xxx/xxx) with ESMTP id KAA195294 - for <hackers@postgresql.org>; Thu, 23 Sep 1999 10:07:27 +0200 -Message-ID: <37E9DFBC.5C0978F@telecom.at> -Date: Thu, 23 Sep 1999 10:07:24 +0200 -From: Andreas Zeugswetter <andreas.zeugswetter@telecom.at> -X-Mailer: Mozilla 4.61 [en] (Win95; I) -X-Accept-Language: en -MIME-Version: 1.0 -To: hackers@postgreSQL.org -Subject: Re: [HACKERS] Progress report: buffer refcount bugs and SQL functions -Content-Type: text/plain; charset=us-ascii -Content-Transfer-Encoding: 7bit -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -> Is the regression test's expected output wrong, or am I -> misunderstanding -> what this query is supposed to do? Is there any -> documentation anywhere -> about how SQL functions returning multiple tuples are supposed to -> behave? - -They are supposed to behave somewhat like a view. -Not all rows are necessarily fetched. -If used in a context that needs a single row answer, -and the answer has multiple rows it is supposed to -runtime elog. Like in: - -select * from tbl where col=funcreturningmultipleresults(); --- this must elog - -while this is ok: -select * from tbl where col in (select funcreturningmultipleresults()); - -But the caller could only fetch the first row if he wanted. - -The nested notation is supposed to call the function passing it the tuple -as the first argument. This is what can be used to "fake" a column -onto a table (computed column). -That is what I use it for. I have never used it with a -returns setof function, but reading the comments in the regression test, --- mike needs advil and peet's coffee, --- joe and sally need hightops, and --- everyone else is fine. -it looks like the results you expected are correct, and currently the -wrong result is given. - -But I think this query could also elog whithout removing substantial -functionality. - -SELECT p.name, p.hobbies.name, p.hobbies.equipment.name FROM person p; - -Actually for me it would be intuitive, that this query return one row per -person, but elog on those that have more than one hobbie or a hobbie that -needs more than one equipment. Those that don't have a hobbie should -return name|NULL|NULL. A hobbie that does'nt need equipment name|hobbie|NULL. - -Andreas - -************ - - -From owner-pgsql-hackers@hub.org Wed Sep 22 22:01:07 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id WAA16360 - for <maillist@candle.pha.pa.us>; Wed, 22 Sep 1999 22:01:05 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id VAA08386 for <maillist@candle.pha.pa.us>; Wed, 22 Sep 1999 21:37:24 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id VAA88083; - Wed, 22 Sep 1999 21:28:11 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 22 Sep 1999 21:27:48 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id VAA87938 - for pgsql-hackers-outgoing; Wed, 22 Sep 1999 21:26:52 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -Received: from orion.SAPserv.Hamburg.dsh.de (Tpolaris2.sapham.debis.de [53.2.131.8]) - by hub.org (8.9.3/8.9.3) with SMTP id VAA87909 - for <pgsql-hackers@postgresql.org>; Wed, 22 Sep 1999 21:26:36 -0400 (EDT) - (envelope-from wieck@debis.com) -Received: by orion.SAPserv.Hamburg.dsh.de - for pgsql-hackers@postgresql.org - id m11TxXw-0003kLC; Thu, 23 Sep 99 03:19 MET DST -Message-Id: <m11TxXw-0003kLC@orion.SAPserv.Hamburg.dsh.de> -From: wieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] Progress report: buffer refcount bugs and SQL functions -To: tgl@sss.pgh.pa.us (Tom Lane) -Date: Thu, 23 Sep 1999 03:19:39 +0200 (MET DST) -Cc: pgsql-hackers@postgreSQL.org -Reply-To: wieck@debis.com (Jan Wieck) -In-Reply-To: <6408.938045139@sss.pgh.pa.us> from "Tom Lane" at Sep 22, 99 08:05:39 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -Tom Lane wrote: - -> [...] -> -> What I am wondering, though, is whether this addition is actually -> necessary, or is it a bug that the functions aren't run to completion -> in the first place? I don't really understand the semantics of this -> "nested dot notation". I suppose it is a Berkeleyism; I can't find -> anything about it in the SQL92 document. The test cases shown in the -> misc regress test seem peculiar, not to say wrong. For example: -> -> [...] -> -> Is the regression test's expected output wrong, or am I misunderstanding -> what this query is supposed to do? Is there any documentation anywhere -> about how SQL functions returning multiple tuples are supposed to -> behave? - - I've said some time (maybe too long) ago, that SQL functions - returning tuple sets are broken in general. This nested dot - notation (which I think is an artefact from the postquel - querylanguage) is implemented via set functions. - - Set functions have total different semantics from all other - functions. First they don't really return a tuple set as - someone might think - all that screwed up code instead - simulates that they return something you could consider a - scan of the last SQL statement in the function. Then, on - each subsequent call inside of the same command, they return - a "tupletable slot" containing the next found tuple (that's - why their Func node is mangled up after the first call). - - Second they have a targetlist what I think was originally - intended to extract attributes out of the tuples returned - when the above scan is asked to get the next tuple. But as I - read the code it invokes the function again and this might - cause the resource leakage you see. - - Third, all this seems to never have been implemented - (thought?) to the end. A targetlist doesn't make sense at - this place because it could at max contain a single attribute - - so a single attno would have the same power. And if set - functions could appear in the rangetable (FROM clause), than - they would be treated as that and regular Var nodes in the - query would do it. - - I think you shouldn't really care for that regression test - and maybe we should disable set functions until we really - implement stored procedures returning sets in the rangetable. - - Set functions where planned by Stonebraker's team as - something that today is called stored procedures. But AFAIK - they never reached the useful state because even in Postgres - 4.2 you haven't been able to get more than one attribute out - of a set function. It was a feature of the postquel - querylanguage that you could get one attribute from a set - function via - - RETRIEVE (attributename(setfuncname())) - - While working on the constraint triggers I've came across - another regression test (triggers :-) that's errorneous too. - The funny_dup17 trigger proc executes an INSERT into the same - relation where it get fired for by a previous INSERT. And it - stops this recursion only if it reaches a nesting level of - 17, which could only occur if it is fired DURING the - execution of it's own SPI_exec(). After Vadim quouted some - SQL92 definitions about when constraint checks and triggers - are to be executed, I decided to fire regular triggers at the - end of a query too. Thus, there is absolutely no nesting - possible for AFTER triggers resulting in an endless loop. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#========================================= wieck@debis.com (Jan Wieck) # - - - -************ - - -From owner-pgsql-hackers@hub.org Thu Sep 23 11:01:06 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id LAA16162 - for <maillist@candle.pha.pa.us>; Thu, 23 Sep 1999 11:01:04 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id KAA28544 for <maillist@candle.pha.pa.us>; Thu, 23 Sep 1999 10:45:54 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id KAA52943; - Thu, 23 Sep 1999 10:20:51 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Thu, 23 Sep 1999 10:19:58 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id KAA52472 - for pgsql-hackers-outgoing; Thu, 23 Sep 1999 10:19:03 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [209.114.166.2]) - by hub.org (8.9.3/8.9.3) with ESMTP id KAA52431 - for <pgsql-hackers@postgresql.org>; Thu, 23 Sep 1999 10:18:47 -0400 (EDT) - (envelope-from tgl@sss.pgh.pa.us) -Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) - by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id KAA13253; - Thu, 23 Sep 1999 10:18:02 -0400 (EDT) -To: wieck@debis.com (Jan Wieck) -cc: pgsql-hackers@postgreSQL.org -Subject: Re: [HACKERS] Progress report: buffer refcount bugs and SQL functions -In-reply-to: Your message of Thu, 23 Sep 1999 03:19:39 +0200 (MET DST) - <m11TxXw-0003kLC@orion.SAPserv.Hamburg.dsh.de> -Date: Thu, 23 Sep 1999 10:18:01 -0400 -Message-ID: <13251.938096281@sss.pgh.pa.us> -From: Tom Lane <tgl@sss.pgh.pa.us> -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -wieck@debis.com (Jan Wieck) writes: -> Tom Lane wrote: ->> What I am wondering, though, is whether this addition is actually ->> necessary, or is it a bug that the functions aren't run to completion ->> in the first place? - -> I've said some time (maybe too long) ago, that SQL functions -> returning tuple sets are broken in general. - -Indeed they are. Try this on for size (using the regression database): - - SELECT p.name, p.hobbies.equipment.name FROM person p; - SELECT p.hobbies.equipment.name, p.name FROM person p; - -You get different result sets!? - -The problem in this example is that ExecTargetList returns the isDone -flag from the last targetlist entry, regardless of whether there are -incomplete iterations in previous entries. More generally, the buffer -leak problem that I started with only occurs if some Iter nodes are not -run to completion --- but execQual.c has no mechanism to make sure that -they have all reached completion simultaneously. - -What we really need to make functions-returning-sets work properly is -an implementation somewhat like aggregate functions. We need to make -a list of all the Iter nodes present in a targetlist and cycle through -the values returned by each in a methodical fashion (run the rightmost -through its full cycle, then advance the next-to-rightmost one value, -run the rightmost through its cycle again, etc etc). Also there needs -to be an understanding of the hierarchy when an Iter appears in the -arguments of another Iter's function. (You cycle the upper one for -*each* set of arguments created by cycling its sub-Iters.) - -I am not particularly interested in working on this feature right now, -since AFAIK it's a Berkeleyism not found in SQL92. What I've done -is to hack ExecTargetList so that it behaves semi-sanely when there's -more than one Iter at the top level of the target list --- it still -doesn't really give the right answer, but at least it will keep -generating tuples until all the Iters are done at the same time. -It happens that that's enough to give correct answers for the examples -shown in the misc regress test. Even when it fails to generate all -the possible combinations, there will be no buffer leaks. - -So, I'm going to declare victory and go home ;-). We ought to add a -TODO item along the lines of - * Functions returning sets don't really work right -in hopes that someone will feel like tackling this someday. - - regards, tom lane - -************ - - diff --git a/doc/TODO.detail/limit b/doc/TODO.detail/limit deleted file mode 100644 index 83714b49ec2..00000000000 --- a/doc/TODO.detail/limit +++ /dev/null @@ -1,5708 +0,0 @@ -From owner-pgsql-hackers@hub.org Tue Oct 13 15:05:53 1998 -Received: from hub.org (majordom@hub.org [209.47.148.200]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id PAA09435 - for <maillist@candle.pha.pa.us>; Tue, 13 Oct 1998 15:05:50 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id OAA11700; - Tue, 13 Oct 1998 14:43:31 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Tue, 13 Oct 1998 14:41:03 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id OAA11395 - for pgsql-hackers-outgoing; Tue, 13 Oct 1998 14:41:00 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from terry1.acun.com (terry@terry1.acun.com [206.27.86.12]) - by hub.org (8.8.8/8.8.8) with ESMTP id OAA11372 - for <hackers@postgreSQL.org>; Tue, 13 Oct 1998 14:40:54 -0400 (EDT) - (envelope-from terry@terrym.com) -Received: from localhost (terry@localhost) - by terry1.acun.com (8.8.5/8.8.5) with SMTP id OAA09491 - for <hackers@postgreSQL.org>; Tue, 13 Oct 1998 14:53:22 -0400 -Date: Tue, 13 Oct 1998 14:53:22 -0400 (EDT) -From: Terry Mackintosh <terry@terrym.com> -X-Sender: terry@terry1.acun.com -Reply-To: Terry Mackintosh <terry@terrym.com> -To: PostgreSQL-development <hackers@postgreSQL.org> -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -In-Reply-To: <Pine.GSO.3.96.SK.981013211058.17758A-100000@ra> -Message-ID: <Pine.LNX.3.95.981013141634.9255C-100000@terry1.acun.com> -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: ROr - -Hi, my 2 cents... - -I agree completely, LIMIT would be VERY usefull in web based apps, which -is all I run. It does not matter to me if it is not part of a formal -standard. The idea is so common that it is a defacto standard. - -I would not expect it for this release, but could it get put on the TODO -list for next time? I am even willing to work at an apprentise level on -this with a more expeireanced person that knows this stuff. - -A note on implimentation: -I *used to* :) work with VFP on NT's :( -And the way VFP did LIMIT, it would only return the number of rows asked -for, BUT it still did the WHOLE search! -So on a larger table, which we had (property tax database for the county), -if some one put in too vague a query, it would try to collect ALL of the -rows as the initial result set, then give you the first x rows of that. - -This did save on pushing mass amounts of data out to the browser, but it -would have been even better if it could have simply aborted the select -after having found x rows. - -Also, it did not have the concept of an offset, so one could not select -100 rows, starting 200 rows in, which would be REALLY usefull for "paging" -through data. I do not know if mySQL or any other has such a concept -either, but it would be nice. - -So a properly implemented "LIMIT" could: -1. Save pushing mass amounts of data across the web, that no one wants -any way. -2. Stop vague queries from bogging down the server. -(On very larg tables this could be critical!) -3. Enable "Paging" of data. (easyer then now (app. level)) -4. Would be a very nice feather in PostgreSQL's cap that could make it -even more attractive to those looking at all sorts of databases out there. - -Have a great day. - -On Tue, 13 Oct 1998, Oleg Bartunov wrote: - -> Hi, -> -> I took a look at mysql and was very impressed with possibility -> to limit number of rows returned from select. This is very useful -> feature for Web applications when user need to browse results of -> selection page by page. In my application I have to do full -> select every time user press button [Next] and show requested page -> using perl. This works more or less ok for several thousands rows but -> totally unusable for large selections. But now I'm about to work -> with big database and I don't know how I'll stay with postgres :-) -> It'll just doesn't work if customer will wait several minutes just browse -> next page. Mysql lacks some useful features postgres has -> (subselects, transaction ..) but for most Web applications I need -> just select :-) I dont' know how LIMIT is implemented in Mysql and -> I know it's not in SQL92 standart, but this makes Mysql very popular. -> -> Is it difficult to implement this feature in postgres ? -> -> Regards, -> -> Oleg -> -> -> _____________________________________________________________ -> Oleg Bartunov, sci.researcher, hostmaster of AstroNet, -> Sternberg Astronomical Institute, Moscow University (Russia) -> Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/ -> phone: +007(095)939-16-83, +007(095)939-23-83 -> -> - -Terry Mackintosh <terry@terrym.com> http://www.terrym.com -sysadmin/owner Please! No MIME encoded or HTML mail, unless needed. - -Proudly powered by R H Linux 4.2, Apache 1.3, PHP 3, PostgreSQL 6.3 -------------------------------------------------------------------- -Success Is A Choice ... book by Rick Patino, get it, read it! - - - - -From owner-pgsql-hackers@hub.org Tue Oct 13 18:12:41 1998 -Received: from hub.org (majordom@hub.org [209.47.148.200]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id SAA12156 - for <maillist@candle.pha.pa.us>; Tue, 13 Oct 1998 18:12:39 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id RAA04181; - Tue, 13 Oct 1998 17:56:17 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Tue, 13 Oct 1998 17:54:49 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id RAA03869 - for pgsql-hackers-outgoing; Tue, 13 Oct 1998 17:54:47 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from remapcorp.com (root@remapcorp.com [206.196.37.193]) - by hub.org (8.8.8/8.8.8) with ESMTP id RAA03838 - for <hackers@postgreSQL.org>; Tue, 13 Oct 1998 17:54:36 -0400 (EDT) - (envelope-from jeff@remapcorp.com) -Received: from go-to-jail (gotojail.remapcorp.com [206.196.37.197]) - by remapcorp.com (8.8.7/8.8.7) with SMTP id QAA25337; - Tue, 13 Oct 1998 16:55:35 -0500 (CDT) - (envelope-from jeff@remapcorp.com) -Message-ID: <006701bdf6f4$60ed75f0$c525c4ce@go-to-jail.remapcorp.com> -From: "Jeff Hoffmann" <jeff@remapcorp.com> -To: "Marc G. Fournier" <scrappy@hub.org>, "Eric Lee Green" <eric@linux-hw.com> -Cc: "PostgreSQL-development" <hackers@postgreSQL.org> -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -Date: Tue, 13 Oct 1998 16:56:48 -0500 -MIME-Version: 1.0 -Content-Type: text/plain; - charset="iso-8859-1" -Content-Transfer-Encoding: 7bit -X-Priority: 3 -X-MSMail-Priority: Normal -X-Mailer: Microsoft Outlook Express 4.72.3115.0 -X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3 -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - ->On Tue, 13 Oct 1998, Eric Lee Green wrote: -> ->> On Tue, 13 Oct 1998, Jeff Hoffmann wrote: ->> > >I agree completely, LIMIT would be VERY usefull in web based apps, -which ->> > >is all I run. It does not matter to me if it is not part of a formal ->> > >standard. The idea is so common that it is a defacto standard. ->> > ->> > i'm not familiar with mysql and using "LIMIT" but wouldn't this same -effect ->> > be achieved by declaring a cursor and fetching however many records in -the ->> > cursor? it's a very noticeable improvement when you only want the -first 20 ->> > out of 500 in a 200k record database, at least. ->> ->> The problem with declaring a cursor vs. the "LIMIT" clause is that the ->> "LIMIT" clause, if used properly by the database engine (along with the ->> database engine using indexes in "ORDER BY" clauses) allows the database ->> engine to short-circuit the tail end of the query. That is, if you have -25 ->> names and the last one ends with BEAVIS, the database engine doesn't have ->> to go through the BUTTHEADS and KENNYs and etc. ->> ->> Theoretically a cursor is superior to the "LIMIT" clause because you're ->> eventually going to want the B's and K's and etc. anyhow -- but only in a ->> stateful enviornment. In the stateless web environment, a cursor is ->> useless because the connection can close at any time even when you're ->> using "persistent" connections (and of course when the connection closes ->> the cursor closes). -> ->Ookay, I'm sorry, butyou lost me here. I haven't gotten into using ->CURSORs/FETCHs yet, since I haven't need it...but can you give an example ->of what you would want to do using a LIMIT? I may be missing something, ->but wha is the different between using LIMIT to get X records, and ->definiing a cursor to FETCH X records? -> ->Practical example of *at least* the LIMIT side would be good, so that we ->can at least see a physical example of what LIMIT can do that ->CURSORs/FETCH can't... -> - - -fetch with cursors should work properly (i.e., you can short circuit it by -just ending your transaction) my understanding on how this works is exactly -how you explained LIMIT to work. here's some empirical proof from one of my -sample databases: - -the sample table i'm using has 156k records (names of people) -i'm using a PP180 with 128MB RAM and some old slow SCSI drives. - -public_mn=> select count(*) from public_ramsey; - count ------- -156566 -(1 row) - -i did the following query: -public_mn=> select * from public_ramsey where ownerlname ~ 'SMITH'; - -which returned 711 matches and took about 12 seconds. - -i did the same thing with a cursor: - -public_mn=> begin; -BEGIN -public_mn=> declare test cursor for select * from public_ramsey where -ownerlname ~ 'SMITH'; -SELECT - -the select was instantaneous. - -public_mn=> fetch 20 in test; - -returns 20 records almost instantaneously. each additional 20 took less -than a second, as well. - -if this isn't what you're talking about, i don't understand what you're -saying. - -jeff - - - -From eric@ireland.linux-hw.com Tue Oct 13 18:52:42 1998 -Received: from ireland.linux-hw.com (IDENT:eric@ireland.linux-hw.com [199.72.95.215]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id SAA12388 - for <maillist@candle.pha.pa.us>; Tue, 13 Oct 1998 18:52:40 -0400 (EDT) -Received: from localhost (eric@localhost) - by ireland.linux-hw.com (8.8.7/8.8.7) with SMTP id SAA31316; - Tue, 13 Oct 1998 18:55:22 -0400 -Date: Tue, 13 Oct 1998 18:55:22 -0400 (EDT) -From: Eric Lee Green <eric@linux-hw.com> -To: Bruce Momjian <maillist@candle.pha.pa.us> -cc: jeff@remapcorp.com, hackers@postgreSQL.org -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -In-Reply-To: <199810132116.RAA11249@candle.pha.pa.us> -Message-ID: <Pine.LNX.3.96.981013184022.31202B-100000@ireland.linux-hw.com> -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Status: RO - -On Tue, 13 Oct 1998, Bruce Momjian wrote: -> > Theoretically a cursor is superior to the "LIMIT" clause because you're -> > eventually going to want the B's and K's and etc. anyhow -- but only in a -> > stateful enviornment. In the stateless web environment, a cursor is -> > useless because the connection can close at any time even when you're -> > using "persistent" connections (and of course when the connection closes -> What we could do is _if_ there is only one table(no joins), and an index -> exists that matches the ORDER BY, we could use the index to -> short-circuit the query. - -This is exactly what MySQL does in this situation, except that it can use -the ORDER BY to do the short circuiting even if there is a join involved -if all of the elements of the ORDER BY belong to one table. Obviously if -I'm doing an "ORDER BY table1.foo table2.bar" that isn't going to work! -But "select table1.fsname,table1.lname,table2.receivables where -table2.receivables > 0 and table1.custnum=table2.custnum order by -(table1.lname,table1.fsname) limit 50" can be short-circuited by fiddling -with the join order -- table1.fsname table1.lname have to be the first two -things in the join order. - -Whether this is feasible in PostgreSQL I have no earthly idea. This would -seem to conflict with the join optimizer. - -> happier? If there is an ORDER BY and no index, or a join, I can't -> figure out how we would short-circuit the query. - -If there is an ORDER BY and no index you can't short-circuit the query. -MySQL doesn't either. Under certain circumstances (such as above) you can -short-circuit a join, but it's unclear whether it'd be easy to add such -a capability to PostgreSQL given the current structure of the query -optimizer. (And I certainly am not in a position to tackle it, at the -moment MySQL is sufficing for my project despite the fact that it is -quite limited compared to PostgreSQL, I need to get my project finished -first). - --- -Eric Lee Green eric@linux-hw.com http://www.linux-hw.com/~eric -"To call Microsoft an innovator is like calling the Pope Jewish ..." - -- James Love (Consumer Project on Technology) - - -From owner-pgsql-hackers@hub.org Wed Oct 14 09:01:01 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id JAA24574 - for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 09:01:00 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id HAA17762 for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 07:47:57 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id HAA09214; - Wed, 14 Oct 1998 07:04:59 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 14 Oct 1998 07:00:44 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id HAA09116 - for pgsql-hackers-outgoing; Wed, 14 Oct 1998 07:00:40 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id HAA09102 - for <hackers@postgreSQL.org>; Wed, 14 Oct 1998 07:00:27 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id NAA05037; Wed, 14 Oct 1998 13:02:40 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma004737; Wed, 14 Oct 98 13:02:09 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id MAA20155; - Wed, 14 Oct 1998 12:59:23 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id NAA20772; - Wed, 14 Oct 1998 13:01:35 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<eric@linux-hw.com>> - id m0zTMGL-000B5AC; Wed, 14 Oct 98 10:26 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for eric@linux-hw.com - id m0zTOnx-000EBRC; Wed, 14 Oct 98 13:09 MET DST -Message-Id: <m0zTOnx-000EBRC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: eric@linux-hw.com (Eric Lee Green) -Date: Wed, 14 Oct 1998 13:09:21 +0200 (MET DST) -Cc: jeff@remapcorp.com, hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <Pine.LNX.3.96.981013161955.30555A-100000@ireland.linux-hw.com> from "Eric Lee Green" at Oct 13, 98 04:24:20 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: ROr - -Eric Lee Green wrote: -> -> On Tue, 13 Oct 1998, Jeff Hoffmann wrote: -> > >I agree completely, LIMIT would be VERY usefull in web based apps, which -> > >is all I run. It does not matter to me if it is not part of a formal -> > >standard. The idea is so common that it is a defacto standard. -> > -> > i'm not familiar with mysql and using "LIMIT" but wouldn't this same effect -> > be achieved by declaring a cursor and fetching however many records in the -> > cursor? it's a very noticeable improvement when you only want the first 20 -> > out of 500 in a 200k record database, at least. -> -> The problem with declaring a cursor vs. the "LIMIT" clause is that the -> "LIMIT" clause, if used properly by the database engine (along with the -> database engine using indexes in "ORDER BY" clauses) allows the database -> engine to short-circuit the tail end of the query. That is, if you have 25 -> names and the last one ends with BEAVIS, the database engine doesn't have -> to go through the BUTTHEADS and KENNYs and etc. -> -> Theoretically a cursor is superior to the "LIMIT" clause because you're -> eventually going to want the B's and K's and etc. anyhow -- but only in a -> stateful enviornment. In the stateless web environment, a cursor is -> useless because the connection can close at any time even when you're -> using "persistent" connections (and of course when the connection closes -> the cursor closes). - - I'm missing something. Well it's right that in the stateless - web environment a cursor has to be declared and closed for - any single CGI call. But even if you have a LIMIT clause, - your CGI must know with which key to start. - - So your query must look like - - SELECT ... WHERE key > 'last processed key' ORDER BY key; - - And your key must be unique (or at least contain no duplicate - entries) or you might miss some rows between the pages (have - 100 Brown's in the table and last processed key was a Brown - while using LIMIT). - - In postgres you could actually do the following (but read on - below - it's not optimized correct) - - BEGIN; - DECLARE c CURSOR FOR SELECT ... WHERE key > 'last' ORDER BY key; - FETCH 20 IN c; - (process the 20 rows in CGI) - CLOSE c; - COMMIT; - - Having LIMIT looks more elegant and has less overhead in CGI- - backend communication. But the cursor version is SQL - standard and portable. - -> -> I wanted very badly to use PostgreSQL for a web project I'm working on, -> but it just wouldn't do the job :-(. - - I've done some tests and what I found out might be a bug in - PostgreSQL's query optimizer. Having a table with 25k rows - where key is a text field with a unique index. Now I used - EXPLAIN for some queries - - SELECT * FROM tab; - - results in a seqscan - expected. - - SELECT * FROM tab ORDER BY key; - - results in a sort->seqscan - I would have - expected an indexscan! - - SELECT * FROM tab WHERE key > 'G'; - - results in an indexscan - expected. - - SELECT * FROM tab WHERE key > 'G' ORDER BY key; - - results in a sort->indexscan - hmmm. - - These results stay the same even if I blow up the table by - duplicating all rows (now with a non-unique index) to 100k - rows and have them presorted in the table. - - Needless to say that everything is vacuum'd for statistics. - - The last one is the query we would need in the web - environment used over a cursor as in the example above. But - due to the sort, the backend selects until the end of the - table, sorts them and then returns only the first 20 rows - (out of sorts result). - - This is very painful if the qualification (key > ...) points - to the beginning of the key list. - - Looking at planner.c I can see, that if there is a sortClause - in the parsetree, the planner creates a sort node and does - absolutely not check if there is an index that could be used - to do it. In the examples above, the sort is absolutely - needless because the index scan will already return the - tuples in the right order :-). - - Somewhere deep in my brain I found a statement that sorting - sorted data isn't only unnecessary (except the order - changes), it is slow too compared against sorting randomly - ordered data. - - Can we fix this before 6.4 release, will it be a past 6.4 or - am I doing something wrong here? I think it isn't a fix (it's - a planner enhancement) so it should really be a past 6.4 - item. - - For now, the only possibility is to omit the ORDER BY in the - query and hope the planner will always generate an index scan - (because of the qualification 'key > ...'). Doing so I - selected multiple times 20 rows (with the last key qual like - a CGI would do) in separate transactions. Using cursor and - fetch speeds up the access by a factor of 1000! But it is - unsafe and thus NOT RECOMMENDED! It's only a test if cursors - can do the LIMIT job - and they could if the planner would do - a better job. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - - -From owner-pgsql-hackers@hub.org Wed Oct 14 11:02:04 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id LAA25519 - for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 11:02:02 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id JAA24583 for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 09:46:21 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id IAA17022; - Wed, 14 Oct 1998 08:59:20 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 14 Oct 1998 08:54:40 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id IAA16687 - for pgsql-hackers-outgoing; Wed, 14 Oct 1998 08:54:34 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from ra.sai.msu.su (ra.sai.msu.su [158.250.29.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id IAA16656 - for <hackers@postgreSQL.org>; Wed, 14 Oct 1998 08:54:00 -0400 (EDT) - (envelope-from oleg@sai.msu.su) -Received: from ra (ra [158.250.29.2]) - by ra.sai.msu.su (8.9.1/8.9.1) with SMTP id PAA11714; - Wed, 14 Oct 1998 15:53:53 +0300 (MSK) -Date: Wed, 14 Oct 1998 16:53:53 +0400 (MSD) -From: Oleg Bartunov <oleg@sai.msu.su> -X-Sender: megera@ra -Reply-To: Oleg Bartunov <oleg@sai.msu.su> -To: hackers@postgreSQL.org -cc: t-ishii@sra.co.jp -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -In-Reply-To: <m0zTOnx-000EBRC@orion.SAPserv.Hamburg.dsh.de> -Message-ID: <Pine.GSO.3.96.SK.981014163020.10948B-100000@ra> -Organization: Sternberg Astronomical Institute (Moscow University) -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -On Wed, 14 Oct 1998, Jan Wieck wrote: - -> Date: Wed, 14 Oct 1998 13:09:21 +0200 (MET DST) -> From: Jan Wieck <jwieck@debis.com> -> To: Eric Lee Green <eric@linux-hw.com> -> Cc: jeff@remapcorp.com, hackers@postgreSQL.org -> Subject: Re: [HACKERS] What about LIMIT in SELECT ? -> -> Eric Lee Green wrote: -> > -> > On Tue, 13 Oct 1998, Jeff Hoffmann wrote: -> > > >I agree completely, LIMIT would be VERY usefull in web based apps, which -> > > >is all I run. It does not matter to me if it is not part of a formal -> > > >standard. The idea is so common that it is a defacto standard. -> > > -> > > i'm not familiar with mysql and using "LIMIT" but wouldn't this same effect -> > > be achieved by declaring a cursor and fetching however many records in the -> > > cursor? it's a very noticeable improvement when you only want the first 20 -> > > out of 500 in a 200k record database, at least. -> > -> > The problem with declaring a cursor vs. the "LIMIT" clause is that the -> > "LIMIT" clause, if used properly by the database engine (along with the -> > database engine using indexes in "ORDER BY" clauses) allows the database -> > engine to short-circuit the tail end of the query. That is, if you have 25 -> > names and the last one ends with BEAVIS, the database engine doesn't have -> > to go through the BUTTHEADS and KENNYs and etc. -> > -> > Theoretically a cursor is superior to the "LIMIT" clause because you're -> > eventually going to want the B's and K's and etc. anyhow -- but only in a -> > stateful enviornment. In the stateless web environment, a cursor is -> > useless because the connection can close at any time even when you're -> > using "persistent" connections (and of course when the connection closes -> > the cursor closes). -> -> I'm missing something. Well it's right that in the stateless -> web environment a cursor has to be declared and closed for -> any single CGI call. But even if you have a LIMIT clause, -> your CGI must know with which key to start. -> - This is not a problem for CGI-script to know which key to start. - Without LIMIT every CGI call backend will do *FULL* selection - and cursor helps just in fetching a definite number of rows, - in principle I can do this with CGI-script. Also, cursor - returns data back in ASCII format (man l declare) and this requires - additional job for backend to convert data from intrinsic (binary) - format. Right implementation of LIMIT offset,number_of_rows could be - a great win and make postgres superior free database engine for - Web applications. Many colleagues of mine used mysql instead of - postgres just because of lacking LIMIT. Tatsuo posted a patch - for set query_limit to 'num', I just tested it and seems it - works fine. Now, we need only possibility to specify offset, - say - set query_limit to 'offset,num' - ( Tatsuo, How difficult to do this ?) - and LIMIT problem will ne gone. - - I'm wonder how many useful patches could be hidden from people :-), - - Regards, - - Oleg - -PS. - - Tatsuo, do you have patch for 6.3.2 ? - I can't wait for 6.4 :-) -_____________________________________________________________ -Oleg Bartunov, sci.researcher, hostmaster of AstroNet, -Sternberg Astronomical Institute, Moscow University (Russia) -Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/ -phone: +007(095)939-16-83, +007(095)939-23-83 - - - - - -From owner-pgsql-hackers@hub.org Wed Oct 14 11:02:00 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id LAA25510 - for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 11:01:59 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id KAA28854 for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 10:40:56 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id KAA21542; - Wed, 14 Oct 1998 10:03:45 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 14 Oct 1998 09:59:10 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id JAA21121 - for pgsql-hackers-outgoing; Wed, 14 Oct 1998 09:59:08 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from golem.jpl.nasa.gov (root@hectic-2.jpl.nasa.gov [128.149.68.204]) - by hub.org (8.8.8/8.8.8) with ESMTP id JAA21106 - for <hackers@postgreSQL.org>; Wed, 14 Oct 1998 09:59:02 -0400 (EDT) - (envelope-from lockhart@alumni.caltech.edu) -Received: from alumni.caltech.edu (localhost [127.0.0.1]) - by golem.jpl.nasa.gov (8.8.5/8.8.5) with ESMTP id NAA19587; - Wed, 14 Oct 1998 13:59:56 GMT -Message-ID: <3624AE5C.752E4E7F@alumni.caltech.edu> -Date: Wed, 14 Oct 1998 13:59:56 +0000 -From: "Thomas G. Lockhart" <lockhart@alumni.caltech.edu> -Organization: Caltech/JPL -X-Mailer: Mozilla 4.07 [en] (X11; I; Linux 2.0.30 i686) -MIME-Version: 1.0 -To: Jan Wieck <jwieck@debis.com> -CC: Eric Lee Green <eric@linux-hw.com>, jeff@remapcorp.com, - hackers@postgreSQL.org -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -References: <m0zTOnx-000EBRC@orion.SAPserv.Hamburg.dsh.de> -Content-Type: text/plain; charset=us-ascii -Content-Transfer-Encoding: 7bit -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: ROr - -> I've done some tests and what I found out might be a bug in -> PostgreSQL's query optimizer. -> SELECT * FROM tab ORDER BY key; -> results in a sort->seqscan - I would have -> expected an indexscan! - -Given that a table _could_ be completely unsorted on disk, it is -probably reasonable to suck the data in for a possible in-memory sort -rather than skipping around the disk to pick up individual tuples via -the index. Don't know if vacuum has a statistic on "orderness"... - -> SELECT * FROM tab WHERE key > 'G' ORDER BY key; -> results in a sort->indexscan - hmmm. -> The last one is the query we would need in the web -> environment used over a cursor as in the example above. But -> due to the sort, the backend selects until the end of the -> table, sorts them and then returns only the first 20 rows -> (out of sorts result). - -So you are saying that for this last case the sort was unnecessary? Does -the backend traverse the index in the correct order to guarantee that -the tuples are coming out already sorted? Does a hash index give the -same plan (I would expect a sort->seqscan for a hash index)? - - - Tom - - -From owner-pgsql-hackers@hub.org Wed Oct 14 11:01:52 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id LAA25504 - for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 11:01:51 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id KAA00198 for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 10:57:15 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id KAA22877; - Wed, 14 Oct 1998 10:19:47 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 14 Oct 1998 10:15:44 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id KAA22675 - for pgsql-hackers-outgoing; Wed, 14 Oct 1998 10:15:41 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id KAA22657 - for <hackers@postgreSQL.org>; Wed, 14 Oct 1998 10:15:32 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id QAA20563; Wed, 14 Oct 1998 16:18:02 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma020404; Wed, 14 Oct 98 16:17:25 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id QAA05077; - Wed, 14 Oct 1998 16:14:48 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id QAA22248; - Wed, 14 Oct 1998 16:17:06 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<hackers@postgreSQL.org>> - id m0zTPJb-000B5AC; Wed, 14 Oct 98 13:42 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for hackers@postgreSQL.org - id m0zTRrE-000EBRC; Wed, 14 Oct 98 16:24 MET DST -Message-Id: <m0zTRrE-000EBRC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: oleg@sai.msu.su -Date: Wed, 14 Oct 1998 16:24:56 +0200 (MET DST) -Cc: hackers@postgreSQL.org, t-ishii@sra.co.jp -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <Pine.GSO.3.96.SK.981014163020.10948B-100000@ra> from "Oleg Bartunov" at Oct 14, 98 04:53:53 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -Oleg Bartunov wrote: -> This is not a problem for CGI-script to know which key to start. - - Never meant that would be a problem. A FORM variable will of - course do this. - -> Without LIMIT every CGI call backend will do *FULL* selection -> and cursor helps just in fetching a definite number of rows, -> in principle I can do this with CGI-script. Also, cursor -> returns data back in ASCII format (man l declare) and this requires -> additional job for backend to convert data from intrinsic (binary) -> format. Right implementation of LIMIT offset,number_of_rows could be -> a great win and make postgres superior free database engine for -> Web applications. Many colleagues of mine used mysql instead of - - That's the point I was missing. The offset! - -> postgres just because of lacking LIMIT. Tatsuo posted a patch -> for set query_limit to 'num', I just tested it and seems it -> works fine. Now, we need only possibility to specify offset, -> say -> set query_limit to 'offset,num' -> ( Tatsuo, How difficult to do this ?) -> and LIMIT problem will ne gone. - - Think you haven't read my posting completely. Even with the - executor limit, the complete scan into the sort is done by - the backend. You need to specify ORDER BY to get the same - list again (without the offset doesn't make sense). But - currently, ORDER BY forces a sort node into the query plan. - - What the executor limit tells is how many rows will be - returned from the sorted data. Not what goes into the sort. - Filling the sort and sorting the data consumes the most time - of the queries execution. - - I haven't looked at Tatsuo's patch very well. But if it - limits the amount of data going into the sort (on ORDER BY), - it will break it! The requested ordering could be different - from what the choosen index might return. The used index is - choosen by the planner upon the qualifications given, not the - ordering wanted. - - So if you select WHERE b = 1 ORDER BY a, then it will use an - index on attribute b to match the qualification. The complete - result of that index scan goes into the sort to get ordered - by a. If now the executor limit stops sort filling after the - limit is exceeded, only the same tuples will go into the sort - every time. But they have nothing to do with the requested - order by a. - - What LIMIT first needs is a planner enhancement. In file - backend/optimizer/plan/planner.c line 284 it must be checked - if the actual plan is an indexscan, if the indexed attributes - are all the same as those in the given sort clause and that - the requested sort order (operator) is that what the index - will return. If that all matches, it can ignore the sort - clause and return the index scan itself. - - Second enhancement must be the handling of the offset. In - the executor, the index scan must skip offset index tuples - before returning the first. But NOT if the plan isn't a - 1-table-index-scan. In that case the result tuples (from the - topmost unique/join/whatever node) have to be skipped. - - With these enhancements, the index tuples to be skipped - (offset) will still be scanned, but not the data tuples they - point to. Index scanning might be somewhat faster. - - This all will only speedup simple 1-table-queries, no joins - or if the requested order isn't that what the index exactly - returns. - - Anyway, I'll take a look if I can change the planner to omit - the sort if the tests described above are true. I think it - would be good anyway. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - - -From owner-pgsql-hackers@hub.org Wed Oct 14 11:01:36 1998 -Received: from hub.org (majordom@hub.org [209.47.148.200]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id LAA25489 - for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 11:01:34 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id KAA24286; - Wed, 14 Oct 1998 10:30:14 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 14 Oct 1998 10:26:34 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id KAA23732 - for pgsql-hackers-outgoing; Wed, 14 Oct 1998 10:26:27 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id KAA23717 - for <hackers@postgreSQL.org>; Wed, 14 Oct 1998 10:26:13 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id QAA25644; Wed, 14 Oct 1998 16:28:01 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma025301; Wed, 14 Oct 98 16:27:43 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id QAA05943; - Wed, 14 Oct 1998 16:24:42 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id QAA22339; - Wed, 14 Oct 1998 16:26:57 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<lockhart@alumni.caltech.edu>> - id m0zTPT8-000B5AC; Wed, 14 Oct 98 13:51 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for lockhart@alumni.caltech.edu - id m0zTS0m-000EBRC; Wed, 14 Oct 98 16:34 MET DST -Message-Id: <m0zTS0m-000EBRC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: lockhart@alumni.caltech.edu (Thomas G. Lockhart) -Date: Wed, 14 Oct 1998 16:34:47 +0200 (MET DST) -Cc: jwieck@debis.com, eric@linux-hw.com, jeff@remapcorp.com, - hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <3624AE5C.752E4E7F@alumni.caltech.edu> from "Thomas G. Lockhart" at Oct 14, 98 01:59:56 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -> -> > SELECT * FROM tab WHERE key > 'G' ORDER BY key; -> > results in a sort->indexscan - hmmm. -> > The last one is the query we would need in the web -> > environment used over a cursor as in the example above. But -> > due to the sort, the backend selects until the end of the -> > table, sorts them and then returns only the first 20 rows -> > (out of sorts result). -> -> So you are saying that for this last case the sort was unnecessary? Does -> the backend traverse the index in the correct order to guarantee that -> the tuples are coming out already sorted? Does a hash index give the -> same plan (I would expect a sort->seqscan for a hash index)? - - Good point! As far as I can see, the planner chooses index - usage only depending on the WHERE clause. A hash index is - only usable when the given qualification uses = on the - indexed attribute(s). - - If the sortClause exactly matches the indexed attributes of - the ONE used btree index and all operators request ascending - order I think the index scan already returns the correct - order. Who know's definitely? - - Addition to my last posting: ... and if the index scan is - using a btree index ... - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - - -From owner-pgsql-hackers@hub.org Wed Oct 14 13:55:58 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id NAA29300 - for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 13:55:56 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id NAA14245 for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 13:49:19 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id NAA13110; - Wed, 14 Oct 1998 13:25:55 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 14 Oct 1998 13:22:14 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id NAA12694 - for pgsql-hackers-outgoing; Wed, 14 Oct 1998 13:22:13 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from candle.pha.pa.us (maillist@s5-03.ppp.op.net [209.152.195.67]) - by hub.org (8.8.8/8.8.8) with ESMTP id NAA12677 - for <hackers@postgreSQL.org>; Wed, 14 Oct 1998 13:22:05 -0400 (EDT) - (envelope-from maillist@candle.pha.pa.us) -Received: (from maillist@localhost) - by candle.pha.pa.us (8.9.0/8.9.0) id NAA28746; - Wed, 14 Oct 1998 13:21:15 -0400 (EDT) -From: Bruce Momjian <maillist@candle.pha.pa.us> -Message-Id: <199810141721.NAA28746@candle.pha.pa.us> -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -In-Reply-To: <3624AE5C.752E4E7F@alumni.caltech.edu> from "Thomas G. Lockhart" at "Oct 14, 1998 1:59:56 pm" -To: lockhart@alumni.caltech.edu (Thomas G. Lockhart) -Date: Wed, 14 Oct 1998 13:21:15 -0400 (EDT) -Cc: jwieck@debis.com, eric@linux-hw.com, jeff@remapcorp.com, - hackers@postgreSQL.org -X-Mailer: ELM [version 2.4ME+ PL47 (25)] -MIME-Version: 1.0 -Content-Type: text/plain; charset=US-ASCII -Content-Transfer-Encoding: 7bit -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: ROr - -> > I've done some tests and what I found out might be a bug in -> > PostgreSQL's query optimizer. -> > SELECT * FROM tab ORDER BY key; -> > results in a sort->seqscan - I would have -> > expected an indexscan! -> -> Given that a table _could_ be completely unsorted on disk, it is -> probably reasonable to suck the data in for a possible in-memory sort -> rather than skipping around the disk to pick up individual tuples via -> the index. Don't know if vacuum has a statistic on "orderness"... - -Thomas is correct on this. Vadim has run some tests, and with our -optimized psort() code, the in-memory sort is often faster than using -the index to get the tuple, because you are jumping all over the drive. -I don't remember, but obviously there is a break-even point where -getting X rows using the index on a table of Y rows is faster , but -getting X+1 rows on a table of Y rows is faster getting all the rows -sequentailly, and doing the sort. - -You would have to pick only certain queries(no joins, index matches -ORDER BY), take the number of rows requested, and the number of rows -selected, and figure out if it is faster to use the index, or a -sequential scan and do the ORDER BY yourself. - - -Add to this the OFFSET capability. I am not sure how you are going to -get into the index and start at the n-th entry, unless perhaps you just -sequential scan the index. - -In fact, many queries just get column already indexed, and we could just -pull the data right out of the index. - -I have added this to the TODO list: - - * Pull requested data directly from indexes, bypassing heap data - -I think this has to be post-6.4 work, but I think we need to work in -this direction. I am holding off any cnfify fixes for post-6.4, but a -6.4.1 performance release certainly is possible. - - -But, you are correct that certain cases where in index is already being -used on a query, you could just skip the sort IF you used the index to -get the rows from the base table. - --- - Bruce Momjian | http://www.op.net/~candle - maillist@candle.pha.pa.us | (610) 853-3000 - + If your life is a hard drive, | 830 Blythe Avenue - + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 - - -From owner-pgsql-hackers@hub.org Wed Oct 14 13:55:59 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id NAA29303 - for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 13:55:58 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id NAA13463 for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 13:39:05 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id NAA11655; - Wed, 14 Oct 1998 13:13:32 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 14 Oct 1998 13:09:41 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id NAA11013 - for pgsql-hackers-outgoing; Wed, 14 Oct 1998 13:09:39 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from terry1.acun.com (terry@terry1.acun.com [206.27.86.12]) - by hub.org (8.8.8/8.8.8) with ESMTP id NAA10997 - for <hackers@postgreSQL.org>; Wed, 14 Oct 1998 13:09:30 -0400 (EDT) - (envelope-from terry@terrym.com) -Received: from localhost (terry@localhost) - by terry1.acun.com (8.8.5/8.8.5) with SMTP id NAA14478; - Wed, 14 Oct 1998 13:21:51 -0400 -Date: Wed, 14 Oct 1998 13:21:51 -0400 (EDT) -From: Terry Mackintosh <terry@terrym.com> -X-Sender: terry@terry1.acun.com -To: Jeff Hoffmann <jeff@remapcorp.com> -cc: PostgreSQL-development <hackers@postgreSQL.org> -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -In-Reply-To: <005101bdf6de$f9345150$c525c4ce@go-to-jail.remapcorp.com> -Message-ID: <Pine.LNX.3.95.981014130857.14397B-100000@terry1.acun.com> -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -On Tue, 13 Oct 1998, Jeff Hoffmann wrote: - -> >Hi, my 2 cents... -> > -> >I agree completely, LIMIT would be VERY usefull in web based apps, which -> >is all I run. It does not matter to me if it is not part of a formal -> >standard. The idea is so common that it is a defacto standard. -> -> i'm not familiar with mysql and using "LIMIT" but wouldn't this same effect -> be achieved by declaring a cursor and fetching however many records in the -> cursor? it's a very noticeable improvement when you only want the first 20 -> out of 500 in a 200k record database, at least. - -Yes, while this is an improvement, it still has to do the entire query, -would be nice if the query could be terminated after a designated number -of rows where found, thus freeing system resources that are other wise -consumed. -I have seen web users run ridculous querys, like search for the -letter 'a', and it happens to be a substring search, now the box go'es ape -shit for 5 or 10 min.s while it basically gets the whole db as the search -result. All this befor you can do a 'FETCH', as I understand FETCH, I -will need to read up on it. - -Note that I do not have any databases that larg on my box, I was thinking -back to my VFP/NT experiances. - -Have a great day -Terry Mackintosh <terry@terrym.com> http://www.terrym.com -sysadmin/owner Please! No MIME encoded or HTML mail, unless needed. - -Proudly powered by R H Linux 4.2, Apache 1.3, PHP 3, PostgreSQL 6.3 -------------------------------------------------------------------- -Success Is A Choice ... book by Rick Patino, get it, read it! - - - -From owner-pgsql-hackers@hub.org Wed Oct 14 13:59:05 1998 -Received: from hub.org (majordom@hub.org [209.47.148.200]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id NAA29345 - for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 13:58:59 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id NAA14021; - Wed, 14 Oct 1998 13:32:51 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 14 Oct 1998 13:29:09 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id NAA13364 - for pgsql-hackers-outgoing; Wed, 14 Oct 1998 13:29:07 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from terry1.acun.com (terry@terry1.acun.com [206.27.86.12]) - by hub.org (8.8.8/8.8.8) with ESMTP id NAA13328 - for <hackers@postgreSQL.org>; Wed, 14 Oct 1998 13:28:56 -0400 (EDT) - (envelope-from terry@terrym.com) -Received: from localhost (terry@localhost) - by terry1.acun.com (8.8.5/8.8.5) with SMTP id NAA14606 - for <hackers@postgreSQL.org>; Wed, 14 Oct 1998 13:41:25 -0400 -Date: Wed, 14 Oct 1998 13:41:24 -0400 (EDT) -From: Terry Mackintosh <terry@terrym.com> -X-Sender: terry@terry1.acun.com -To: PostgreSQL-development <hackers@postgreSQL.org> -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -In-Reply-To: <199810132116.RAA11249@candle.pha.pa.us> -Message-ID: <Pine.LNX.3.95.981014133641.14397D-100000@terry1.acun.com> -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -On Tue, 13 Oct 1998, Bruce Momjian wrote: - -> What we could do is _if_ there is only one table(no joins), and an index -> exists that matches the ORDER BY, we could use the index to -> short-circuit the query. -> -> I have added this item to the TODO list: -> -> * Allow LIMIT ability on single-table queries that have no ORDER BY or -> a matching index -> -> This looks do-able, and a real win. Would this make web applications -> happier? If there is an ORDER BY and no index, or a join, I can't -> figure out how we would short-circuit the query. -> -Yes, this would do for most of my apps. -It may just be my lack of sophistication, but I find that most web apps -are very simple in nature/table layout, and thus queries are often on only -a single table. - -Thanks -Terry Mackintosh <terry@terrym.com> http://www.terrym.com -sysadmin/owner Please! No MIME encoded or HTML mail, unless needed. - -Proudly powered by R H Linux 4.2, Apache 1.3, PHP 3, PostgreSQL 6.3 -------------------------------------------------------------------- -Success Is A Choice ... book by Rick Patino, get it, read it! - - - -From wieck@sapserv.debis.de Wed Oct 14 13:55:53 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id NAA29290 - for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 13:55:51 -0400 (EDT) -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id NAA14370 for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 13:51:19 -0400 (EDT) -Received: by dsh.de; id TAA03418; Wed, 14 Oct 1998 19:50:18 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma003369; Wed, 14 Oct 98 19:49:51 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id TAA16746; - Wed, 14 Oct 1998 19:47:14 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id TAA23570; - Wed, 14 Oct 1998 19:49:32 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<lockhart@alumni.caltech.edu>> - id m0zTSdF-000B5AC; Wed, 14 Oct 98 17:14 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for lockhart@alumni.caltech.edu - id m0zTVAt-000EBRC; Wed, 14 Oct 98 19:57 MET DST -Message-Id: <m0zTVAt-000EBRC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: maillist@candle.pha.pa.us (Bruce Momjian) -Date: Wed, 14 Oct 1998 19:57:27 +0200 (MET DST) -Cc: lockhart@alumni.caltech.edu, jwieck@debis.com, eric@linux-hw.com, - jeff@remapcorp.com, hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <199810141721.NAA28746@candle.pha.pa.us> from "Bruce Momjian" at Oct 14, 98 01:21:15 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Status: RO - -> But, you are correct that certain cases where in index is already being -> used on a query, you could just skip the sort IF you used the index to -> get the rows from the base table. - - Especially in the case where - - SELECT ... WHERE key > 'val' ORDER BY key; - - creates a Sort->IndexScan plan. The index scan already jumps - around on the disc to collect the sorts input and the sort - finally returns exactly the same output (if the used index is - only on key). - - And this is the case for large tables. The planner first - decides to use an index scan due to the WHERE clause and - later it notices the ORDER BY clause and creates a sort over - the scan. - - I'm actually hacking around on it to see what happens if I - suppress the sort node in some cases. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - -From owner-pgsql-hackers@hub.org Wed Oct 14 16:31:07 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id QAA01119 - for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 16:31:05 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id PAA22534 for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 15:29:50 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id PAA26335; - Wed, 14 Oct 1998 15:05:26 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 14 Oct 1998 15:02:13 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id PAA26013 - for pgsql-hackers-outgoing; Wed, 14 Oct 1998 15:02:11 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from candle.pha.pa.us (root@s5-03.ppp.op.net [209.152.195.67]) - by hub.org (8.8.8/8.8.8) with ESMTP id PAA25996 - for <hackers@postgreSQL.org>; Wed, 14 Oct 1998 15:01:58 -0400 (EDT) - (envelope-from maillist@candle.pha.pa.us) -Received: (from maillist@localhost) - by candle.pha.pa.us (8.9.0/8.9.0) id OAA29639; - Wed, 14 Oct 1998 14:27:05 -0400 (EDT) -From: Bruce Momjian <maillist@candle.pha.pa.us> -Message-Id: <199810141827.OAA29639@candle.pha.pa.us> -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -In-Reply-To: <199810141721.NAA28746@candle.pha.pa.us> from Bruce Momjian at "Oct 14, 1998 1:21:15 pm" -To: maillist@candle.pha.pa.us (Bruce Momjian) -Date: Wed, 14 Oct 1998 14:27:05 -0400 (EDT) -Cc: lockhart@alumni.caltech.edu, jwieck@debis.com, eric@linux-hw.com, - jeff@remapcorp.com, hackers@postgreSQL.org -X-Mailer: ELM [version 2.4ME+ PL47 (25)] -MIME-Version: 1.0 -Content-Type: text/plain; charset=US-ASCII -Content-Transfer-Encoding: 7bit -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -> Thomas is correct on this. Vadim has run some tests, and with our -> optimized psort() code, the in-memory sort is often faster than using -> the index to get the tuple, because you are jumping all over the drive. -> I don't remember, but obviously there is a break-even point where -> getting X rows using the index on a table of Y rows is faster , but -> getting X+1 rows on a table of Y rows is faster getting all the rows -> sequentailly, and doing the sort. -> -> You would have to pick only certain queries(no joins, index matches -> ORDER BY), take the number of rows requested, and the number of rows -> selected, and figure out if it is faster to use the index, or a -> sequential scan and do the ORDER BY yourself. -> -> Add to this the OFFSET capability. I am not sure how you are going to -> get into the index and start at the n-th entry, unless perhaps you just -> sequential scan the index. -> -> In fact, many queries just get column already indexed, and we could just -> pull the data right out of the index. -> -> I have added this to the TODO list: -> -> * Pull requested data directly from indexes, bypassing heap data -> -> I think this has to be post-6.4 work, but I think we need to work in -> this direction. I am holding off any cnfify fixes for post-6.4, but a -> 6.4.1 performance release certainly is possible. -> -> -> But, you are correct that certain cases where in index is already being -> used on a query, you could just skip the sort IF you used the index to -> get the rows from the base table. - -I have had more time to think about this. Basically, for pre-sorted -data, our psort code is very fast, because it does not need to sort -anything. It just moves the rows in and out of the sort memory. Yes, -it could be removed in some cases, and probably should be, but it is not -going to produce great speedups. - -The more general case I will describe below. - -First, let's look at a normal query: - - SELECT * - FROM tab - ORDER BY col1 - -This is not going to use an index, and probably should not because it is -faster for large tables to sort them in memory, rather than moving all -over the disk. For small tables, if the entire table fits in the buffer -cache, it may be faster to use the index, but on a small table the sort -doesn't take very long either, and the buffer cache effectiveness is -affected by other backends using it, so it may be better not to count on -it for a speedup. - -However, if you only want the first 10 rows, that is a different story. -We pull all the rows into the backend, sort them, then return 10 rows. -The query, if we could do it, should be written as: - - SELECT * - FROM tab - WHERE col1 < some_unknown_value - ORDER BY col1 - -In this case, the optimizer looks at the column statistics, and properly -uses an index to pull only a small subset of the table. This is the -type of behavior people want for queries returning only a few values. - -But, unfortunately, we don't know that mystery value. - -Now, everyone agrees we need an index matching the ORDER BY to make this -query quick, but we don't know that mystery value, so currently we -execute the whole query, and do a fetch. - -What I am now thinking is that maybe we need a way to walk around that -index. Someone months ago asked how to do that, and we told him he -couldn't, because this not a C-ISAM/dbm type database. However, if we -could somehow pass into the query the index location we want to start -at, and how many rows we need, that would solve our problem, and perhaps -even allow joined queries to work, assuming the table in the ORDER BY is -in an outer join loop. - - SELECT * - FROM tab - WHERE col1 < some_unknown_value - ORDER BY col1 - USING INDEX tab_idx(452) COUNT 100 - -where 452 is an 452th index entry, and COUNT is the number of index rows -you want to process. The query may return more or less than 100 rows if -there is a join and it joins to zero or more than one row in the joined -table, but this seems like perhaps a good way to go at it. We need to -do it this way because if a single index row returns 4 result rows, and -only two of the four rows fit in the number of rows returnd as set by the -user, it is hard to re-start the query at the proper point, because you -would have to process the index rows a second time, and return just part -of the result, and that is hard. - -If the index changes, or rows are added, the results are going to be -unreliable, but that is probably going to be true of any state-less -implementation we can devise. - -I think this may be fairly easy to implement. We could sequential scan -the index to get to the 452th row. That is going to be quick. We can -pass the 452 into the btree index code, so only a certain range of index -tuples are returned, and the system believes it has processed the entire -query, while we know it hasn't. Doesn't really work with hash, so we -will not allow it for those indexes. - -To make it really easy, we could implement it as a 'SET' command, so we -don't actually have it as part of the query, and have to pass it around -through all the modules. You would do the proper 'SET' before running -the query. Optimizer would look at 'SET' value to force index use. - - SET INDEX TO tab_idx START 452 COUNT 100 - -or - - SET INDEX TO tab_idx FROM 452 COUNT 451 - -There would have to be some way to signal that the end of the index had -been reached, because returning zero rows is not enough of a guarantee -in a joined SELECT. - -Comments? - --- - Bruce Momjian | http://www.op.net/~candle - maillist@candle.pha.pa.us | (610) 853-3000 - + If your life is a hard drive, | 830 Blythe Avenue - + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 - - -From owner-pgsql-hackers@hub.org Wed Oct 14 17:31:23 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id RAA01591 - for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 17:31:21 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id RAA02744 for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 17:26:53 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id RAA05601; - Wed, 14 Oct 1998 17:03:21 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 14 Oct 1998 16:59:54 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id QAA04964 - for pgsql-hackers-outgoing; Wed, 14 Oct 1998 16:59:52 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id QAA04943 - for <hackers@postgreSQL.org>; Wed, 14 Oct 1998 16:59:28 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id WAA28383; Wed, 14 Oct 1998 22:57:42 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma028354; Wed, 14 Oct 98 22:57:28 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id WAA20547; - Wed, 14 Oct 1998 22:54:51 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id WAA24383; - Wed, 14 Oct 1998 22:57:09 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<lockhart@alumni.caltech.edu>> - id m0zTVYr-000B5AC; Wed, 14 Oct 98 20:22 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for lockhart@alumni.caltech.edu - id m0zTY6V-000EBRC; Wed, 14 Oct 98 23:05 MET DST -Message-Id: <m0zTY6V-000EBRC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: maillist@candle.pha.pa.us (Bruce Momjian) -Date: Wed, 14 Oct 1998 23:05:07 +0200 (MET DST) -Cc: maillist@candle.pha.pa.us, lockhart@alumni.caltech.edu, jwieck@debis.com, - eric@linux-hw.com, jeff@remapcorp.com, hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <199810141827.OAA29639@candle.pha.pa.us> from "Bruce Momjian" at Oct 14, 98 02:27:05 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: ROr - -> I have had more time to think about this. Basically, for pre-sorted -> data, our psort code is very fast, because it does not need to sort -> anything. It just moves the rows in and out of the sort memory. Yes, -> it could be removed in some cases, and probably should be, but it is not -> going to produce great speedups. - - And I got the time to hack around about this. - - I hacked in a little check into the planner, that compares - the sortClause against the key field list of an index scan - and just suppresses the sort node if it exactly matchs and - all sort operators are "<". - - I tested with a 10k row table where key is a text field. The - base query is a - - SELECT ... WHERE key > 'val' ORDER BY key; - - The used 'val' is always a key that is close to the first of - all keys in the table ('' on the first query and the last - selected value on subsequent ones). - - Scenario 1 (S1) uses exactly the above query but processes - only the first 20 rows from the result buffer. Thus the - frontend receives nearly the whole table. - - Scenario 2 (S2) uses a cursor and FETCH 20. But closes the - cursor and creates a new one for the next selection (only - with another 'val') as it would occur in a web application. - - If there is no index on key, the backend will allways do a - Sort->SeqScan and due to the 'val' close to the lowest - existing key nearly all tuples get scanned and put into the - sort. S1 here runs about 10 seconds and S2 about 6 seconds. - The speedup in S2 results from the reduced overhead of - sending not wanted tuples into the frontend. - - Now with a btree index on key and an unpatched backend. - Produced plan is always a Sort->IndexScan. S1 needs 16 - seconds and S2 needs 12 seconds. Again nearly all data is put - into the sort but this time over the index scan and that is - slower. - - Last with the btree index on key and the patched backend. - This time the plan is a plain IndexScan because the ORDER BY - clause exactly matches the sort order of the choosen index. - S1 needs 13 seconds and S2 less than 0.2! This dramatic - speedup comes from the fact, that this time the index scan is - the toplevel executor node and the executor run is stopped - after 20 tuples have been selected. - - Analysis of the above timings: - - If there is an ORDER BY clause, using an index scan is the - clever way if the indexqual dramatically reduces the the - amount of data selected and sorted. I think this is the - normal case (who really selects nearly all rows from a 5M row - table?). So choosing the index path is correct. This will - hurt if someone really selects most of the rows and the index - scan jumps over the disc. But here the programmer should use - an unqualified query to perform a seqscan and do the - qualification in the frontend application. - - The speedup for the cursor/fetch scenario is so impressive - that I'll create a post 6.4 patch. I don't want it in 6.4 - because there is absolutely no query in the whole regression - test, where it suppresses the sort node. So we have - absolutely no check that it doesn't break anything. - - For a web application, that can use a unique key to select - the next amount of rows, it will be a big win. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - - -From owner-pgsql-hackers@hub.org Thu Oct 15 00:01:10 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id AAA06040 - for <maillist@candle.pha.pa.us>; Thu, 15 Oct 1998 00:01:04 -0400 (EDT) -Received: from hub.org (root@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id XAA29020 for <maillist@candle.pha.pa.us>; Wed, 14 Oct 1998 23:57:58 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id WAA02215; - Wed, 14 Oct 1998 22:39:07 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 14 Oct 1998 22:35:19 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id WAA02061 - for pgsql-hackers-outgoing; Wed, 14 Oct 1998 22:35:16 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from sraigw.sra.co.jp (sraigw.sra.co.jp [202.32.10.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id WAA01851 - for <hackers@postgreSQL.org>; Wed, 14 Oct 1998 22:35:01 -0400 (EDT) - (envelope-from t-ishii@srapc451.sra.co.jp) -Received: from srapc451.sra.co.jp (srapc451 [133.137.44.37]) - by sraigw.sra.co.jp (8.8.7/3.6Wbeta7-sraigw) with ESMTP id LAA17765; - Thu, 15 Oct 1998 11:34:39 +0900 (JST) -Received: from srapc451.sra.co.jp (localhost [127.0.0.1]) by srapc451.sra.co.jp (8.8.8/3.5Wpl7) with ESMTP id LAA08260; Thu, 15 Oct 1998 11:34:54 +0900 (JST) -Message-Id: <199810150234.LAA08260@srapc451.sra.co.jp> -To: jwieck@debis.com (Jan Wieck) -cc: oleg@sai.msu.su, hackers@postgreSQL.org, t-ishii@sra.co.jp -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -From: Tatsuo Ishii <t-ishii@sra.co.jp> -Reply-To: t-ishii@sra.co.jp -In-reply-to: Your message of Wed, 14 Oct 1998 16:24:56 +0200. - <m0zTRrE-000EBRC@orion.SAPserv.Hamburg.dsh.de> -Date: Thu, 15 Oct 1998 11:34:54 +0900 -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - ->> postgres just because of lacking LIMIT. Tatsuo posted a patch ->> for set query_limit to 'num', I just tested it and seems it ->> works fine. Now, we need only possibility to specify offset, ->> say ->> set query_limit to 'offset,num' ->> ( Tatsuo, How difficult to do this ?) ->> and LIMIT problem will ne gone. -> -> Think you haven't read my posting completely. Even with the -> executor limit, the complete scan into the sort is done by -> the backend. You need to specify ORDER BY to get the same -> list again (without the offset doesn't make sense). But -> currently, ORDER BY forces a sort node into the query plan. - -I think we have understanded your point. set query_limit is just a -easy alternative of using cursor and fetch. - -> I haven't looked at Tatsuo's patch very well. But if it -> limits the amount of data going into the sort (on ORDER BY), -> it will break it! The requested ordering could be different -> from what the choosen index might return. The used index is -> choosen by the planner upon the qualifications given, not the -> ordering wanted. - -I think it limits the final result. When query_limit is set, -the arg "numberTuples" of ExecutePlan() is set to it instead of 0 -(this means no limit). - -Talking about "offset," it shouldn't be very difficult. I guess all we -have to do is adding a new arg "offset" to ExecutePlan() then making -obvious modifications. (and of course we have to modify set -query_limit syntax but it's trivial) - -However, before going ahead, I would like to ask other hackers about -this direction. This might be convenient for some users, but still the -essential performance issue would remain. In another word, this is a -short-term solution not a intrinsic one, IMHO. --- -Tatsuo Ishii -t-ishii@sra.co.jp - - -From owner-pgsql-hackers@hub.org Thu Oct 15 10:01:17 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id KAA13960 - for <maillist@candle.pha.pa.us>; Thu, 15 Oct 1998 10:01:15 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id JAA20266 for <maillist@candle.pha.pa.us>; Thu, 15 Oct 1998 09:12:21 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id IAA26142; - Thu, 15 Oct 1998 08:19:49 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Thu, 15 Oct 1998 08:13:48 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id IAA25747 - for pgsql-hackers-outgoing; Thu, 15 Oct 1998 08:13:46 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id IAA25733 - for <hackers@postgreSQL.org>; Thu, 15 Oct 1998 08:13:40 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id OAA18677; Thu, 15 Oct 1998 14:16:12 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma018279; Thu, 15 Oct 98 14:15:39 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id OAA01227; - Thu, 15 Oct 1998 14:13:09 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id OAA28938; - Thu, 15 Oct 1998 14:15:27 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<jwieck@debis.com>> - id m0zTjtm-000B5AC; Thu, 15 Oct 98 11:40 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for jwieck@debis.com - id m0zTmRT-000EBRC; Thu, 15 Oct 98 14:23 MET DST -Message-Id: <m0zTmRT-000EBRC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: t-ishii@sra.co.jp -Date: Thu, 15 Oct 1998 14:23:43 +0200 (MET DST) -Cc: jwieck@debis.com, oleg@sai.msu.su, hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <199810150234.LAA08260@srapc451.sra.co.jp> from "Tatsuo Ishii" at Oct 15, 98 11:34:54 am -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -Tatsuo Ishii wrote: - -> I think we have understanded your point. set query_limit is just a -> easy alternative of using cursor and fetch. -> -> > I haven't looked at Tatsuo's patch very well. But if it -> > limits the amount of data going into the sort (on ORDER BY), -> > it will break it! The requested ordering could be different -> > from what the choosen index might return. The used index is -> > choosen by the planner upon the qualifications given, not the -> > ordering wanted. -> -> I think it limits the final result. When query_limit is set, -> the arg "numberTuples" of ExecutePlan() is set to it instead of 0 -> (this means no limit). -> -> Talking about "offset," it shouldn't be very difficult. I guess all we -> have to do is adding a new arg "offset" to ExecutePlan() then making -> obvious modifications. (and of course we have to modify set -> query_limit syntax but it's trivial) - - The offset could become - - FETCH n IN cursor [OFFSET n]; - - and - - SELECT ... [LIMIT offset,count]; - - The FETCH command already calls ExecutorRun() with the given - count (the tuple limit). Telling it the offset too is really - simple. And ExecutorRun() could check if the toplevel - executor node is an index scan. Skipping tuples during the - index scan requires, that all qualifications are in the - indexqual, thus any tuple returned by it will become a final - result row (as it would be in the simple 1-table-queries we - discussed). If that isn't the case, the executor must - fallback to skip the final result tuples and that is after an - eventually processed sort/merge of the complete result set. - That would only reduce communication to the client and memory - required there to buffer the result set (not a bad thing - either). - - ProcessQueryDesc() in tcop/pquery.c also calls ExecutorRun() - but with a constant 0 tuple count. Having offset and count in - the parsetree would make it without any state variables or - SET command. And it's the only clean way to restrict LIMIT to - SELECT queries. Any thrown in LIMIT to ExecutorRun() from - another place could badly hurt the rewrite system. Remember - that non-instead actions on insert/update/delete are - processed before the original query! And what about SQL - functions that get processed during the evaluation of another - query (view using an SQL function for count(*))? - - A little better would it be to make the LIMIT values able to - be parameter nodes. C or PL functions use the prepared plan - feature of the SPI manager for performance reasons. - Especially the offset value might there need to be a - parameter that the executor has to pick out first. If we - change the count argument of ExecutorRun to a List *limit, - this one could be NIL (to mean the old 0 count 0 offset - behaviour) or a list of two elements that both can be either - a Const or a Param of type int4. Easy for the executor to - evaluate. - - The only places where ExecutorRun() is called are - tcop/pquery.c (queries from frontend), commands/command.c - (FETCH command), executor/functions.c (SQL functions) and - executor/spi.c (SPI manager). So it is easy to change the - call interface too. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - - -From owner-pgsql-hackers@hub.org Thu Oct 15 14:32:34 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id OAA19803 - for <maillist@candle.pha.pa.us>; Thu, 15 Oct 1998 14:32:31 -0400 (EDT) -Received: from hub.org (root@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id NAA10847 for <maillist@candle.pha.pa.us>; Thu, 15 Oct 1998 13:38:16 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id MAA22772; - Thu, 15 Oct 1998 12:07:20 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Thu, 15 Oct 1998 12:02:33 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id MAA22026 - for pgsql-hackers-outgoing; Thu, 15 Oct 1998 12:02:31 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from ra.sai.msu.su (ra.sai.msu.su [158.250.29.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id MAA22007 - for <hackers@postgreSQL.org>; Thu, 15 Oct 1998 12:02:16 -0400 (EDT) - (envelope-from oleg@sai.msu.su) -Received: from ra (ra [158.250.29.2]) - by ra.sai.msu.su (8.9.1/8.9.1) with SMTP id TAA21024; - Thu, 15 Oct 1998 19:01:23 +0300 (MSK) -Date: Thu, 15 Oct 1998 20:01:23 +0400 (MSD) -From: Oleg Bartunov <oleg@sai.msu.su> -X-Sender: megera@ra -To: Jan Wieck <jwieck@debis.com> -cc: t-ishii@sra.co.jp, hackers@postgreSQL.org -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -In-Reply-To: <m0zTmRT-000EBRC@orion.SAPserv.Hamburg.dsh.de> -Message-ID: <Pine.GSO.3.96.SK.981015193853.19322D-100000@ra> -Organization: Sternberg Astronomical Institute (Moscow University) -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: ROr - -This is a little bit off-topic, -I did some timings with latest cvs on my real database -( all output redirected to /dev/null ), table contains 8798 records, -31 columns, order key have indices. - -1.select count(*) from work_flats; -0.02user 0.00system 0:00.18elapsed 10%CPU (0avgtext+0avgdata 0maxresident)k -0inputs+0outputs (131major+21minor)pagefaults 0swaps - -2.select * from work_flats order by rooms, metro_id; -2.35user 0.25system 0:10.11elapsed 25%CPU (0avgtext+0avgdata 0maxresident)k -0inputs+0outputs (131major+2799minor)pagefaults 0swaps - -3.set query_limit to '150'; -SET VARIABLE -select * from work_flats order by rooms, metro_id; -0.06user 0.00system 0:02.75elapsed 2%CPU (0avgtext+0avgdata 0maxresident)k -0inputs+0outputs (131major+67minor)pagefaults 0swaps - -4.begin; -declare tt cursor for -select * from work_flats order by rooms, metro_id; -fetch 150 in tt; -end; -0.05user 0.01system 0:02.76elapsed 2%CPU (0avgtext+0avgdata 0maxresident)k -0inputs+0outputs (131major+67minor)pagefaults 0swaps - -As you can see timings for query_limit and cursor are very similar, -I didn't expected this. So, in principle, enhanced version of fetch -(with offset) would cover all we need from LIMIT, but query_limit would be -still useful, for example to restrict loadness of server. -Will all enhancements you discussed go to the 6.4 ? -I'm really interested in testing this stuff because I begin new project -and everything we discussed here are badly needed. - - - Regards, - - Oleg - - - -On Thu, 15 Oct 1998, Jan Wieck wrote: - -> Date: Thu, 15 Oct 1998 14:23:43 +0200 (MET DST) -> From: Jan Wieck <jwieck@debis.com> -> To: t-ishii@sra.co.jp -> Cc: jwieck@debis.com, oleg@sai.msu.su, hackers@postgreSQL.org -> Subject: Re: [HACKERS] What about LIMIT in SELECT ? -> -> Tatsuo Ishii wrote: -> -> > I think we have understanded your point. set query_limit is just a -> > easy alternative of using cursor and fetch. -> > -> > > I haven't looked at Tatsuo's patch very well. But if it -> > > limits the amount of data going into the sort (on ORDER BY), -> > > it will break it! The requested ordering could be different -> > > from what the choosen index might return. The used index is -> > > choosen by the planner upon the qualifications given, not the -> > > ordering wanted. -> > -> > I think it limits the final result. When query_limit is set, -> > the arg "numberTuples" of ExecutePlan() is set to it instead of 0 -> > (this means no limit). -> > -> > Talking about "offset," it shouldn't be very difficult. I guess all we -> > have to do is adding a new arg "offset" to ExecutePlan() then making -> > obvious modifications. (and of course we have to modify set -> > query_limit syntax but it's trivial) -> -> The offset could become -> -> FETCH n IN cursor [OFFSET n]; -> -> and -> -> SELECT ... [LIMIT offset,count]; -> -> The FETCH command already calls ExecutorRun() with the given -> count (the tuple limit). Telling it the offset too is really -> simple. And ExecutorRun() could check if the toplevel -> executor node is an index scan. Skipping tuples during the -> index scan requires, that all qualifications are in the -> indexqual, thus any tuple returned by it will become a final -> result row (as it would be in the simple 1-table-queries we -> discussed). If that isn't the case, the executor must -> fallback to skip the final result tuples and that is after an -> eventually processed sort/merge of the complete result set. -> That would only reduce communication to the client and memory -> required there to buffer the result set (not a bad thing -> either). -> -> ProcessQueryDesc() in tcop/pquery.c also calls ExecutorRun() -> but with a constant 0 tuple count. Having offset and count in -> the parsetree would make it without any state variables or -> SET command. And it's the only clean way to restrict LIMIT to -> SELECT queries. Any thrown in LIMIT to ExecutorRun() from -> another place could badly hurt the rewrite system. Remember -> that non-instead actions on insert/update/delete are -> processed before the original query! And what about SQL -> functions that get processed during the evaluation of another -> query (view using an SQL function for count(*))? -> -> A little better would it be to make the LIMIT values able to -> be parameter nodes. C or PL functions use the prepared plan -> feature of the SPI manager for performance reasons. -> Especially the offset value might there need to be a -> parameter that the executor has to pick out first. If we -> change the count argument of ExecutorRun to a List *limit, -> this one could be NIL (to mean the old 0 count 0 offset -> behaviour) or a list of two elements that both can be either -> a Const or a Param of type int4. Easy for the executor to -> evaluate. -> -> The only places where ExecutorRun() is called are -> tcop/pquery.c (queries from frontend), commands/command.c -> (FETCH command), executor/functions.c (SQL functions) and -> executor/spi.c (SPI manager). So it is easy to change the -> call interface too. -> -> -> Jan -> -> -- -> -> #======================================================================# -> # It's easier to get forgiveness for being wrong than for being right. # -> # Let's break this rule - forgive me. # -> #======================================== jwieck@debis.com (Jan Wieck) # -> -> - -_____________________________________________________________ -Oleg Bartunov, sci.researcher, hostmaster of AstroNet, -Sternberg Astronomical Institute, Moscow University (Russia) -Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/ -phone: +007(095)939-16-83, +007(095)939-23-83 - - - -From owner-pgsql-hackers@hub.org Thu Oct 15 13:22:48 1998 -Received: from hub.org (majordom@hub.org [209.47.148.200]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id NAA18540 - for <maillist@candle.pha.pa.us>; Thu, 15 Oct 1998 13:22:46 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id MAA01819; - Thu, 15 Oct 1998 12:56:25 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Thu, 15 Oct 1998 12:51:43 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id MAA01305 - for pgsql-hackers-outgoing; Thu, 15 Oct 1998 12:51:40 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id MAA01283 - for <pgsql-hackers@postgresql.org>; Thu, 15 Oct 1998 12:51:28 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id SAA21874; Thu, 15 Oct 1998 18:54:00 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma021705; Thu, 15 Oct 98 18:53:31 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id SAA25226; - Thu, 15 Oct 1998 18:50:57 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id SAA30639; - Thu, 15 Oct 1998 18:53:14 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<jwieck@debis.com>> - id m0zToEf-000B5AC; Thu, 15 Oct 98 16:18 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for jwieck@debis.com - id m0zTqmM-000EBRC; Thu, 15 Oct 98 19:01 MET DST -Message-Id: <m0zTqmM-000EBRC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: hannu@trust.ee (Hannu Krosing) -Date: Thu, 15 Oct 1998 19:01:33 +0200 (MET DST) -Cc: jwieck@debis.com, pgsql-hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <36261DF7.D20368A0@trust.ee> from "Hannu Krosing" at Oct 15, 98 07:08:23 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -Hannu Krosing wrote: - -> Jan Wieck wrote: -> > The speedup for the cursor/fetch scenario is so impressive -> > that I'll create a post 6.4 patch. I don't want it in 6.4 -> > because there is absolutely no query in the whole regression -> > test, where it suppresses the sort node. -> -> Good, then it works as expected ;) -> -> More seriously, it is not within powers of current regression test -> framework to test speed improvements (only the case where -> performance-wise bad implementation will actually crash the backend, -> as in the cnfify problem, but AFAIK we dont test for those now) -> -> > So we have absolutely no check that it doesn't break anything. -> -> If it did pass the regression, then IMHO it did not break anything. - - Thats the point. The check if the sort node is required - returns TRUE for ALL queries of the regression. So the - behaviour when it returns FALSE is absolutely not tested. - -> -> I would vote for putting it in (maybe with a -> 'set fix_optimiser_stupidity on' safeguard to enable it). I see no -> reason to postpone it to 6.4.1 and force almost everybody to first -> patch their copy and then upgrade very soon. -> -> I would even go far enough to call it a bugfix, as it does not really -> introduce any new functionality only fixes some existing functionality -> so that much bigger databases can be actually used. - - I can't call it a bugfix because it is only a performance win - in some situations. And I feel the risk is too high to put - untested code into the backend at BETA2 time. The max we - should do is to take this one and the LIMIT thing (maybe - implemented as I suggested lately), and put out a Web- - Performance-Release at the same time we release 6.4. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - - -From Inoue@tpf.co.jp Thu Oct 15 20:31:01 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id UAA26050 - for <maillist@candle.pha.pa.us>; Thu, 15 Oct 1998 20:31:00 -0400 (EDT) -Received: from sd.tpf.co.jp (sd.tpf.co.jp [210.161.239.34]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id UAA12888 for <maillist@candle.pha.pa.us>; Thu, 15 Oct 1998 20:10:03 -0400 (EDT) -Received: from cadzone ([126.0.1.40]) - by sd.tpf.co.jp (2.0 Build 2131 (Berkeley 8.8.4)/8.8.4) with SMTP - id JAA02574; Fri, 16 Oct 1998 09:00:34 +0900 -From: "Hiroshi Inoue" <Inoue@tpf.co.jp> -To: "Jan Wieck" <jwieck@debis.com>, - "Bruce Momjian" <maillist@candle.pha.pa.us> -Subject: RE: [HACKERS] What about LIMIT in SELECT ? -Date: Fri, 16 Oct 1998 09:12:55 +0900 -Message-ID: <000201bdf899$b953bf00$2801007e@cadzone.tpf.co.jp> -MIME-Version: 1.0 -Content-Type: text/plain; - charset="iso-8859-1" -Content-Transfer-Encoding: 7bit -X-Priority: 3 (Normal) -X-MSMail-Priority: Normal -X-Mailer: Microsoft Outlook 8.5, Build 4.71.2173.0 -In-Reply-To: <199810150552.BAA07576@candle.pha.pa.us> -Importance: Normal -X-MimeOLE: Produced By Microsoft MimeOLE V4.72.2106.4 -Status: ROr - -> -----Original Message----- -> From: owner-pgsql-hackers@postgreSQL.org -> [mailto:owner-pgsql-hackers@postgreSQL.org]On Behalf Of Bruce Momjian -> Sent: Thursday, October 15, 1998 2:52 PM -> To: jwieck@debis.com -> Cc: lockhart@alumni.caltech.edu; jwieck@debis.com; eric@linux-hw.com; -> jeff@remapcorp.com; hackers@postgreSQL.org -> Subject: Re: [HACKERS] What about LIMIT in SELECT ? -> -> -> > > I have had more time to think about this. Basically, for pre-sorted -> > > data, our psort code is very fast, because it does not need to sort -> > > anything. It just moves the rows in and out of the sort memory. Yes, -> > > it could be removed in some cases, and probably should be, -> but it is not -> > > going to produce great speedups. -> > -> > And I got the time to hack around about this. -> > -> > I hacked in a little check into the planner, that compares -> > the sortClause against the key field list of an index scan -> > and just suppresses the sort node if it exactly matchs and -> > all sort operators are "<". -> > -> > I tested with a 10k row table where key is a text field. The -> > base query is a -> > -> > SELECT ... WHERE key > 'val' ORDER BY key; -> > -> > The used 'val' is always a key that is close to the first of -> > all keys in the table ('' on the first query and the last -> > selected value on subsequent ones). -> -> This is good stuff. I want to think about it for a day. Sounds very -> promising. -> - -Did you see my contribution about this subject ? -I have already implemented above cases and used on trial for three -months or more. -It is good to be formally supported by PostgreSQL community. - -And please remember that there are descending order cases. -(Moreover there are compound cases such as - SELECT * from ... order by key1 desc,key2 asc; - I didn't implement such cases.) - -Thanks. - -Hiroshi Inoue -Inoue@tpf.co.jp - - -From owner-pgsql-hackers@hub.org Fri Oct 16 04:01:07 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id EAA02029 - for <maillist@candle.pha.pa.us>; Fri, 16 Oct 1998 04:01:04 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id DAA05509 for <maillist@candle.pha.pa.us>; Fri, 16 Oct 1998 03:43:53 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id CAA11278; - Fri, 16 Oct 1998 02:00:01 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Fri, 16 Oct 1998 01:57:25 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id BAA11129 - for pgsql-hackers-outgoing; Fri, 16 Oct 1998 01:57:21 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from candle.pha.pa.us (root@s5-03.ppp.op.net [209.152.195.67]) - by hub.org (8.8.8/8.8.8) with ESMTP id BAA11116 - for <hackers@postgreSQL.org>; Fri, 16 Oct 1998 01:57:00 -0400 (EDT) - (envelope-from maillist@candle.pha.pa.us) -Received: (from maillist@localhost) - by candle.pha.pa.us (8.9.0/8.9.0) id BAA29942; - Fri, 16 Oct 1998 01:34:33 -0400 (EDT) -From: Bruce Momjian <maillist@candle.pha.pa.us> -Message-Id: <199810160534.BAA29942@candle.pha.pa.us> -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -In-Reply-To: <m0zTY6V-000EBRC@orion.SAPserv.Hamburg.dsh.de> from Jan Wieck at "Oct 14, 1998 11: 5: 7 pm" -To: jwieck@debis.com -Date: Fri, 16 Oct 1998 01:34:33 -0400 (EDT) -Cc: lockhart@alumni.caltech.edu, jwieck@debis.com, eric@linux-hw.com, - jeff@remapcorp.com, hackers@postgreSQL.org -X-Mailer: ELM [version 2.4ME+ PL47 (25)] -MIME-Version: 1.0 -Content-Type: text/plain; charset=US-ASCII -Content-Transfer-Encoding: 7bit -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -OK, I have had my day of thinking, and will address this specific -posting first, because it is the most fundamental concerning the future -direction of the optimization. - -> -> And I got the time to hack around about this. -> -> I hacked in a little check into the planner, that compares -> the sortClause against the key field list of an index scan -> and just suppresses the sort node if it exactly matchs and -> all sort operators are "<". -> -> I tested with a 10k row table where key is a text field. The -> base query is a -> -> SELECT ... WHERE key > 'val' ORDER BY key; -> -> The used 'val' is always a key that is close to the first of -> all keys in the table ('' on the first query and the last -> selected value on subsequent ones). -> -> Scenario 1 (S1) uses exactly the above query but processes -> only the first 20 rows from the result buffer. Thus the -> frontend receives nearly the whole table. - -OK. - -> -> Scenario 2 (S2) uses a cursor and FETCH 20. But closes the -> cursor and creates a new one for the next selection (only -> with another 'val') as it would occur in a web application. -> -> If there is no index on key, the backend will allways do a -> Sort->SeqScan and due to the 'val' close to the lowest -> existing key nearly all tuples get scanned and put into the -> sort. S1 here runs about 10 seconds and S2 about 6 seconds. -> The speedup in S2 results from the reduced overhead of -> sending not wanted tuples into the frontend. - -Makes sense. All rows are processed, but not sent to client. - -> -> Now with a btree index on key and an unpatched backend. -> Produced plan is always a Sort->IndexScan. S1 needs 16 -> seconds and S2 needs 12 seconds. Again nearly all data is put -> into the sort but this time over the index scan and that is -> slower. - -VACUUM ANALYZE could affect this. Because it had no stats, it thought -index use would be faster, but in fact because 'val' was near the lowest -value, it as selecting 90% of the table, and would have been better with -a sequential scan. pg_statistics's low/hi values for a column could -have told that to the optimizer. - -I know the good part of the posting is coming. - -> Last with the btree index on key and the patched backend. -> This time the plan is a plain IndexScan because the ORDER BY -> clause exactly matches the sort order of the chosen index. -> S1 needs 13 seconds and S2 less than 0.2! This dramatic -> speedup comes from the fact, that this time the index scan is -> the toplevel executor node and the executor run is stopped -> after 20 tuples have been selected. - -OK, seems like in the S1 case, the use of the psort/ORDER BY code on top -of the index was taking and extra 3 seconds, which is 23%. That is a -lot more than I thought for the psort code, and shows we could gain a -lot by removing unneeded sorts from queries that are already using -matching indexes. - -Just for clarity, added to TODO. I think everyone is clear on this one, -and its magnitude is a surprise to me: - - * Prevent psort() usage when query already using index matching ORDER BY - - -> Analysis of the above timings: -> -> If there is an ORDER BY clause, using an index scan is the -> clever way if the indexqual dramatically reduces the the -> amount of data selected and sorted. I think this is the -> normal case (who really selects nearly all rows from a 5M row -> table?). So choosing the index path is correct. This will -> hurt if someone really selects most of the rows and the index -> scan jumps over the disc. But here the programmer should use -> an unqualified query to perform a seqscan and do the -> qualification in the frontend application. - -Fortunately, the optimizer already does the index selection for us, and -guesses pretty well if the index or sequential scan is better. Once we -implement the above removal of psort(), we will have to change the -timings because now you have to compare index scan against sequential -scan AND psort(), because in the index scan situation, you don't need -the psort(), assuming the ORDER BY matches the index exactly. - -> The speedup for the cursor/fetch scenario is so impressive -> that I'll create a post 6.4 patch. I don't want it in 6.4 -> because there is absolutely no query in the whole regression -> test, where it suppresses the sort node. So we have -> absolutely no check that it doesn't break anything. -> -> For a web application, that can use a unique key to select -> the next amount of rows, it will be a big win. - -OK, I think the reason the regression test did not show your code being -used is important. - -First, most of the tables are small in the regression test, so sequential -scans are faster. Second, most queries using indexes are either joins, -which do the entire table, or equality tests, like col = 3, where there -is no matching ORDER BY because all the col values are 3. Again, your -code can't help with these. - -The only regression-type code that would use it would be a 'col > 3' -qualification with a col ORDER BY, and there aren't many of those. - -However, if we think of the actual application you are addressing, it is -a major win. If we are going after only one row of the index, it is -fast. If we are going after the entire table, it is faster to -sequential scan and psort(). You big win is with the partial queries, -where you end up doing a full sequential scan or index scan, then and -ORDER BY, while you really only need a few rows from the query, and if -you deal directly with the index, you can prevent many rows from being -processed. It is the ability to skip processing those extra rows that -makes it a big win, not so much the removal of the ORDER BY, though that -helps too. - -Your solution really is tailored for this 'partial' query application, -and I think it is a big need for certain applications that can't use -cursors, like web apps. Most other apps have long-time connections to -the database, and are better off with cursors. - -I did profiling to improve startup time, because the database -requirements of web apps are different from normal db apps, and we have -to adjust to that. - -So, to reiterate, full queries are not benefited as much from the new -code, because sequential scan/psort is faster, or because the index only -retrieves a small number of rows because the qualification of values is -very specific. - -Those open-ended, give me the rows from 100 to 199 really need your -modifications. - -OK, we have QUERY_LIMIT, and that allows us to throw any query at the -system, and it will return that many of the first rows for the ORDER BY. -No fancy stuff required. If we can get a matching index, we may be able -to remove the requirement of scanning all the row (with Jan's patch), -and that is a big win. If not, we at least prevent the rows from being -returned to the client. - -However, there is the OFFSET issue. This is really a case where the -user wants to _restart_ the query where they left off. That is a -different problem. All of a sudden, we need to evaluate more of the -query, and return a segment from the middle of the result set. - -I think we need to decide how to handle such a restart. Do we -re-evaluate the entire query, skipping all the rows up to OFFSET, and -return the number of rows they requested after OFFSET. I would think we -don't want to do that, do we. It would be much easier to code. If it -is a single table, skipping forward has to be done anyway, because we -can't just _jump_ to the 100th entry in the index, unless we pass some -_tid_ to the user, and expect them to pass that back to start the query. -I don't think we went to do that. It is ugly, and the row may have -moved since we started. So, for a single table, adding a QUERY_OFFSET -would do exactly what we need, with Jan's patches. - -For a joined query, I think you will have to do the entire _join_ before -returning anything. - -You can't just process all the joins up to the OFFSET location, and you -can't just jump to the 100th index location, because you don't know that -the 100th index location produced the 100th result just returned to the -user. You have to process the whole query, and because of the join and -not knowing which data row from each table is going to make which entry -in the final result. If you are really craft, and the ORDER BY table is -in the outer part of the join loop, you could start processing the table -that is part of the outer loop in _index_ order, because you know that -the rows processed in index order are going to produce the output in -result order. You then could process and throw away the results up to -offset, and generate the needed rows and stop. - -The other way of doing it is to specify a query limit based on specific -index entries, so you say I want the query returned by the first 20 -index entries matching the ORDER BY, or entries 100-199, and the query -is limited to using only those entries in the index. In that case, -though, in joins, you could return more or less rows in the result -depending on the other tables, and that may be unacceptable. However, -for this case, the advantage is that you don't need to process the rows -from 1 to 99 because you have been told the user only wants rows from -certain index slots. If the user requests rows 50000-50100, this would -be much faster because you don't have to process the 50000 rows before -returning any data. However, I question how often people grab stuff -from the center of large data sets. Seems the QUERY_OFFSET idea may be -easier for users. - -I will be commenting on the rest of the optimization postings tomorrow. - --- - Bruce Momjian | http://www.op.net/~candle - maillist@candle.pha.pa.us | (610) 853-3000 - + If your life is a hard drive, | 830 Blythe Avenue - + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 - - -From Inoue@tpf.co.jp Fri Oct 16 03:31:02 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id DAA01767 - for <maillist@candle.pha.pa.us>; Fri, 16 Oct 1998 03:31:00 -0400 (EDT) -Received: from sd.tpf.co.jp (sd.tpf.co.jp [210.161.239.34]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id DAA04551 for <maillist@candle.pha.pa.us>; Fri, 16 Oct 1998 03:13:40 -0400 (EDT) -Received: from cadzone ([126.0.1.40]) - by sd.tpf.co.jp (2.0 Build 2131 (Berkeley 8.8.4)/8.8.4) with SMTP - id QAA02680; Fri, 16 Oct 1998 16:04:09 +0900 -From: "Hiroshi Inoue" <Inoue@tpf.co.jp> -To: "Bruce Momjian" <maillist@candle.pha.pa.us> -Cc: <jwieck@debis.com> -Subject: RE: [HACKERS] What about LIMIT in SELECT ? -Date: Fri, 16 Oct 1998 16:16:29 +0900 -Message-ID: <000001bdf8d4$e4cdf520$2801007e@cadzone.tpf.co.jp> -MIME-Version: 1.0 -Content-Type: text/plain; - charset="iso-8859-1" -Content-Transfer-Encoding: 7bit -X-Priority: 3 (Normal) -X-MSMail-Priority: Normal -X-Mailer: Microsoft Outlook 8.5, Build 4.71.2173.0 -Importance: Normal -X-MimeOLE: Produced By Microsoft MimeOLE V4.72.2106.4 -In-Reply-To: <199810160621.CAA01030@candle.pha.pa.us> -Status: RO - -Where's my contibution to hackers@potsgreSQL.org ? -I will resend it. - -> -----Original Message----- -> From: Bruce Momjian [mailto:maillist@candle.pha.pa.us] -> Sent: Friday, October 16, 1998 3:22 PM -> To: Hiroshi Inoue -> Cc: jwieck@debis.com -> Subject: Re: [HACKERS] What about LIMIT in SELECT ? -> -> -> [Charset iso-8859-1 unsupported, filtering to ASCII...] -> > > > The used 'val' is always a key that is close to the first of -> > > > all keys in the table ('' on the first query and the last -> > > > selected value on subsequent ones). -> > > -> > > This is good stuff. I want to think about it for a day. Sounds very -> > > promising. -> > > -> > -> > Did you see my contribution about this subject ? -> -> I am sorry. I have not seen it, and I am confused how I could have -> missed it. -> -> > I have already implemented above cases and used on trial for three -> > months or more. -> > It is good to be formally supported by PostgreSQL community. -> > -> > And please remember that there are descending order cases. -> > (Moreover there are compound cases such as -> > SELECT * from ... order by key1 desc,key2 asc; -> > I didn't implement such cases.) -> -> Where is the discussion of this? I am confused. You have been using -> code for three months that does this? -> - -Hi all. -I didn't follow all the posts about this thread. -So this post may be out of center. - -I think current PostgreSQL lacks the concern to the response to get first -rows quickly. -For example,queries with ORDER BY clause necessarily include sort steps -and process all target rows to get first rows only. -So I modified my code for ORDER BY cases and use on trial. -I don't understand PostgreSQL sources,so my code is not complete. - -I modified my code for the following 2 cases. - -1.In many cases the following query uses index scan. - SELECT * from ... where key > ...; (where (key) is an index) - If so,we can omit sort steps from the access plan for the following - query. - SELECT * from ... where key > ... order by key; - - Currently cursors without sort steps may be sensitive diffrent from - cursors with sort steps. But no one mind it. - -2.In many cases the following query uses index scan same as case 1. - SELECT * from ... where key < ...;(where (key) is an index) - If so and if we scan the index backward,we can omit sort steps from - the access plan for the following query. - SELECT * from ... where key < ... order by key desc; - - To achive this(backward scan),I used hidden(provided for the future ?)code - that is never executed and is not necessarily correct. - -In the following cases I didn't modify my code to use index scan, -because I couldn't formulate how to tell PostgreSQL optimizer whether -the response to get first rows is needed or the throughput to process -sufficiently many target rows is needed. - -3.The access plan made by current PostgreSQL optimizer for a query with - ORDER BY clause doesn't include index scan. - -I thought the use of Tatsuo's QUERY_LIMIT to decide that the responce -is needed. It is sufficient but not necessary ? -In Oracle the hints FIRST_ROWS,ALL_ROWS are used. - -Thanks. - -Hiroshi Inoue -Inoue@tpf.co.jp - - -From wieck@sapserv.debis.de Fri Oct 16 05:01:03 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id FAA02500 - for <maillist@candle.pha.pa.us>; Fri, 16 Oct 1998 05:01:02 -0400 (EDT) -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id EAA06270 for <maillist@candle.pha.pa.us>; Fri, 16 Oct 1998 04:13:59 -0400 (EDT) -Received: by dsh.de; id KAA11635; Fri, 16 Oct 1998 10:12:45 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma011343; Fri, 16 Oct 98 10:12:15 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id KAA21793; - Fri, 16 Oct 1998 10:09:49 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id KAA01799; - Fri, 16 Oct 1998 10:12:11 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<maillist@candle.pha.pa.us>> - id m0zU2aB-000B5AC; Fri, 16 Oct 98 07:37 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for maillist@candle.pha.pa.us - id m0zU57w-000EBQC; Fri, 16 Oct 98 10:20 MET DST -Message-Id: <m0zU57w-000EBQC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: Inoue@tpf.co.jp (Hiroshi Inoue) -Date: Fri, 16 Oct 1998 10:20:47 +0200 (MET DST) -Cc: maillist@candle.pha.pa.us, jwieck@debis.com -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <000001bdf8d4$e4cdf520$2801007e@cadzone.tpf.co.jp> from "Hiroshi Inoue" at Oct 16, 98 04:16:29 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Status: RO - -Hiroshi Inoue wrote: - -> In the following cases I didn't modify my code to use index scan, -> because I couldn't formulate how to tell PostgreSQL optimizer whether -> the response to get first rows is needed or the throughput to process -> sufficiently many target rows is needed. -> -> 3.The access plan made by current PostgreSQL optimizer for a query with -> ORDER BY clause doesn't include index scan. -> -> I thought the use of Tatsuo's QUERY_LIMIT to decide that the responce -> is needed. It is sufficient but not necessary ? -> In Oracle the hints FIRST_ROWS,ALL_ROWS are used. - - I still think that the QUERY LIMIT should be part of the - parse tree and not thrown in by a magic SET command. If - rewriting or function calls turn the one query sent to the - backend into multiple queries processed internal, how should - this QUERY LIMIT variable know to which of all the queries it - has to be applied? It can really break functions and rewrite - rules if this variable is used on all queries while it is - set. - - For your case 3 I think, if there is a QUERY LIMIT in the - parse tree, the (future) optimizer definitely knows that not - all rows will get processed even if there is no qualification - given. So if there is an index, that matches the ORDER BY - clause and it is no a join and the (future) executor handles - OFFSET in single table index scans fast, it could choose an - index scan for this query too. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - -From owner-pgsql-hackers@hub.org Fri Oct 16 12:02:27 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id MAA13063 - for <maillist@candle.pha.pa.us>; Fri, 16 Oct 1998 12:02:23 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id MAA18435 for <maillist@candle.pha.pa.us>; Fri, 16 Oct 1998 12:01:46 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id LAA24469; - Fri, 16 Oct 1998 11:28:54 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Fri, 16 Oct 1998 11:25:54 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id LAA24370 - for pgsql-hackers-outgoing; Fri, 16 Oct 1998 11:25:52 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id LAA24356 - for <pgsql-hackers@postgreSQL.org>; Fri, 16 Oct 1998 11:25:34 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id RAA06506; Fri, 16 Oct 1998 17:28:04 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma006149; Fri, 16 Oct 98 17:27:12 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id RAA00811 - for <pgsql-hackers@postgreSQL.org>; Fri, 16 Oct 1998 17:24:37 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id RAA04532 - for <pgsql-hackers@postgreSQL.org>; Fri, 16 Oct 1998 17:26:54 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<pgsql-hackers@postgreSQL.org>> - id m0zU9N0-000B5AC; Fri, 16 Oct 98 14:52 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for pgsql-hackers@postgreSQL.org - id m0zUBum-000EBQC; Fri, 16 Oct 98 17:35 MET DST -Message-Id: <m0zUBum-000EBQC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: [HACKERS] SELECT ... LIMIT (trial implementation) -To: pgsql-hackers@postgreSQL.org (PostgreSQL HACKERS) -Date: Fri, 16 Oct 1998 17:35:39 +0200 (MET DST) -Reply-To: jwieck@debis.com (Jan Wieck) -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: ROr - -Here we go, - - this is up to now only for discussion, do not apply to CVS! - - Those involved into the LIMIT discussion please comment. - - Here is what I had in mind for the SELECT ... LIMIT. It adds - - SELECT ... [LIMIT count [, offset]] - - to the parser and arranges that these values are passed down - to the executor. - - It is a clean implementation of LIMIT (regression tested) and - the open items on it are to enable parameters and handle it - in SQL functions and SPI stuff (currently ignored in both). - Optimizing the executor would require the other sort node - stuff discussion first to come to a conclusion. For now it - skips final result rows - but that's already one step forward - since it reduces the rows sent to the frontend to exactly - that what LIMIT requested. - - I've seen the queryLimit by SET variable stuff and that - really can break rewrite rules, triggers or functions. This - is because the query limit will be inherited by any query - (inserts, updates, deletes too) done by them. Have a rule for - constraint deletes of referencing tuples - - CREATE RULE del_table1 AS ON DELETE TO table1 DO - DELETE FROM table2 WHERE ref = OLD.key; - - If the user now sets the query limit to 1 via SET and deletes - a row from table1, only the first found record in table2 will - be constraint deleted, not all of them. - - This is a feature where users can get around rules that - ensure data integrity. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - -begin 644 opt_limit.diff.gz -M'XL(`$]=)S8"`^4\:W?B1K*?R:_H82=98&1;$F^<>`^+F1DV&!S`N<DGCBP: -M6SM"(I*PQSOQ?[]5_9!:(`$S<1Y[+V<&I.[JZJ[NZGIUM1?.<DE.[("$@7WJ -M!\[=V:UE?Z#>XLSV5RO+6X3RX=1&F#W57U4JE6/0%-X&#AG;$3$:Q#`Z]6JG -MVB)&N]WZZN3DY$`?J;9FI][HU&J\;27]88.IMC6H9J^(&E_K!)Y.OB+D;XYG -MNYL%)<5-Y+CAV<K^&)W>%S-JUGX066YV7?@4VI9]3['VC5(;1H'CW?$V\.^L -MPKI5/U!**H7"-4/>_TCM3>0'[ZFUOJ(K/W@B8;19+C.I,G1#,_1&0I>AFU#0 -MDI05'"\J%`I+:D6;@)YCR0\;&CQ=TM"&/G^1SZR&]];SO8A^C(C-?\^!E@*4 -MA8#'=5:VO_&B<TY)(9N4`M`26IX3/1&8#?M#F#URHZH91DL9N5'7C&HM'OGS -MGD[>L$YZ`9!%B85##2/B^3#;R\!?D>B>DCOG@7J$#9<\6.Z&\D8YN,[P9T57 -M(8U*WT@R-:)K)'3^0_UE29:5RVQ"Y.MI]+2FA<)W9#9G<Y2N9.-B$-^1P6A6 -M&P\N,P!<ZD&]Z`?6JU;.`&(D`%CI$E9R51;+L`/FA-[&=0'N;7<X[6<`W#X! -M)ASOY*:?V1YF8$]S!U@\3`$@3#X?W-&(K0;?-\GJB'?/6E$.F8/@+)MWF@W- -M:)F<=P`N=^/`?*68NHS0`OP=C1+($A]0F7'V*U*0N"8;KQ1O$HW$+:<1<)YL -MI!&QOS3.;V6Y/YPE*2THL.9WWY&1[]$R;$68JZOQCWTD#<>R7@:4)EU`4[87 -MVK"+V\DN_NL06!KA+JN41S?#8?(6;YG?1OHB5P%1,5SV<&4YWI8&RJC/5D$9 -M@,?KH$.-&QU#[]1;^4JH4=,:[43DP6M3EXL<PHP[-GGPG07I>XMKU_)*^$4J -M:_C62)\M":E0!*1LHD63V6;MTIEUZ]*IZT>DPM>6,@SI5K#`"4:V"%P=0(D5 -MA'0&"Z*1WFHQ`YE%_#4-`+\/D&\0$D03\9=+$!"LPU`@P&)OL[JE@2@F4]OR -M+IV`VMB8+.23@&<$EBIK4(K1<N/995(JJ]3P"0`2)A04)WV@I6WZ0OC62!8> -M+5M<-$#5R'E'5;LC;#[WP[`@%V\/#;:6NK,275M1-MGVFN`,QAL,7_A6`O2? -M<,K$>A0*\8(D>KR``XG73@@/8"LCX:N_-KE<@(#XX)RE%'SY)&2K##"4FJJA -MU`01VVS'(G:;M("&&Y=9.F#],(OS$L49RC16B.Q7*)0J6.!X;$3(@4QG,J.+ -M$P026D_*N#G"BJ1QL_,YWH)J`TEME:1V33/K"4E\PD\N:#A?![Y-0;<O9.=J -MI0LJ'3<3&"D>6`?.8NPLV`#?9`^06U\@X;F-)76\(-A?LK?AX&HP([9K;4)A -M>N4@8J87JHN8"<@KT!F@7\I8\XD)'V&`5FP.P684QL9^KJW`6D'=6JUC:-E3 -M^.A$]CTIH7DXL^Z2;LH,O^B@`'8-E59<AQ<5['@-2ZP<-%W<^ES`)""PPN62 -M:')RD5AM90EZ"_;J!VDSQ3VRX<L>J>O?E?J3R7BBD>(::VA$`V*%!#IVI/P% -M4S<BS@H8=D5![2_($XV*>=TLZ-("3L[L8>/1CVN0SH""6<]HJY*O%]O]%362 -M,7N\OV?9$2ZA&-ZW1.=SF^XM10+H"*3BEA*/WL'V>:""@N?8J#R:\_BV^BV, -MQS'LX;O$X-YA.Z5J+]<)_^$@TTDAH?*<TD<B103'L=??B^%X7W\8O['NTNRF -MNEUI;N-CV\ML'&0_KX$PE*LEU!*SHE'MY,C=MF;J]=C[$!^B&%6B(+:IU%+% -MK'J5E':'P_GLYGK8GZ:`W_K!HQ4L4A95"D!5/^>\0JP':@2S86IF(]$(+S)4 -MH:G5(NXNO]#`L^;<U%N::50376>"^C:;K1>@[,TN9>0%*<NDQH3!FTV%FE93 -M,]O5/X&:?X)K\YO)J<+H:Z827-.K6E5OORPY>@IF/.KS_?+2:],`JZJA6E7- -M>DMK-FH*,8=]*%[\6QTI7OP%WE0F8<V:J35K"M.U#%UKF<HJ?>(HN>5+N"Y, -M;\V4",Y1T*BA81U`A#^21]3-J#<BZCX1[CY3'@#".02CFH0?G+5L)GJ.&/D$ -M1'Q`P8\(45W</@G%SB?N-.X)5M,%W-!3>.]OW`6)8"DBGRQ\`O+?@1FC%.:? -MN.!)NJ%L!KC7?A@Z8.Z3TF*#`5J`7="/)(3I+DNP$_(ORQ,O><2>;5D_?/'( -MA51+0M6?G*C50G=BC-7Q-CPP&T<\,V?VB-@(KC^R1I@7'%$`#D1'%,@O"(_D -MM:YV=*.CF_GQ$5/70;4VI&K%R1`J&<V=87<*ULMX.OOAIC^<]\975]W198F& -MY3+Y!^G_U._-)_T9"`;2$6\W(QGN"B@@\5+.*@U/+GY9:`1_I6L:NZ4ZTTEB -M093`!)?68I1BX_QYH\P.QC$3-F?X1W!1N';R^(=5'>`<!I/!,^T#/+/;#KBE -MU3';^=S2!%'=3(EJ5M",)=JM[[NP-4,921IXD3^A+I/%L%1+RPWYUK/OK8!% -M$4"*^B.P@57IQX]0`K%I<XY"I`49RWIA0V:-NV76M5955R2QV=!:R7$4ZXUQ -MPO1Z,&<&[7Q\?3/Z?C3^'\8K7%*\(?*3?402?RK\YXCCDBA]7J)@V(O_3'D[ -M_A!%?E)G*0E6DCI4V0&.SU8DL'+`D@WL`H$2>/NT);L%FP?10AR\1+$GEMV$ -M'\#P)O$9238H.XJ1E(KCF#RDZ#$?A90?T&R!RH`\DQ\L(H\B@D?DF2)>!Q1] -M/[8O1'1><"!C>SSK7()?Q_D1A-;-#%AR.NO.IMD,7@,&KQN)AZ2P\_C[>>]F -M,AU/$D;./XX0`H_)R;?HUD7I4X8Y8K0W04#1`U:#7!FAKW,Y#?$>Q:GH75W. -MI_UAOS<CWWQ#XKY/+N3I!711YKNT`?92HY'LTA>CZMA#E3^,W'PU@5(#S^#7 -M3ZCDMRV-G=IL9;$#MJLO:GJVOMC?%/2,V:G6\U6&46^V-*/>4CQ)6:0LK$<? -ML9^3BXT'T]9CH228Y(BNUG/7$0%@(8,+N%H@I]9/)12F&A&--1[1&/-@V?EA -MR)Y8:KY=!6\)D%B;'UH8?Q/EKTM2N6]9$JC/796<EK`H>J>N[['ZZFW-;"C) -M&;P@<>ZM]1IZF;(\BH&W]$&0!1J/K9U<W%OA=',[=+P/(1A8Q2C8T"+85D6F -MW8O\:"D'`\"I*USDL'.@`Y>*P^PP`E_+7(3*JA,19<I"N,,<^Q$RYCB(KQ=+ -MB\\R_?CJ@76PR.<=I78?\RA@G\L]>4V!?8Q.K;IG3[/C/363!`N:B<<>^=`- -M[%\W7,-CB4O9;\`<N(ONR^=,"Z(7FF8&K@9=W[;<>98PP+()#+F$#%>6QR5' -M=Z6R"7<AU:[4VMVNWGQ!5YR!<GKJB8!R1D>)*$I:'2&-6"@D.+/`.7_Z#]WB -MJ.W*;(;:ALK@)R.;G_:VK()+T3&;>]BII6M&2SU6PX*VKKI[,I0^I2ZUHVFT -MBCHBA@/Z]E6IE)2#'D^B7&50VBRC`O->1-!:!%V2J$L46%ZX](-5@J2T%B9# -M+F(9B^=8MAEH:T#J>!3`3!R2-0ZAZ"D'%,^<)`KR-Y>XWB8(_>!8XM08U$&F -MNPNLU>E3%D?PFKWLQD$R>,W<RVL9S>H=L[HW(Q&,Y+KB!.*KL9N1:%O`+_[= -M&?PBUV2G'N+)QW:-9:,=>/;1LJ/MC$2)<WTW1P\J3DT45O[5S7`V^.?/LWX* -MW^H6X1_15<8&1R1:%`JPQ-&<'\6!V0LOMT_,@-)XL&W.#IQ"^<9KD$K^R%"@ -MJ12C8"\<S%]'<RL(K*?Y+;#>(D1S*MPJ8@CHQW4@VEA1%``@<.,\LH([&HGR -MK0*3GVW`5"A]P1#CT"NY"_S-.A[5#/CHC@9O07EU@[N0S^77S#?]%N7E10'U -MVIS+T:0*HQ/4\BX*L/?FT(62O&$DMNC_RRGDK;%-R&3"G,F8+Y[8[%,\3+%K -M;F5/Z(8BY@4Z!]QTZ(E&]OW\WG^<KRSOB:O[U%#4D<YE!"7!@M-P41BOHRG] -M90C/20U,$G7CNKY+5WDGCV:CJ9G-:K*_F(<_O];(V_ZL]QY^AN/N#'[0J82O -M_N#="!XFXROX1ON`-7HWZ8X`Z-UD?`,MWW=_'(S>P>_X9@*8&,0`6@U&HSX6 -MP,.T/YH.9H,?^_QE,L/?67_R8W?(GL;P/>5+]J\QMOV^_[-&AMW1NYON.V@T -M['<O61_#_EMH.QQ\CX7C7E<,Z*K+!G\U&-W,9X]'L/3Z,NE?R0'34G0W& -M(^P1GFXF[*'WO@N$COH_`=;1&/_C`Q#*VMY<]2>#'F\]?JN1\0C_#V%HXVO$ -M!;\3_'_9QQ_HFM'/#Q<-F.<DCOA?/<]X:O+7G>X<?]#`1*9&RB.L@TNH*X*Q -M0(15H8@W\GA/`RI>!)0J:,B]]0#^51J`V?420!&WW)@A&5*HH-AM!=5J07M\ -M97V@S#M+*J0%4RAXS(WX98,>Q&LSYSBUH>.IO:Z>#\,;%)EFZDC50^<7Z8F= -MDM>MK9X4A^5U6ZU#.I,J0Y?&'[-@7QL&RX49#,NR^%-\%.OMN"?1?4G7`(D1 -MFZ$)5.Q:`)"Q!?0L'YBE>+@C'I'/ZR%5^RQ)??T:C5<14?/D#/#JO.G'_(ZF -MKL8CF@;HAJ8:H?^5=*<]>:Q<^$18/\5OB^?D6=1?]C,`+A2`LTK_ZGKV<^4L -M"\M91>315,X(GR?A]VVS8Z?`ST5WU0_YN_9WDJF59$\N#SJ4Y"\L."Q1K0Q? -M9OE<]/LKR>O@$"869=["!5XIHUJXHJ(Y@)^GR=SMK5,8L`BW=)OX2O/CF/3& -M8V4QFWDB-2KC'H92FW,)0X'8NH'QVM@&R+A[H=3N7+Q(M=R^=9&JW+YRD<77 -MPO'BD\PRO$9^>J9R,KW`&1.Y5]SBVYOK)?>-N,ATV!?[0)\>_6`19D<`DMJ] -M/ED"]ME^64[3.K3KF'M"D@9L>,-,3C`^%9E]740]?-G_Z5F3A:!OG"ADY>]! -M_\VF295'@V*LWZ'XA!?#L**BU/`)=$B]T&&I:2E30`&(J+7@E3-0]$D%K"*P -M5C$Q%I0JGQ>/GS5QQXJ3)<782Y!U</QO]M/]&\G*7#VSI1E5-<;/"FH*W>`@ -M+$!S%F.K26)WZ3(J<A,J+G(^(%5H3TERV(XI"NLJ@0-B/%8*M(SB8I\1"";C -M95)D,]*850:%^?LHH(^P$E3^7M*EXVW'TW)@LO=4#G#&SFID[ZQC$$#K5J>^ -MYQRF:IA:U5`L'%9@*AEP]]1"J\T/:8D^@"0"+\]-L@5%FHQ(P1$:RO'(@T,? -MB<.%6+A98[2-+G82==BQ5]JZ$*F_Y-=?B5K;V\D+WA*D:K9QNE<YG+`8AVQQ -MQ(2/^/3TE*4_+47^$I[!!QN7DM4FY)FJ()\7!'-%$`D+_8BV_'PVY"E?)9E0 -M.T<0&!"V^!IW+I\U__;?)Q<P=2SBN"]X%MG^^FS-:-]BKU1--E.E0#)8J9G- -M2OG-:AW=[%0;>X)GNE:+\X24R-;V+6$9VA(G(1B](A6>"3&6YZ*8:,QR\N(" -M,!5@LEZEKB1=\X/5^(Y+YFT7R9S9]WP_^]X-BPLR2G?C@G\RI8>O[KSL5&2G -MBX%3:!B_Q\4N]>3LU9%K+^\J95Y*PEN<KN7Q8G@0"=J"@M_AKM874'#\=:PC -M2<P4_55=JU;CO8MIEL2RHPT3@\'&B]-#3T\/7`T^+L-B<C.2^7SB.GEH/5"0 -MSDL_9-9OWUN(&UY"MMZL%]!<E+&SV"2#E^Q<F]*RDB_$/5Y)JW(C^O>G55F] -MG0R2/XSZS)5O5K5JLYF$+YD*FR/])7['E3%3%)_Y,'>#!0<PYK7#PFFI^\QG -M7/01VQ$OU8?2,&4Y[):KI_"[^E8(\/1=8GPXO6>Z<4]]6O?N`=S5P/4M8^[8 -MQF9'KW6,/:>EK:K64F_6`@]$/KK:(<\MC%.!T1Q2+F=+*44_@IWO\8NE3!I) -M+I]&5A`==:.4Z2\5S\Y5Z!>XC'N>C#6^H(R(8?L<.\@8`=[*9P-E6%BT(H!9 -MB<(25]K@&[@TT$B<J@KVFZ:T8OGQ924M[X>;_N3G.3-%>:8:6Y1$I_S?6I1C -M[([_BJ7*%PX\(X8)%O:X)1MVJ[-%PRY<AF1H94N&`VVKG6J]4]V3RM_0M49= -M^5,'\-I44RCP#(Q9"DJ4^ASU$WL/B1504%_>!W""-MZ"!EQ5!O3!\3>A>J6G -MPATVX=\A+S"T:F(#HOT;W@]-7S")?)XAD]62YS,4\EN*K!BV7X1F93$+<.>P -M&G6-!Z/F.C4F]M8**7JR/(T0&V$)D;XMP>*\OWK2J+:UAOHWC!HU`PJ2-+DX -MBSU),N$4*']QI62SQ(LRCM'F">%\B#Q7_A;<T>#IG*<&6X2_LHNFC+*R0/./ -J5".V8K`1>&?LC3PZT;V_B8@X[<#CAC]SA9Y)<AHC_9+_!=<!%F+O2@`` -` -end - - -From oleg@sai.msu.su Sun Oct 18 14:01:49 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id OAA01739 - for <maillist@candle.pha.pa.us>; Sun, 18 Oct 1998 14:01:48 -0400 (EDT) -Received: from ra.sai.msu.su (ra.sai.msu.su [158.250.29.2]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id NAA23532 for <maillist@candle.pha.pa.us>; Sun, 18 Oct 1998 13:51:14 -0400 (EDT) -Received: from ra (ra [158.250.29.2]) - by ra.sai.msu.su (8.9.1/8.9.1) with SMTP id UAA17832; - Sun, 18 Oct 1998 20:45:25 +0300 (MSK) -Date: Sun, 18 Oct 1998 21:45:24 +0400 (MSD) -From: Oleg Bartunov <oleg@sai.msu.su> -X-Sender: megera@ra -To: Tom Lane <tgl@sss.pgh.pa.us> -cc: Bruce Momjian <maillist@candle.pha.pa.us>, pgsql-hackers@postgreSQL.org, - jwieck@debis.com -Subject: Re: [HACKERS] SELECT ... LIMIT (trial implementation) -In-Reply-To: <2292.908726689@sss.pgh.pa.us> -Message-ID: <Pine.GSO.3.96.SK.981018213213.17519C-100000@ra> -Organization: Sternberg Astronomical Institute (Moscow University) -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Status: RO - -On Sun, 18 Oct 1998, Tom Lane wrote: - -> Date: Sun, 18 Oct 1998 12:04:49 -0400 -> From: Tom Lane <tgl@sss.pgh.pa.us> -> To: Bruce Momjian <maillist@candle.pha.pa.us> -> Cc: pgsql-hackers@postgreSQL.org -> Subject: Re: [HACKERS] SELECT ... LIMIT (trial implementation) -> -> Bruce Momjian <maillist@candle.pha.pa.us> writes: -> > What if someone wants the rows from 500 to the end. Should we allow -> > the syntax to be: -> > SELECT ... [LIMIT count] [OFFSET offset] -> > LIMIT and OFFSET are independent. -> -> I like that syntax the best, but remember we are not inventing in -> a green field here. Isn't this a feature that already exists in -> other DBMs? We should probably copy their syntax, unless it's -> truly spectacularly awful... -> -> regards, tom lane -> - -Mysql uses LIMIT [offset,] rows ->From documentation: - - LIMIT takes one or two numeric arguments. A single argument - represents the maximum number of rows to return in a result. If two - arguments are given the first argument is the offset to the first row to - return, while the second is the maximum number of rows to return in the - result. - -What would be nice if somehow total number of rows could be returned. -This is often needed for altavista-like application. -Of course, I can do -select count(*) from sometable ... LIMIT offset, rows -and then -select ... from sometable ... LIMIT offset, rows -but this seems not elegant solution. - - Regards, - - Oleg -_____________________________________________________________ -Oleg Bartunov, sci.researcher, hostmaster of AstroNet, -Sternberg Astronomical Institute, Moscow University (Russia) -Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/ -phone: +007(095)939-16-83, +007(095)939-23-83 - - -From owner-pgsql-hackers@hub.org Sun Oct 18 14:31:12 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id OAA02288 - for <maillist@candle.pha.pa.us>; Sun, 18 Oct 1998 14:31:10 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id OAA24844 for <maillist@candle.pha.pa.us>; Sun, 18 Oct 1998 14:15:35 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id OAA26655; - Sun, 18 Oct 1998 14:00:03 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sun, 18 Oct 1998 13:58:57 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id NAA26381 - for pgsql-hackers-outgoing; Sun, 18 Oct 1998 13:58:55 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from ra.sai.msu.su (ra.sai.msu.su [158.250.29.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id NAA26367 - for <pgsql-hackers@postgreSQL.org>; Sun, 18 Oct 1998 13:58:49 -0400 (EDT) - (envelope-from oleg@sai.msu.su) -Received: from ra (ra [158.250.29.2]) - by ra.sai.msu.su (8.9.1/8.9.1) with SMTP id UAA18077; - Sun, 18 Oct 1998 20:58:41 +0300 (MSK) -Date: Sun, 18 Oct 1998 21:58:41 +0400 (MSD) -From: Oleg Bartunov <oleg@sai.msu.su> -X-Sender: megera@ra -To: Jan Wieck <jwieck@debis.com> -cc: PostgreSQL HACKERS <pgsql-hackers@postgreSQL.org> -Subject: Re: [HACKERS] SELECT ... LIMIT (trial implementation) -In-Reply-To: <m0zUBum-000EBQC@orion.SAPserv.Hamburg.dsh.de> -Message-ID: <Pine.GSO.3.96.SK.981018215259.17519D-100000@ra> -Organization: Sternberg Astronomical Institute (Moscow University) -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -Jan, - -I tested your patch on my Linux box and it works ok, except -aggregates functions doesn't work properly, for example -count(*) always produces 0 - -kdo=> select count(*) from work_flats limit 10,1000; -count ------ -(0 rows) - -while - -kdo=> select rooms from work_flats limit 10,1000; -rooms ------ - 3 - 3 - 3 - 3 - 3 - 3 - 3 - 3 - 3 - 3 -(10 rows) - - - Regards, - - Oleg -_____________________________________________________________ -Oleg Bartunov, sci.researcher, hostmaster of AstroNet, -Sternberg Astronomical Institute, Moscow University (Russia) -Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/ -phone: +007(095)939-16-83, +007(095)939-23-83 - - - -From wieck@sapserv.debis.de Sun Oct 18 15:17:53 1998 -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id PAA03203 - for <maillist@candle.pha.pa.us>; Sun, 18 Oct 1998 15:17:49 -0400 (EDT) -Received: by dsh.de; id VAA01180; Sun, 18 Oct 1998 21:19:50 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma001117; Sun, 18 Oct 98 21:19:33 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id VAA25465; - Sun, 18 Oct 1998 21:17:29 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id VAA14993; - Sun, 18 Oct 1998 21:19:58 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<maillist@candle.pha.pa.us>> - id m0zUvyS-000B5AC; Sun, 18 Oct 98 18:46 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for maillist@candle.pha.pa.us - id m0zUyWO-000EBPC; Sun, 18 Oct 98 21:29 MET DST -Message-Id: <m0zUyWO-000EBPC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] SELECT ... LIMIT (trial implementation) -To: oleg@sai.msu.su (Oleg Bartunov) -Date: Sun, 18 Oct 1998 21:29:43 +0200 (MET DST) -Cc: tgl@sss.pgh.pa.us, maillist@candle.pha.pa.us, pgsql-hackers@postgreSQL.org, - jwieck@debis.com -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <Pine.GSO.3.96.SK.981018213213.17519C-100000@ra> from "Oleg Bartunov" at Oct 18, 98 09:45:24 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Status: RO - -Oleg Bartunov wrote: - -> On Sun, 18 Oct 1998, Tom Lane wrote: -> -> > Bruce Momjian <maillist@candle.pha.pa.us> writes: -> > > What if someone wants the rows from 500 to the end. Should we allow -> > > the syntax to be: -> > > SELECT ... [LIMIT count] [OFFSET offset] -> > > LIMIT and OFFSET are independent. -> > -> > I like that syntax the best, but remember we are not inventing in -> > a green field here. Isn't this a feature that already exists in -> > other DBMs? We should probably copy their syntax, unless it's -> > truly spectacularly awful... -> > -> > regards, tom lane -> > -> -> Mysql uses LIMIT [offset,] rows -> >From documentation: -> -> LIMIT takes one or two numeric arguments. A single argument -> represents the maximum number of rows to return in a result. If two -> arguments are given the first argument is the offset to the first row to -> return, while the second is the maximum number of rows to return in the -> result. - - Simple change, just flip them in gram.y. - - And for the 500 to end: - - SELECT ... LIMIT 500, 0 (after flipped) - - The 0 has the same meaning as ALL. And that could also be - added to the parser easily so one can say - - SELECT ... LIMIT 500, ALL - - too. - -> -> What would be nice if somehow total number of rows could be returned. -> This is often needed for altavista-like application. -> Of course, I can do -> select count(*) from sometable ... LIMIT offset, rows -> and then -> select ... from sometable ... LIMIT offset, rows -> but this seems not elegant solution. - - Absolutely makes no sense for me. As said in the other - posting, aggregates do the counting scan in a deeper level - and thus cannot get limited. So if you invoke an aggregate, - the whole scan is always done. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - -From owner-pgsql-hackers@hub.org Sun Oct 18 19:08:47 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id TAA00573 - for <maillist@candle.pha.pa.us>; Sun, 18 Oct 1998 19:08:46 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id QAA01305 for <maillist@candle.pha.pa.us>; Sun, 18 Oct 1998 16:14:30 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id PAA06110; - Sun, 18 Oct 1998 15:55:20 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sun, 18 Oct 1998 15:54:07 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id PAA05771 - for pgsql-hackers-outgoing; Sun, 18 Oct 1998 15:54:05 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id PAA05753 - for <hackers@postgreSQL.org>; Sun, 18 Oct 1998 15:53:52 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id VAA09240; Sun, 18 Oct 1998 21:56:10 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma008902; Sun, 18 Oct 98 21:55:19 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id VAA28158; - Sun, 18 Oct 1998 21:53:16 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id VAA15349; - Sun, 18 Oct 1998 21:55:45 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<hackers@postgreSQL.org>> - id m0zUwX6-000B5AC; Sun, 18 Oct 98 19:22 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for hackers@postgreSQL.org - id m0zUz52-000EBPC; Sun, 18 Oct 98 22:05 MET DST -Message-Id: <m0zUz52-000EBPC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] SELECT ... LIMIT (trial implementation) -To: terry@terrym.com (Terry Mackintosh) -Date: Sun, 18 Oct 1998 22:05:31 +0200 (MET DST) -Cc: hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <Pine.LNX.3.95.981018155322.29282B-100000@terry1.acun.com> from "Terry Mackintosh" at Oct 18, 98 03:58:57 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -> -> On Sun, 18 Oct 1998, Tom Lane wrote: -> -> > Bruce Momjian <maillist@candle.pha.pa.us> writes: -> > > What if someone wants the rows from 500 to the end. Should we allow -> > > the syntax to be: -> > > SELECT ... [LIMIT count] [OFFSET offset] -> > > LIMIT and OFFSET are independent. -> > -> > I like that syntax the best, but remember we are not inventing in -> > a green field here. Isn't this a feature that already exists in -> > other DBMs? We should probably copy their syntax, unless it's -> > truly spectacularly awful... -> > -> > regards, tom lane -> -> None that I have used (VFP, M$ SQL Server) that had 'LIMIT', had 'OFFSET'. -> So it would seem that the very idea of OFFSET is to break with what others -> are doing. -> -> I too like the above syntax. -> Why mimic, when you can do better? Go for it! -> - - We have a powerful parser. So we can provide - - ... [ LIMIT { rows | ALL } ] [ OFFSET skip ] - - or - - ... [ LIMIT [ skip , ] { rows | ALL } ] - - at the same time. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - - -From owner-pgsql-hackers@hub.org Sun Oct 18 19:08:39 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id TAA00557 - for <maillist@candle.pha.pa.us>; Sun, 18 Oct 1998 19:08:37 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id QAA03555 for <maillist@candle.pha.pa.us>; Sun, 18 Oct 1998 16:56:03 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id QAA10374; - Sun, 18 Oct 1998 16:36:26 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sun, 18 Oct 1998 16:35:16 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id QAA10298 - for pgsql-hackers-outgoing; Sun, 18 Oct 1998 16:35:15 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id QAA09974 - for <hackers@postgreSQL.org>; Sun, 18 Oct 1998 16:32:21 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id WAA18249; Sun, 18 Oct 1998 22:34:46 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma018115; Sun, 18 Oct 98 22:34:11 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id WAA29950; - Sun, 18 Oct 1998 22:32:01 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id WAA15581; - Sun, 18 Oct 1998 22:34:28 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<jwieck@debis.com>> - id m0zUx8Z-000B5AC; Sun, 18 Oct 98 20:01 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for jwieck@debis.com - id m0zUzgV-000EBPC; Sun, 18 Oct 98 22:44 MET DST -Message-Id: <m0zUzgV-000EBPC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] SELECT ... LIMIT (trial implementation) -To: jwieck@debis.com -Date: Sun, 18 Oct 1998 22:44:15 +0200 (MET DST) -Cc: terry@terrym.com, hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <m0zUz52-000EBPC@orion.SAPserv.Hamburg.dsh.de> from "Jan Wieck" at Oct 18, 98 10:05:31 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -> We have a powerful parser. So we can provide -> [...] - - This version now accepts all of the following - - ... [ LIMIT rows ] [ OFFSET skip ] - ... [ OFFSET skip ] [ LIMIT rows ] - ... [ LIMIT [ skip , ] rows ] - - rows can be a positive integer constant greater that 0, a $n - parameter (in SPI_prepare()) or the keyword ALL. 0 isn't - accepted as constant to force ALL in that case making clear - that this is wanted. In the parameter version the integer - value 0 still is used to mean ALL. - - skip can be a positive integer constant greater or equal to 0 - or a $n parameter for SPI_prepare. - - If any of these syntaxes is used in SPI_prepare()'d plans, - the given tcount argument for SPI_execp() is ignored and the - plan or parameter values are used. - - Anyone happy now? - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - -begin 644 opt_limit.diff.gz -M'XL(")%0*C8"`V]P=%]L:6UI="YD:69F`.4\:W?;-K*?U5^!:-.NY-"V*-EZ -MN?$>5:83;67)U2-MSSWWZ-`29/-&(E62BN--_=_OS``@08F4E4>;[JY/&Y'` -M8(`9#&8&@P%GSGS.#J<^"_SID><[M\<W]O0M=V?'4V^YM-U9H!Z.I@BSH_J; -M@X.#?=#D+GV']:<A,ZO,-)NGE6:ESLQ&H_[-X>'A$WTDVI:;I]7FR8EH>Y#\ -MH\%4&@94TRNBQM=3!D^'WS#V-\>=+M8SSO+KT%D$Q\OI^_#H+I]2L_+\T%ZD -MUP4/P=2>WG&L?:'5!J'ON+>B#?QW?$#=ZG]0R@YRN6M";KWGTW7H^:^YO;KB -M2\]_8$&XGL]3J3)+IF&6JC%=9JD,!75%6<YQPUPN-^=VN/;Y&9;\M.;^PP4/ -MIM#G;^J9:D1O;<\-^?N03<7O&="2@[(`\"R<Y=1;N^&9H"273DH.:`ELUPD? -M&'!C^C9('[E9,4RSKHW</#7,RDDT\L<=G;R@3MH^D,69C4,-0N9ZP.VY[RU9 -M>,?9K?..NXR&R][9BS47C3)P'>//DB\#'A:^4V0:K&2PP/D7]^8%558L$D/4 -MZU'XL.*YW$LVFA"/DI4T+H)XR3J]T4F_<Y$"L.`NU,M^8+Y.BBE`1`*`%2Y@ -M)I=%.0U;8$[@KA<+@+ML=8=6"L#-`V#"\0[&5FI[X,".Y@Z(>)``0)AL.;CE -M(<V&6#?Q[,AWUUYR`9F!X#A==FI5PZR7A>P`7.;"`7XEA+J(T!+\%0]CR((8 -M4)$D^QG+*5R#M5N(%HG!HI;#$"1/-3*87%^&D+>B6A_.G!5F'$3SY4O6\UQ> -MA*4(O+KJO[&0-!S+:NYS'G<!36DM-&`5-^)5_-<AL-##5790[(V[W?@M6C*? -M1_HLTP!Q.5QZN+(==\,"I=2GFZ`4P/UMT!.-RZ5FZ;1I-K*-4/7$J#9BE0>O -MM9*:Y``X[DS9.\^9,<N=72]LMX#_L(,5_&LPBZ:$'7`$Y,1HV62T7BWXR+Y9 -M\.'""]F!F%M.&)*M8()CC#0)PAQ`B>T'?`038K#V<C8"G<6\%?<!OP>0+Q`2 -M5!/SYG-0$-1A(!%@L;M>WG!?%K/AU'8O')]/L3&;J2<)3P06#E9@%,/YVIT6 -M6:&H4R,8`"0,.!A._HX7-ND+X%^#I>$QTM5%%4R-XCN:VBUE\[%_A`6E>'-H -ML+3TE17;V@-MD6W."7(P6F#X(I82H/^`+)/SD<M%$Q+;\1P.))H[J3Q`K,Q8 -MKO[:Y`H%`NI#2)96\.E,2#<9X"C5=$>I!BJVUHA4["9I/@_6"_)TP/LAC_," -MU1GJ-"I$\<OE"@=8X+@T(I1`LIGD=`F"0$.7XC+ACE"1<FZV_O;WH!I`4D,G -MJ7%BE.LQ28+AA^<\F*Q\;\K!ML]4YWKE`DPZ+B9P4ESP#IQ9WYG1`%^D#U!X -M7Z#AA8^E;+PDV)O36[=SU1FQZ<)>!]+URD!$KA>:BT@(V#.P&6!?BECS@92/ -M=$`/I@*".)J[MGU["86KK<*N$X0==^[E5O36$54T!8YR6G+!O1-.[U@!_<:1 -M?1OW7Z2.9<\Y<'BX<N^:HB@WC2:W0.5@`J/69Q(F!H%^BP79Y/`\=N>*"O0& -M'-FWT;A4CT2)ZG$5HZ/RM!XEL0"CSSP63A;`D(D#'(E[(9Y'332.XQ]?>+<% -M:S#H#PR6)R`><I_-/9]!MXXR!.!SA[">F3*,I,-Y/B(,X0L.R1R37?V/\[]' -M;QUWAI-\W1JTKB:=WIM6%SQCYKQXH0;P00U$&V34\J5JV1M?L>^^TS$[5+M2 -MO*8:9Q:1%7,:7QZW&;'=AQS=E^;,1I_";T_O)($63"MBON$T7V)G$V/=D#FM -M@UC@TF5NQN<VZ#LE;HD!K%W^?@4V'+0'[;%P1\.^G3$[2)"<-UC*4A)#>U0= -M(=URE-^SDB1X'W)=?@M*]ITB]C':>NRMGX3R_1SU)##LT$[QMBQ63IMEGZJ; -MY/;S2=6D;(RNF;0QQ$9(ZB5Z_62U%"'3M%*BMS]3*8G!_$5UDN3SUU!)>_'E -MHS62P+I;(25E[<_21]1K4AWIP9ND-A)#W*F,-BE-TT7@4JE%*YU;VHNC\YKA -MO36,<NDTBF'(/Z9MS61!M#/32[7-V;.XM-7M3D;CZZXU3`!?>OZ][<\2^[($ -M@.[$GHD*.1_H5Y8;9:/<B/W*+S)4Z>_K12+H]H4&GL;S<JENE,V*%@4NE8V* -M%BW]=,I>;%/&OB!EJ=2485K*-8T:LV94RI6O0,T/]O3M9Y-3J1GED[)&3J5B -M5"J-+TM.*0'3[UEBO7SIN:G"WJRJ[\UJ];I1:YQHQ#P=B1'%GQN.$<6?$)-) -M):QV4C9J)YK0U4]*1OU4FZ4/`J78/S-API-+,Z&",QPX].!@'D"%W[-[]-V6 -M0$S(%P_2?G$11D8>PM:<!6^=E6HF>PZ)?`8JWN>_K6'&P%S</$C'3S#N*.H) -M9G,!N*&GX,Y;+V8LA*D(/3;SF$-6<\8Y\)\M^#N^"%0SP+WR@L"Y67!6F*WQ -MF`=@9_P]"X#=105VR/YIN_(EB]CC#>]83!X[5V9).A^'AWJUM+)X4N.X:W&\ -M$YV;I')VCP@KSC^*1I`58M4`GHBQ:I"?$&3-:MUHELQFJ9P=934K)<.LG&J! -M$2K84O,Y$9D6;!/>*<BK.%5282T1!R^J<`C-$,6V<(4>GI-_T$]$+=COO[-- -MB/;6QF'#S]"W(^*49/A3ET4<(-_M`?IP<!DLN0O"+)P/&CL.RK7]6RDOVBH4 -MQW].ECDL@0M252X(MI"N"WILW=80G/W^</33V.I.VOVKJU;OHL"#8I']@UF_ -M6.W)P!J!`F5-^3;NJ<,%GP,2-Q$:Y,'A^6\S@^&O"@1&0<`2\5<*KA8&%MY' -MJ0*CC!3,UQME^M$'S6C&\/=8;<'*R5IG5/7$"B.8E+75>&)M;;=K-,NGS4HE -M>U75P*35$B:-"N)5=>-Y"Y"U0,7M.V[H#?B";!9,U=Q>!$)%3>]LGV*V()U> -M#W8KNI40$NM+Y29WUB&Y')-I=,2*S*=PH-A>J-:Z%Q[92^F'I]%4+Y\:]4I) -MLV;EFE&OGFJ:0DK)\+HSH<4ZZ5^/>S_V^C^3'`EM^V+7*?4K&7X@G2#-#]DF -MX4<]?2PM-V;"*<A4*!^D-4W%A#W07TOMD(2F`<-&9A2QAX"=>>^X[SO@WV"Y -MLE^"^RS:62J,&3T)4Z:F)G7DT;8)M*"(O^PW_)Z7"-S@^*.Q'[%Q@,D`"V]J -M+U@[2@F(J/#8:@U3(0:&H@>F?2]25%Z`+H5Z;H!>KK:8>ADE";#X+YDMD`2- -M4@84J)XWD`*ZX&Z$=2N%(`6>]MT27N82A%J\9KN!B`.(!G%60`H@918H^E1V -M02I"-)9[(!2Y!AN`"=F*CI^W](/:DN/:D89=KA5Q#DV.X\KG*-.DG^29M%SM -MI'XPPV<^XW.Q]L%XC$>P_(>CUFB8KDQ.0)F<FO&.7E,=_1\G[?%@V!_$2B/[ -M$%X:'K)7E^@>A,FS]0EBG*Y]GU-`23O:23GP.5-LB/0ALJ)]=3$96EVK/<)@ -M5=3WX;DZLX<NBD(CUL&_KU=CC?C%J-K4#'UY`OB5B,TVUJA%,.]L]8`.V:9? -MO%6;;K*WP+:M]DDIW6KO;@K6OMP$;S?;'3ZMU0WSM*[%/521-JTNO\=^#L_7 -M+K"M+?3K2Q;RY8H"M0EKA^L.5-CJH8"^JL%D8X-I$UD\>QJR+:=:+%8I61(D -M\JF>FAAO'6;/2URY:UIBJ(^=E8R6,"FEYFDI>U+*IPVC7-42$D5![$W9JQ7T -M,J3<03PN`#7F&^)`X/#\S@Z&ZYNNX[X-P,W-A_Z:Y\'#S9./E1?I%!D8`$Z? -MX;R`G0`=.%4"9DL0Q%QF(M1W03(FFH9P2SAV(Q0^SE/XVI&V^"@'7,P>;/5F -MV;*CU>X2'@WL8Z4GJRF(C]D\V>&,BY06/7L2"VIQ?"GTH!M8OXM@!8\%L6?Y -M#KR%V_"N>$8V$&,F26$01I`<J$F:,L"R`0RY@`(7[8GW[DH7$^%:Z5WIM=M= -MO?B$KH0`9?34ECY$2D>Q*HI;[:&-R)[YQ[9K+Q[^Q3<D:K,R7:`VH5+DR4R7 -MIYTM*\TR;.]J.\0)C+Q9UU-)L*!1TC?=ZOQOR!=\&@[#9=B4,0:PM\\*A;@< -M/++8N!?!:%,6(>9ZRM"'#$[$,<+0M]U@[OG+&$EA)1V&3,3JC$E@V12@C0'I -MX]$`4W$HT7@*15L[YWP4)-%V)HNX]MH/,**T'W%ZQ/1)H;N%K=G10YI$B)J= -MXB9`4F2MO%/69+/AVA7-ZJQ<;I9+S4HU6]#`13[5MMOX:FYGX4]MD!?O]AA^ -M46K2T^TQ?K998T_1#SQ^;T_#S2Q\A7-U.\'M592.+WW\JW%WU/GAUY&5P+>\ -M0?A[#%A@@SV2"W,YF&+8B9#*!*<77FX>R($R1&A8G'T'ZDW4()7BD5"@JQ2A -MH!<!YJW"B>W[]L/D!D1O%J`[%6P4B6#F^Y4OV]AAZ`,@2.,DM/U;'LKRC8*R -M.(D#5FA]P1"C@P)VZWOK532J$<C1+?<OP7BU_-M`\/);VKA^C_KR/(=V;2+T -M:%R%,2)NN^<Y6'L3Z$)+6#1C7_2_DH6B-;8)2"=,2,=\,F/3SYPQK;RVD3%8 -M,C4U+]$YL)>'GG@XO9O<>?>3I>T^"'.?&(H^THD(+<@B<4PQ43<O8LS(FO-< -M?Q4.^6^8"A/7`./X(JJS%GR9=79>KM:,<JT2KSD*#TRN#79IC=JOX:?;;XW@ -M![>9\(_5>=6#AT'_"OY%GX$:O1JT>@#T:M`?0\O7K3>=WBOX[8\'@(D@.M"J -MT^M96``/0ZLW[(PZ;RSQ,ACA[\@:O&EUZ:D/_P[%-/ZSCVU_M'XU6+?5>S5N -MO8)&7:MU07UTK4MHV^W\B(7]=DL.Z*I%@[_J],8CHN:JWQN]QH=>ZTH=Z?=: -MHTZ_ASW"TWA`#^W7+2"T9_T"6'M]_!\?@%!J.[ZR!IVV:-V_-%B_A_]W86C] -M:\0%OP/\_\+"'^B:Z*<]2<T$/M?BA?GOS&>,&_YUV9TJYHV&4=%31#J]]L"Z -MLGK$D`OK%_QY#;V-AL2I$="-K.E%K`>>M/M7UYTN]M7M`$0/68!@R`@Q''CZ -MD<AO_0(<'EO$$O74?R//QGO6ST@I#*`ULBY^B)_'0T3>Z_<LXL1KXCP\="Y_ -MI5\Q&IRL?N=BB%RP!JT1\N"Z-1S^#(R`IT&_;5T0>ZFS@=7N7`.^@853@;]# -M:X0_,`4]P#'HPV`&8W5N/[1^&EN]-@#"6#HX1P".O!^^1L#AJ(4RA)$[R;WA -MZ`+E!GY@`@P,5P)K8!R$;=Q3G!KW1AU`]J;5'H^O\+?;`:`WUN"'_M"BAR%P -M4&:25&"NM&/P?_>YNKPDEO^GSEE&3`;TW:E^Q@5OIT:Y6M*<DQR3GKWF8K#[ -M.^YS^2*A=&//[NQWCGN;!*"]M0+07!ZQH6`IGD!.VSOE])T#[HF7]EM.$9*X -M0NTB<CF7MO*_K7$7_[R<<1Q<+9615LT_P#<H*I<31^<N!J"0GB@P\+R^T9,6 -M-'C>T.N0SKC*+)WI297/39/.M#IQSF>4=(F--T($X5VA9``2,]H*QE#1]AZ` -MS`V@QSBI47%[9T?B=#&KAT3MHR+U^7/M?,)5'!#56>S'C,!:28\)UDSPSQ)I -M0[^SUK`=)3!\8-1/_OO\&7N4]1=6"L"Y!G!\8%U=CWX].$[#<GP@,R\/CIG@ -MDXR];(IC,R=.XE+\/?9WX^]LVS6D8S[1U4)$_@KJMX=+]GFY"/^<%,]DQ[^S -M1`^ZDRFT4X:ON;N3DR+U]'0G3V&BTZ0-7-GC^N1NMKGR&<0C+I&P$&$[/F`D -M#C).)IL#^%ER_K='WLQUZ,!-Q73$$A`G]DF-1&7%C2SOYR;[GIGI"<:B,SR^ -M$<?5RW5`B;>M;I=Y/K,Q[<K!#%P\Q^6PB1)YQYC^DM?[<65>>\H=;*TVXP*V -M!K%Q^_JYN0F0<N]:J]VZ=)UHN7GC.E&Y>=TZ3;?(`)283V#1QTS('\BETE^7 -M291'GV23N*^19!.5Z612X$$DX\?I_IOU=),N(2)43)O<+>[N&&9RX>GK_#-6 -MWG_ABOC+3[;P">3'09Z.];[E#_>>/PO23QCBVITQWQCLH^.^6M-D[)?.&78< -M,H`S8Y;C_(@/>8K?Y>4&Z=%0A>!+.V&0CW=,<97+_7P4*X#B0U$,PPKS*EH0 -M0P?<%68BGP@K:``AMV?Y:$,65X3<!P'-QX$'K<H3Q?U'0WZW1)"E7+0O0=:3 -MXW^QF^[/)"MU]LIUPZSH.014<*+1O8!>85>0CR(P"ON"S\.\",=$1<Y;I`IC -M,XH<,O5Y&:F)X8`8-Z]VQ%&Q1P3B]C@NFA)I%.')(N*T:IA5,Y$(`045C0C4 -M6GD5SE&XW?42)F^:C\([JL*;0UG_4I$07804/EH$Y<QPWG$O'14M</SM\0"V -MRS$<$MI'(K.5@,_O08RX^KW@<\?=/&S,@$E7"!G`*6JAFJX6]D$`K>O-TQU) -M*A6S;%3,Q&66<O(RRQVW<3OM!;S`WW$WG/@RMS1*%<H=JVQZZ6T[+GOG\'OF -MB`3J8+W"HT@^V\JYIYR@W=G<GY3)G>A5#2?07-1C$=B#$1\='=%-AKF\BH!Y -MF?YZP2/?%P\X9@S3F1$)G8O)MB)U+1"W-PKJ;MP$06!`V.);%#_!->_F_P[/ -M@75T'+OK9#&<>JOC%=&^(5Z)FG2A2H"DB%(M792RFYTT2^7=)XLEXR1*9=>. -M_38_&Z;._62:"![ML0.1\]]726-X9Y"NUT0%8,Z!6<\2WRBY%EEGT4<O4C]_ -MH80S_<-?'_TA#CHT)4JW#TV_,J5/?\OCR[(B_4;#J5$VS3_B2R]Z6M&S/>=> -M?;PD]2LE^%FGA>V*8GB0=RTE!7_`QUL^@8+]O\^R)XFIJK]2,BJ5:.UBKC:S -MI^&:U*"_=J.;7D='3WPK;+_DT\&XIZZ<R._+!39%$N9>0)>F+7<F/_DB=>MX -M-8/FLHP2U>++>&SK.RI&6F:J_+"7HE7[1-H?3ZLV>UO?Z?K3J$^=^5K%J-1J -M\0$7F;`)TE\0'[V*LON+4?ZIB-KB&<66"">U[J/@N.PC\B.^5!]:PXT$YLUR -M/45QV]Y*!9[\N!@^'-V1;=Q1G[2].P"W+?#IAC.W;^-RLW32-'>DDM4K1EW_ -MU!;(0.CA=C@0]]KB.VWR6P3R:VU*2_'WL$EQQ9>F2!MI-_'\<*]/3)']TO%L -M?1OM"WR=ZRP>:_3%,D0,RV??048(\#-]-%#"0C$;'[@2!@5AM&%CL^"^P:+; -M5."_&5HKNDY4U&XL_#2V!K].R!452?PT*;%-^<^:E'W\CG^+J<I6#B)=F!0+ -M/6[HANWJ=-6P#9>B&>KIFN&)MI5FY;19V7$KMUHRJMJ=7'RMZ?FEF`Q$GH)V -M?'B&]HG>`V;[',R7^Q8V06MWQGUA*GW^SO'6@7X[_T!>M1/[.[HIB&CUK$]$ -M^S?\%%#RKGCHB?3AM)8BV3.7W5*F#--ZD9:5`BZPG<-JM#4NC%K8U(C8&SO@ -MN),5=RRP$98PM;=E6)SU&=1JI6%4]8\:5T],*(CO$$07+>,,7$&!]@G6PI2R -M4HLXQJGXH*X8HKC.>0/;4?_A3-R:LIEXI<^Y$&5%B>8?B48T8[`01&?TQNZ= ->\,Y;ATP>0^,Y\-><H4<6'Y.K?<G_`Z+L!%(`6P`` -` -end - - -From owner-pgsql-hackers@hub.org Mon Oct 19 07:31:10 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id HAA05591 - for <maillist@candle.pha.pa.us>; Mon, 19 Oct 1998 07:31:09 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id HAA13574 for <maillist@candle.pha.pa.us>; Mon, 19 Oct 1998 07:12:57 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id GAA13957; - Mon, 19 Oct 1998 06:25:09 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Mon, 19 Oct 1998 06:22:35 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id GAA13581 - for pgsql-hackers-outgoing; Mon, 19 Oct 1998 06:22:33 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id GAA13566 - for <pgsql-hackers@postgreSQL.org>; Mon, 19 Oct 1998 06:22:27 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id MAA13918; Mon, 19 Oct 1998 12:21:16 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma013635; Mon, 19 Oct 98 12:20:55 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id MAA11037; - Mon, 19 Oct 1998 12:18:27 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id MAA29382; - Mon, 19 Oct 1998 12:20:49 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<maillist@candle.pha.pa.us>> - id m0zVA2V-000B5AC; Mon, 19 Oct 98 09:47 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for maillist@candle.pha.pa.us - id m0zVCaT-000EBPC; Mon, 19 Oct 98 12:30 MET DST -Message-Id: <m0zVCaT-000EBPC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: Inoue@tpf.co.jp (Hiroshi Inoue) -Date: Mon, 19 Oct 1998 12:30:52 +0200 (MET DST) -Cc: jwieck@debis.com, pgsql-hackers@postgreSQL.org, maillist@candle.pha.pa.us -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <002801bdfb46$39ad8ec0$2801007e@cadzone.tpf.co.jp> from "Hiroshi Inoue" at Oct 19, 98 06:52:46 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -Hiroshi Inoue wrote: - -> When using cursors,in most cases the response to get first(next) rows -> is necessary for me,not the throughput. -> How can we tell PostgreSQL optimzer that the response is necessary ? - - With my LIMIT patch, the offset and the row count are part of - the querytree. And if a LIMIT is given, the limitCount elemet - of the querytree (a Node *) isn't NULL what it is by default. - - When a LIMIT is given, the optimizer could assume that first - rows is wanted (even if the limit is ALL maybe - but I have - to think about this some more). And this assumption might let - it decide to use an index to resolve an ORDER BY even if no - qualification was given. - - Telling the optimizer that first rows wanted in a cursor - operation would read - - DECLARE CURSOR c FOR SELECT * FROM mytab ORDER BY a LIMIT ALL; - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - - -From owner-pgsql-hackers@hub.org Tue Oct 20 06:01:49 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id GAA02483 - for <maillist@candle.pha.pa.us>; Tue, 20 Oct 1998 06:01:48 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id FAA07799 for <maillist@candle.pha.pa.us>; Tue, 20 Oct 1998 05:51:19 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id FAA00108; - Tue, 20 Oct 1998 05:17:58 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Tue, 20 Oct 1998 05:16:37 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id FAA29953 - for pgsql-hackers-outgoing; Tue, 20 Oct 1998 05:16:35 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id FAA29939 - for <hackers@postgreSQL.org>; Tue, 20 Oct 1998 05:16:27 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id LAA04585; Tue, 20 Oct 1998 11:15:05 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma004337; Tue, 20 Oct 98 11:14:46 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id LAA14628; - Tue, 20 Oct 1998 11:12:27 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id LAA03564; - Tue, 20 Oct 1998 11:14:52 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<maillist@candle.pha.pa.us>> - id m0zVVUa-000B5AC; Tue, 20 Oct 98 08:42 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for maillist@candle.pha.pa.us - id m0zVY2c-000EBPC; Tue, 20 Oct 98 11:25 MET DST -Message-Id: <m0zVY2c-000EBPC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: Inoue@tpf.co.jp (Hiroshi Inoue) -Date: Tue, 20 Oct 1998 11:25:22 +0200 (MET DST) -Cc: maillist@candle.pha.pa.us, jwieck@debis.com, hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <000601bdfc03$02e67100$2801007e@cadzone.tpf.co.jp> from "Hiroshi Inoue" at Oct 20, 98 05:24:09 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -Hiroshi Inoue wrote: - -> > * Prevent psort() usage when query already using index matching ORDER BY -> > -> > -> -> I can't find the reference to descending order cases except my posting. -> If we use an index scan to remove sorts in those cases,backward positioning -> and scanning are necessary. - - I think it's only thought as a reminder that the optimizer - needs some optimization. - - That topic, and the LIMIT stuff too I think, is past 6.4 work - and may go into a 6.4.1 performance release. So when we are - after 6.4, we have enough time to work out a real solution, - instead of just throwing in a patch as a quick shot. - - What we two did where steps in the same direction. Your one - covers more situations, but after all if multiple people have - the same idea there is a good chance that it is the right - thing to do. - -> -> Let t be a table with 2 indices, index1(key1,key2), index2(key1,key3). -> i.e. key1 is common to index1 and index2. -> -> And for the query -> select * from t where key1>....; -> -> If PosgreSQL optimizer choose [ index scan on index1 ] we can't remove -> sorts from the following query. -> select * from t where key1>... order by key1,key3; -> -> Similarly if [ index scan on index2 ] are chosen we can't remove sorts -> from the following query. -> select * from t where key1>... order by key1,key2; -> -> But in both cases (clever) optimizer can choose another index for scan. - - Right. As I remember, your solution does basically the same - as my one. It does not change the optimizers decision about - the index or if an index at all is used. So I assume they - hook into the same position where depending on the order by - clause the sort node is added. And that is at the very end of - the optimizer. - - What you describe above requires changes in upper levels of - optimization. Doing that is far away from my knowledge about - the optimizer. And some of your earlier statements let me - think you aren't familiar enough with it too. We need at - least help from others to do it well. - - I don't want to dive that deep into the optimizer. There was - a far too long time where the rule system was broken and got - out of sync with the parser/optimizer capabilities. I fixed - many things in it for 6.4. My first priority now is, not to - let such a situation come up again. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - - -From wieck@sapserv.debis.de Tue Oct 20 13:00:04 1998 -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id NAA08269 - for <maillist@candle.pha.pa.us>; Tue, 20 Oct 1998 13:00:01 -0400 (EDT) -Received: by dsh.de; id TAA14203; Tue, 20 Oct 1998 19:02:15 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma014037; Tue, 20 Oct 98 19:01:39 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id SAA24445; - Tue, 20 Oct 1998 18:59:16 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id TAA06159; - Tue, 20 Oct 1998 19:01:40 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<maillist@candle.pha.pa.us>> - id m0zVcmS-000B5AC; Tue, 20 Oct 98 16:29 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for maillist@candle.pha.pa.us - id m0zVfKV-000EBPC; Tue, 20 Oct 98 19:12 MET DST -Message-Id: <m0zVfKV-000EBPC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: maillist@candle.pha.pa.us (Bruce Momjian) -Date: Tue, 20 Oct 1998 19:12:19 +0200 (MET DST) -Cc: jwieck@debis.com, Inoue@tpf.co.jp, hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <199810201645.MAA07946@candle.pha.pa.us> from "Bruce Momjian" at Oct 20, 98 12:45:49 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Status: ROr - -> -> I agree. Another good thing is that the LIMIT thing will not require a -> dump/reload, so it is a good candidate for a minor release. - - That's wrong, sorry. - - The limit thing as I implemented it adds 2 new variables to - the Query structure. Rewrite rules are stored as querytrees - and in the existing pg_rewrite entries that would be missing. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - -From owner-pgsql-hackers@hub.org Tue Oct 20 13:24:47 1998 -Received: from hub.org (majordom@hub.org [209.47.148.200]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id NAA08484 - for <maillist@candle.pha.pa.us>; Tue, 20 Oct 1998 13:24:45 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id NAA01878; - Tue, 20 Oct 1998 13:00:06 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Tue, 20 Oct 1998 12:59:59 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id MAA01579 - for pgsql-hackers-outgoing; Tue, 20 Oct 1998 12:59:58 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id MAA01557 - for <hackers@postgreSQL.org>; Tue, 20 Oct 1998 12:59:52 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id TAA14203; Tue, 20 Oct 1998 19:02:15 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma014037; Tue, 20 Oct 98 19:01:39 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id SAA24445; - Tue, 20 Oct 1998 18:59:16 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id TAA06159; - Tue, 20 Oct 1998 19:01:40 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<maillist@candle.pha.pa.us>> - id m0zVcmS-000B5AC; Tue, 20 Oct 98 16:29 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for maillist@candle.pha.pa.us - id m0zVfKV-000EBPC; Tue, 20 Oct 98 19:12 MET DST -Message-Id: <m0zVfKV-000EBPC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: maillist@candle.pha.pa.us (Bruce Momjian) -Date: Tue, 20 Oct 1998 19:12:19 +0200 (MET DST) -Cc: jwieck@debis.com, Inoue@tpf.co.jp, hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <199810201645.MAA07946@candle.pha.pa.us> from "Bruce Momjian" at Oct 20, 98 12:45:49 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: ROr - -> -> I agree. Another good thing is that the LIMIT thing will not require a -> dump/reload, so it is a good candidate for a minor release. - - That's wrong, sorry. - - The limit thing as I implemented it adds 2 new variables to - the Query structure. Rewrite rules are stored as querytrees - and in the existing pg_rewrite entries that would be missing. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - - -From wieck@sapserv.debis.de Tue Oct 20 13:10:22 1998 -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id NAA08339 - for <maillist@candle.pha.pa.us>; Tue, 20 Oct 1998 13:10:18 -0400 (EDT) -Received: by dsh.de; id TAA17171; Tue, 20 Oct 1998 19:12:30 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma017064; Tue, 20 Oct 98 19:12:00 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id TAA24806; - Tue, 20 Oct 1998 19:09:37 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id TAA06212; - Tue, 20 Oct 1998 19:12:01 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<maillist@candle.pha.pa.us>> - id m0zVcwS-000B5AC; Tue, 20 Oct 98 16:39 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for maillist@candle.pha.pa.us - id m0zVfUW-000EBPC; Tue, 20 Oct 98 19:22 MET DST -Message-Id: <m0zVfUW-000EBPC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: maillist@candle.pha.pa.us (Bruce Momjian) -Date: Tue, 20 Oct 1998 19:22:40 +0200 (MET DST) -Cc: jwieck@debis.com, Inoue@tpf.co.jp, hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <199810201702.NAA08286@candle.pha.pa.us> from "Bruce Momjian" at Oct 20, 98 01:02:58 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Status: RO - -> -> > > -> > > I agree. Another good thing is that the LIMIT thing will not require a -> > > dump/reload, so it is a good candidate for a minor release. -> > -> > That's wrong, sorry. -> > -> > The limit thing as I implemented it adds 2 new variables to -> > the Query structure. Rewrite rules are stored as querytrees -> > and in the existing pg_rewrite entries that would be missing. -> -> Oh, sorry. I forgot. That could be tough. - - But it wouldn't hurt to add them now to have them in - place. The required out-, read- and copyfuncs are in - my patch too. This would prevent dump/load when we - later add the real LIMIT functionality. And it does - not change anything now. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - -From owner-pgsql-hackers@hub.org Tue Oct 20 14:57:36 1998 -Received: from hub.org (majordom@hub.org [209.47.148.200]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id OAA11449 - for <maillist@candle.pha.pa.us>; Tue, 20 Oct 1998 14:57:34 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id NAA03547; - Tue, 20 Oct 1998 13:10:38 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Tue, 20 Oct 1998 13:10:23 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id NAA03488 - for pgsql-hackers-outgoing; Tue, 20 Oct 1998 13:10:21 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.8.8/8.8.8) with ESMTP id NAA03455 - for <hackers@postgreSQL.org>; Tue, 20 Oct 1998 13:10:10 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id TAA17171; Tue, 20 Oct 1998 19:12:30 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma017064; Tue, 20 Oct 98 19:12:00 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id TAA24806; - Tue, 20 Oct 1998 19:09:37 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id TAA06212; - Tue, 20 Oct 1998 19:12:01 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<maillist@candle.pha.pa.us>> - id m0zVcwS-000B5AC; Tue, 20 Oct 98 16:39 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for maillist@candle.pha.pa.us - id m0zVfUW-000EBPC; Tue, 20 Oct 98 19:22 MET DST -Message-Id: <m0zVfUW-000EBPC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -To: maillist@candle.pha.pa.us (Bruce Momjian) -Date: Tue, 20 Oct 1998 19:22:40 +0200 (MET DST) -Cc: jwieck@debis.com, Inoue@tpf.co.jp, hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <199810201702.NAA08286@candle.pha.pa.us> from "Bruce Momjian" at Oct 20, 98 01:02:58 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: ROr - -> -> > > -> > > I agree. Another good thing is that the LIMIT thing will not require a -> > > dump/reload, so it is a good candidate for a minor release. -> > -> > That's wrong, sorry. -> > -> > The limit thing as I implemented it adds 2 new variables to -> > the Query structure. Rewrite rules are stored as querytrees -> > and in the existing pg_rewrite entries that would be missing. -> -> Oh, sorry. I forgot. That could be tough. - - But it wouldn't hurt to add them now to have them in - place. The required out-, read- and copyfuncs are in - my patch too. This would prevent dump/load when we - later add the real LIMIT functionality. And it does - not change anything now. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - - -From owner-pgsql-hackers@hub.org Wed Oct 21 02:35:54 1998 -Received: from hub.org (majordom@hub.org [209.47.148.200]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id CAA29494 - for <maillist@candle.pha.pa.us>; Wed, 21 Oct 1998 02:35:53 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id CAA13326; - Wed, 21 Oct 1998 02:10:42 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Wed, 21 Oct 1998 02:09:35 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id CAA12900 - for pgsql-hackers-outgoing; Wed, 21 Oct 1998 02:09:33 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from candle.pha.pa.us (maillist@s5-03.ppp.op.net [209.152.195.67]) - by hub.org (8.8.8/8.8.8) with ESMTP id CAA12871 - for <hackers@postgreSQL.org>; Wed, 21 Oct 1998 02:09:26 -0400 (EDT) - (envelope-from maillist@candle.pha.pa.us) -Received: (from maillist@localhost) - by candle.pha.pa.us (8.9.0/8.9.0) id CAA27774; - Wed, 21 Oct 1998 02:09:27 -0400 (EDT) -From: Bruce Momjian <maillist@candle.pha.pa.us> -Message-Id: <199810210609.CAA27774@candle.pha.pa.us> -Subject: Re: [HACKERS] What about LIMIT in SELECT ? -In-Reply-To: <m0zVfUW-000EBPC@orion.SAPserv.Hamburg.dsh.de> from Jan Wieck at "Oct 20, 1998 7:22:40 pm" -To: jwieck@debis.com -Date: Wed, 21 Oct 1998 02:09:26 -0400 (EDT) -Cc: jwieck@debis.com, Inoue@tpf.co.jp, hackers@postgreSQL.org -X-Mailer: ELM [version 2.4ME+ PL47 (25)] -MIME-Version: 1.0 -Content-Type: text/plain; charset=US-ASCII -Content-Transfer-Encoding: 7bit -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -> > -> > > > -> > > > I agree. Another good thing is that the LIMIT thing will not require a -> > > > dump/reload, so it is a good candidate for a minor release. -> > > -> > > That's wrong, sorry. -> > > -> > > The limit thing as I implemented it adds 2 new variables to -> > > the Query structure. Rewrite rules are stored as querytrees -> > > and in the existing pg_rewrite entries that would be missing. -> > -> > Oh, sorry. I forgot. That could be tough. -> -> But it wouldn't hurt to add them now to have them in -> place. The required out-, read- and copyfuncs are in -> my patch too. This would prevent dump/load when we -> later add the real LIMIT functionality. And it does -> not change anything now. -> - -Jan, we found that I am having to require an initdb for the INET/CIDR -type, so if you want stuff to change the views/rules for the limit -addition post 6.4, please send them in and I will apply them. - -You clearly have the syntax down, so I think you should go ahead. - - --- - Bruce Momjian | http://www.op.net/~candle - maillist@candle.pha.pa.us | (610) 853-3000 - + If your life is a hard drive, | 830 Blythe Avenue - + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 - - -From wieck@sapserv.debis.de Thu Oct 22 10:20:58 1998 -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id KAA20566 - for <maillist@candle.pha.pa.us>; Thu, 22 Oct 1998 10:20:54 -0400 (EDT) -Received: by dsh.de; id QAA09067; Thu, 22 Oct 1998 16:23:14 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma008719; Thu, 22 Oct 98 16:22:40 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id QAA01558; - Thu, 22 Oct 1998 16:19:55 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id QAA18978; - Thu, 22 Oct 1998 16:22:20 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<maillist@candle.pha.pa.us>> - id m0zWJG2-000B5AC; Thu, 22 Oct 98 13:50 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for maillist@candle.pha.pa.us - id m0zWLoE-000EBPC; Thu, 22 Oct 98 16:33 MET DST -Message-Id: <m0zWLoE-000EBPC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] psql's help (the LIMIT stuff) -To: maillist@candle.pha.pa.us (Bruce Momjian) -Date: Thu, 22 Oct 1998 16:33:50 +0200 (MET DST) -Cc: jwieck@debis.com, jose@sferacarta.com, pgsql-hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <199810221351.JAA19663@candle.pha.pa.us> from "Bruce Momjian" at Oct 22, 98 09:51:19 am -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Status: ROr - -> > -> > I hope the QUERY_LIMIT too. -> -> I still have that cnfify() possible fix to review for KQSO. Are you -> still thinking limit for 6.4 final, or a minor release after that? - - I posted the part that is the minimum applied to 6.4 to make - adding LIMIT later non-initdb earlier. Anyway, here it's - again. - - My LIMIT implementation that does it like the SET in the - toplevel executor (but via parsetree values) is ready for - production. I only held it back because it's feature, not - bugfix. - - Do you want it in 6.4 final? - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - -diff -cr src.orig/backend/nodes/copyfuncs.c src/backend/nodes/copyfuncs.c -*** src.orig/backend/nodes/copyfuncs.c Fri Oct 16 11:53:40 1998 ---- src/backend/nodes/copyfuncs.c Fri Oct 16 13:32:35 1998 -*************** -*** 1578,1583 **** ---- 1578,1586 ---- - newnode->unionClause = temp_list; - } - -+ Node_Copy(from, newnode, limitOffset); -+ Node_Copy(from, newnode, limitCount); -+ - return newnode; - } - -diff -cr src.orig/backend/nodes/outfuncs.c src/backend/nodes/outfuncs.c -*** src.orig/backend/nodes/outfuncs.c Fri Oct 16 11:53:40 1998 ---- src/backend/nodes/outfuncs.c Fri Oct 16 13:30:50 1998 -*************** -*** 259,264 **** ---- 259,268 ---- - appendStringInfo(str, (node->hasSubLinks ? "true" : "false")); - appendStringInfo(str, " :unionClause "); - _outNode(str, node->unionClause); -+ appendStringInfo(str, " :limitOffset "); -+ _outNode(str, node->limitOffset); -+ appendStringInfo(str, " :limitCount "); -+ _outNode(str, node->limitCount); - } - - static void -diff -cr src.orig/backend/nodes/readfuncs.c src/backend/nodes/readfuncs.c -*** src.orig/backend/nodes/readfuncs.c Fri Oct 16 11:53:40 1998 ---- src/backend/nodes/readfuncs.c Fri Oct 16 13:31:43 1998 -*************** -*** 163,168 **** ---- 163,174 ---- - token = lsptok(NULL, &length); /* skip :unionClause */ - local_node->unionClause = nodeRead(true); - -+ token = lsptok(NULL, &length); /* skip :limitOffset */ -+ local_node->limitOffset = nodeRead(true); -+ -+ token = lsptok(NULL, &length); /* skip :limitCount */ -+ local_node->limitCount = nodeRead(true); -+ - return local_node; - } - -diff -cr src.orig/include/nodes/parsenodes.h src/include/nodes/parsenodes.h -*** src.orig/include/nodes/parsenodes.h Fri Oct 16 11:53:58 1998 ---- src/include/nodes/parsenodes.h Fri Oct 16 13:35:32 1998 -*************** -*** 60,65 **** ---- 60,67 ---- - - List *unionClause; /* unions are linked under the previous - * query */ -+ Node *limitOffset; /* # of result tuples to skip */ -+ Node *limitCount; /* # of result tuples to return */ - - /* internal to planner */ - List *base_rel_list; /* base relation list */ -*************** -*** 639,644 **** ---- 641,648 ---- - char *portalname; /* the portal (cursor) to create */ - bool binary; /* a binary (internal) portal? */ - bool unionall; /* union without unique sort */ -+ Node *limitOffset; /* # of result tuples to skip */ -+ Node *limitCount; /* # of result tuples to return */ - } SelectStmt; - - - -From owner-pgsql-hackers@hub.org Thu Oct 22 11:33:41 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id LAA01724 - for <maillist@candle.pha.pa.us>; Thu, 22 Oct 1998 11:33:31 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id LAA12702 for <maillist@candle.pha.pa.us>; Thu, 22 Oct 1998 11:25:02 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.9.1/8.8.8) with SMTP id KAA11023; - Thu, 22 Oct 1998 10:22:13 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Thu, 22 Oct 1998 10:21:07 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.1/8.8.8) id KAA10873 - for pgsql-hackers-outgoing; Thu, 22 Oct 1998 10:21:05 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.9.1/8.8.8) with ESMTP id KAA10847 - for <pgsql-hackers@postgreSQL.org>; Thu, 22 Oct 1998 10:21:00 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id QAA09067; Thu, 22 Oct 1998 16:23:14 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma008719; Thu, 22 Oct 98 16:22:40 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id QAA01558; - Thu, 22 Oct 1998 16:19:55 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id QAA18978; - Thu, 22 Oct 1998 16:22:20 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<maillist@candle.pha.pa.us>> - id m0zWJG2-000B5AC; Thu, 22 Oct 98 13:50 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for maillist@candle.pha.pa.us - id m0zWLoE-000EBPC; Thu, 22 Oct 98 16:33 MET DST -Message-Id: <m0zWLoE-000EBPC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] psql's help (the LIMIT stuff) -To: maillist@candle.pha.pa.us (Bruce Momjian) -Date: Thu, 22 Oct 1998 16:33:50 +0200 (MET DST) -Cc: jwieck@debis.com, jose@sferacarta.com, pgsql-hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <199810221351.JAA19663@candle.pha.pa.us> from "Bruce Momjian" at Oct 22, 98 09:51:19 am -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -> > -> > I hope the QUERY_LIMIT too. -> -> I still have that cnfify() possible fix to review for KQSO. Are you -> still thinking limit for 6.4 final, or a minor release after that? - - I posted the part that is the minimum applied to 6.4 to make - adding LIMIT later non-initdb earlier. Anyway, here it's - again. - - My LIMIT implementation that does it like the SET in the - toplevel executor (but via parsetree values) is ready for - production. I only held it back because it's feature, not - bugfix. - - Do you want it in 6.4 final? - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - -diff -cr src.orig/backend/nodes/copyfuncs.c src/backend/nodes/copyfuncs.c -*** src.orig/backend/nodes/copyfuncs.c Fri Oct 16 11:53:40 1998 ---- src/backend/nodes/copyfuncs.c Fri Oct 16 13:32:35 1998 -*************** -*** 1578,1583 **** ---- 1578,1586 ---- - newnode->unionClause = temp_list; - } - -+ Node_Copy(from, newnode, limitOffset); -+ Node_Copy(from, newnode, limitCount); -+ - return newnode; - } - -diff -cr src.orig/backend/nodes/outfuncs.c src/backend/nodes/outfuncs.c -*** src.orig/backend/nodes/outfuncs.c Fri Oct 16 11:53:40 1998 ---- src/backend/nodes/outfuncs.c Fri Oct 16 13:30:50 1998 -*************** -*** 259,264 **** ---- 259,268 ---- - appendStringInfo(str, (node->hasSubLinks ? "true" : "false")); - appendStringInfo(str, " :unionClause "); - _outNode(str, node->unionClause); -+ appendStringInfo(str, " :limitOffset "); -+ _outNode(str, node->limitOffset); -+ appendStringInfo(str, " :limitCount "); -+ _outNode(str, node->limitCount); - } - - static void -diff -cr src.orig/backend/nodes/readfuncs.c src/backend/nodes/readfuncs.c -*** src.orig/backend/nodes/readfuncs.c Fri Oct 16 11:53:40 1998 ---- src/backend/nodes/readfuncs.c Fri Oct 16 13:31:43 1998 -*************** -*** 163,168 **** ---- 163,174 ---- - token = lsptok(NULL, &length); /* skip :unionClause */ - local_node->unionClause = nodeRead(true); - -+ token = lsptok(NULL, &length); /* skip :limitOffset */ -+ local_node->limitOffset = nodeRead(true); -+ -+ token = lsptok(NULL, &length); /* skip :limitCount */ -+ local_node->limitCount = nodeRead(true); -+ - return local_node; - } - -diff -cr src.orig/include/nodes/parsenodes.h src/include/nodes/parsenodes.h -*** src.orig/include/nodes/parsenodes.h Fri Oct 16 11:53:58 1998 ---- src/include/nodes/parsenodes.h Fri Oct 16 13:35:32 1998 -*************** -*** 60,65 **** ---- 60,67 ---- - - List *unionClause; /* unions are linked under the previous - * query */ -+ Node *limitOffset; /* # of result tuples to skip */ -+ Node *limitCount; /* # of result tuples to return */ - - /* internal to planner */ - List *base_rel_list; /* base relation list */ -*************** -*** 639,644 **** ---- 641,648 ---- - char *portalname; /* the portal (cursor) to create */ - bool binary; /* a binary (internal) portal? */ - bool unionall; /* union without unique sort */ -+ Node *limitOffset; /* # of result tuples to skip */ -+ Node *limitCount; /* # of result tuples to return */ - } SelectStmt; - - - - -From wieck@sapserv.debis.de Thu Oct 22 11:01:05 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id LAA21185 - for <maillist@candle.pha.pa.us>; Thu, 22 Oct 1998 11:01:00 -0400 (EDT) -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id KAA09646 for <maillist@candle.pha.pa.us>; Thu, 22 Oct 1998 10:44:36 -0400 (EDT) -Received: by dsh.de; id QAA19394; Thu, 22 Oct 1998 16:43:42 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma017268; Thu, 22 Oct 98 16:39:44 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id QAA02988; - Thu, 22 Oct 1998 16:36:46 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id QAA19155; - Thu, 22 Oct 1998 16:39:10 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<maillist@candle.pha.pa.us>> - id m0zWJWL-000B5DC; Thu, 22 Oct 98 14:07 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for maillist@candle.pha.pa.us - id m0zWM4W-000EBPC; Thu, 22 Oct 98 16:50 MET DST -Message-Id: <m0zWM4W-000EBPC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] psql's help (the LIMIT stuff) -To: maillist@candle.pha.pa.us (Bruce Momjian) -Date: Thu, 22 Oct 1998 16:50:40 +0200 (MET DST) -Cc: jwieck@debis.com, jose@sferacarta.com, pgsql-hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <199810221424.KAA20601@candle.pha.pa.us> from "Bruce Momjian" at Oct 22, 98 10:24:08 am -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Status: RO - -> -> > > > -> > > > I hope the QUERY_LIMIT too. -> > > -> > > I still have that cnfify() possible fix to review for KQSO. Are you -> > > still thinking limit for 6.4 final, or a minor release after that? -> > -> > I posted the part that is the minimum applied to 6.4 to make -> > adding LIMIT later non-initdb earlier. Anyway, here it's -> > again. -> -> Already applied. I assume it is the same as the one I applied. - - Seen, thanks. Your 'Applied' just arrived after I packed it - again. It's the same. - -> We are close to final, and can easily put it in 6.4.1, which I am sure -> we will need, and if we split CVS trees, you'll have lots of minor -> versions to pick from. :-) -> -> Seems like it would be a nice minor release item, but the problem is -> that minor releases aren't tested as much as major ones. How confident -> are you in the code? What do others thing? - - I regression tested it, and did additional tests in the - SPI/PL area. It works. It only touches the parser and the - executor. Rules, planner/optimizer just bypass the values in - the parsetree. The parser and the executor are parts of - Postgres I feel very familiar with (not so in the optimizer). - I trust in the code and would use it in a production - environment. - - It's below. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - -diff -cr src.orig/backend/commands/command.c src/backend/commands/command.c -*** src.orig/backend/commands/command.c Fri Oct 16 11:53:38 1998 ---- src/backend/commands/command.c Fri Oct 16 12:56:44 1998 -*************** -*** 39,44 **** ---- 39,45 ---- - #include "utils/mcxt.h" - #include "utils/portal.h" - #include "utils/syscache.h" -+ #include "string.h" - - /* ---------------- - * PortalExecutorHeapMemory stuff -*************** -*** 101,106 **** ---- 102,108 ---- - int feature; - QueryDesc *queryDesc; - MemoryContext context; -+ Const limcount; - - /* ---------------- - * sanity checks -*************** -*** 113,118 **** ---- 115,134 ---- - } - - /* ---------------- -+ * Create a const node from the given count value -+ * ---------------- -+ */ -+ memset(&limcount, 0, sizeof(limcount)); -+ limcount.type = T_Const; -+ limcount.consttype = INT4OID; -+ limcount.constlen = sizeof(int4); -+ limcount.constvalue = (Datum)count; -+ limcount.constisnull = FALSE; -+ limcount.constbyval = TRUE; -+ limcount.constisset = FALSE; -+ limcount.constiscast = FALSE; -+ -+ /* ---------------- - * get the portal from the portal name - * ---------------- - */ -*************** -*** 176,182 **** - PortalExecutorHeapMemory = (MemoryContext) - PortalGetHeapMemory(portal); - -! ExecutorRun(queryDesc, PortalGetState(portal), feature, count); - - if (dest == None) /* MOVE */ - pfree(queryDesc); ---- 192,198 ---- - PortalExecutorHeapMemory = (MemoryContext) - PortalGetHeapMemory(portal); - -! ExecutorRun(queryDesc, PortalGetState(portal), feature, (Node *)NULL, (Node *)&limcount); - - if (dest == None) /* MOVE */ - pfree(queryDesc); -diff -cr src.orig/backend/executor/execMain.c src/backend/executor/execMain.c -*** src.orig/backend/executor/execMain.c Fri Oct 16 11:53:38 1998 ---- src/backend/executor/execMain.c Fri Oct 16 20:05:19 1998 -*************** -*** 64,69 **** ---- 64,70 ---- - static void EndPlan(Plan *plan, EState *estate); - static TupleTableSlot *ExecutePlan(EState *estate, Plan *plan, - Query *parseTree, CmdType operation, -+ int offsetTuples, - int numberTuples, ScanDirection direction, - void (*printfunc) ()); - static void ExecRetrieve(TupleTableSlot *slot, void (*printfunc) (), -*************** -*** 163,169 **** - * ---------------------------------------------------------------- - */ - TupleTableSlot * -! ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count) - { - CmdType operation; - Query *parseTree; ---- 164,170 ---- - * ---------------------------------------------------------------- - */ - TupleTableSlot * -! ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, Node *limoffset, Node *limcount) - { - CmdType operation; - Query *parseTree; -*************** -*** 171,176 **** ---- 172,179 ---- - TupleTableSlot *result; - CommandDest dest; - void (*destination) (); -+ int offset = 0; -+ int count = 0; - - /****************** - * sanity checks -*************** -*** 191,196 **** ---- 194,289 ---- - estate->es_processed = 0; - estate->es_lastoid = InvalidOid; - -+ /****************** -+ * if given get the offset of the LIMIT clause -+ ****************** -+ */ -+ if (limoffset != NULL) -+ { -+ Const *coffset; -+ Param *poffset; -+ ParamListInfo paramLI; -+ int i; -+ -+ switch (nodeTag(limoffset)) -+ { -+ case T_Const: -+ coffset = (Const *)limoffset; -+ offset = (int)(coffset->constvalue); -+ break; -+ -+ case T_Param: -+ poffset = (Param *)limoffset; -+ paramLI = estate->es_param_list_info; -+ -+ if (paramLI == NULL) -+ elog(ERROR, "parameter for limit offset not in executor state"); -+ for (i = 0; paramLI[i].kind != PARAM_INVALID; i++) -+ { -+ if (paramLI[i].kind == PARAM_NUM && paramLI[i].id == poffset->paramid) -+ break; -+ } -+ if (paramLI[i].kind == PARAM_INVALID) -+ elog(ERROR, "parameter for limit offset not in executor state"); -+ if (paramLI[i].isnull) -+ elog(ERROR, "limit offset cannot be NULL value"); -+ offset = (int)(paramLI[i].value); -+ -+ break; -+ -+ default: -+ elog(ERROR, "unexpected node type %d as limit offset", nodeTag(limoffset)); -+ } -+ -+ if (offset < 0) -+ elog(ERROR, "limit offset cannot be negative"); -+ } -+ -+ /****************** -+ * if given get the count of the LIMIT clause -+ ****************** -+ */ -+ if (limcount != NULL) -+ { -+ Const *ccount; -+ Param *pcount; -+ ParamListInfo paramLI; -+ int i; -+ -+ switch (nodeTag(limcount)) -+ { -+ case T_Const: -+ ccount = (Const *)limcount; -+ count = (int)(ccount->constvalue); -+ break; -+ -+ case T_Param: -+ pcount = (Param *)limcount; -+ paramLI = estate->es_param_list_info; -+ -+ if (paramLI == NULL) -+ elog(ERROR, "parameter for limit count not in executor state"); -+ for (i = 0; paramLI[i].kind != PARAM_INVALID; i++) -+ { -+ if (paramLI[i].kind == PARAM_NUM && paramLI[i].id == pcount->paramid) -+ break; -+ } -+ if (paramLI[i].kind == PARAM_INVALID) -+ elog(ERROR, "parameter for limit count not in executor state"); -+ if (paramLI[i].isnull) -+ elog(ERROR, "limit count cannot be NULL value"); -+ count = (int)(paramLI[i].value); -+ -+ break; -+ -+ default: -+ elog(ERROR, "unexpected node type %d as limit count", nodeTag(limcount)); -+ } -+ -+ if (count < 0) -+ elog(ERROR, "limit count cannot be negative"); -+ } -+ - switch (feature) - { - -*************** -*** 199,205 **** - plan, - parseTree, - operation, -! ALL_TUPLES, - ForwardScanDirection, - destination); - break; ---- 292,299 ---- - plan, - parseTree, - operation, -! offset, -! count, - ForwardScanDirection, - destination); - break; -*************** -*** 208,213 **** ---- 302,308 ---- - plan, - parseTree, - operation, -+ offset, - count, - ForwardScanDirection, - destination); -*************** -*** 222,227 **** ---- 317,323 ---- - plan, - parseTree, - operation, -+ offset, - count, - BackwardScanDirection, - destination); -*************** -*** 237,242 **** ---- 333,339 ---- - plan, - parseTree, - operation, -+ 0, - ONE_TUPLE, - ForwardScanDirection, - destination); -*************** -*** 691,696 **** ---- 788,794 ---- - Plan *plan, - Query *parseTree, - CmdType operation, -+ int offsetTuples, - int numberTuples, - ScanDirection direction, - void (*printfunc) ()) -*************** -*** 742,747 **** ---- 840,859 ---- - { - result = NULL; - break; -+ } -+ -+ /****************** -+ * For now we completely execute the plan and skip -+ * result tuples if requested by LIMIT offset. -+ * Finally we should try to do it in deeper levels -+ * if possible (during index scan) -+ * - Jan -+ ****************** -+ */ -+ if (offsetTuples > 0) -+ { -+ --offsetTuples; -+ continue; - } - - /****************** -diff -cr src.orig/backend/executor/functions.c src/backend/executor/functions.c -*** src.orig/backend/executor/functions.c Fri Oct 16 11:53:38 1998 ---- src/backend/executor/functions.c Fri Oct 16 19:01:02 1998 -*************** -*** 130,135 **** ---- 130,138 ---- - None); - estate = CreateExecutorState(); - -+ if (queryTree->limitOffset != NULL || queryTree->limitCount != NULL) -+ elog(ERROR, "LIMIT clause from SQL functions not yet implemented"); -+ - if (nargs > 0) - { - int i; -*************** -*** 200,206 **** - - feature = (LAST_POSTQUEL_COMMAND(es)) ? EXEC_RETONE : EXEC_RUN; - -! return ExecutorRun(es->qd, es->estate, feature, 0); - } - - static void ---- 203,209 ---- - - feature = (LAST_POSTQUEL_COMMAND(es)) ? EXEC_RETONE : EXEC_RUN; - -! return ExecutorRun(es->qd, es->estate, feature, (Node *)NULL, (Node *)NULL); - } - - static void -diff -cr src.orig/backend/executor/spi.c src/backend/executor/spi.c -*** src.orig/backend/executor/spi.c Fri Oct 16 11:53:39 1998 ---- src/backend/executor/spi.c Fri Oct 16 19:25:33 1998 -*************** -*** 791,796 **** ---- 791,798 ---- - bool isRetrieveIntoRelation = false; - char *intoName = NULL; - int res; -+ Const tcount_const; -+ Node *count = NULL; - - switch (operation) - { -*************** -*** 825,830 **** ---- 827,865 ---- - return SPI_ERROR_OPUNKNOWN; - } - -+ /* ---------------- -+ * Get the query LIMIT tuple count -+ * ---------------- -+ */ -+ if (parseTree->limitCount != NULL) -+ { -+ /* ---------------- -+ * A limit clause in the parsetree overrides the -+ * tcount parameter -+ * ---------------- -+ */ -+ count = parseTree->limitCount; -+ } -+ else -+ { -+ /* ---------------- -+ * No LIMIT clause in parsetree. Use a local Const node -+ * to put tcount into it -+ * ---------------- -+ */ -+ memset(&tcount_const, 0, sizeof(tcount_const)); -+ tcount_const.type = T_Const; -+ tcount_const.consttype = INT4OID; -+ tcount_const.constlen = sizeof(int4); -+ tcount_const.constvalue = (Datum)tcount; -+ tcount_const.constisnull = FALSE; -+ tcount_const.constbyval = TRUE; -+ tcount_const.constisset = FALSE; -+ tcount_const.constiscast = FALSE; -+ -+ count = (Node *)&tcount_const; -+ } -+ - if (state == NULL) /* plan preparation */ - return res; - #ifdef SPI_EXECUTOR_STATS -*************** -*** 845,851 **** - return SPI_OK_CURSOR; - } - -! ExecutorRun(queryDesc, state, EXEC_FOR, tcount); - - _SPI_current->processed = state->es_processed; - if (operation == CMD_SELECT && queryDesc->dest == SPI) ---- 880,886 ---- - return SPI_OK_CURSOR; - } - -! ExecutorRun(queryDesc, state, EXEC_FOR, parseTree->limitOffset, count); - - _SPI_current->processed = state->es_processed; - if (operation == CMD_SELECT && queryDesc->dest == SPI) -diff -cr src.orig/backend/parser/analyze.c src/backend/parser/analyze.c -*** src.orig/backend/parser/analyze.c Fri Oct 16 11:53:41 1998 ---- src/backend/parser/analyze.c Fri Oct 16 13:29:27 1998 -*************** -*** 180,186 **** ---- 180,190 ---- - - case T_SelectStmt: - if (!((SelectStmt *) parseTree)->portalname) -+ { - result = transformSelectStmt(pstate, (SelectStmt *) parseTree); -+ result->limitOffset = ((SelectStmt *)parseTree)->limitOffset; -+ result->limitCount = ((SelectStmt *)parseTree)->limitCount; -+ } - else - result = transformCursorStmt(pstate, (SelectStmt *) parseTree); - break; -diff -cr src.orig/backend/parser/gram.y src/backend/parser/gram.y -*** src.orig/backend/parser/gram.y Fri Oct 16 11:53:42 1998 ---- src/backend/parser/gram.y Sun Oct 18 22:20:36 1998 -*************** -*** 45,50 **** ---- 45,51 ---- - #include "catalog/catname.h" - #include "utils/elog.h" - #include "access/xact.h" -+ #include "catalog/pg_type.h" - - #ifdef MULTIBYTE - #include "mb/pg_wchar.h" -*************** -*** 163,169 **** - sort_clause, sortby_list, index_params, index_list, name_list, - from_clause, from_list, opt_array_bounds, nest_array_bounds, - expr_list, attrs, res_target_list, res_target_list2, -! def_list, opt_indirection, group_clause, TriggerFuncArgs - - %type <node> func_return - %type <boolean> set_opt ---- 164,171 ---- - sort_clause, sortby_list, index_params, index_list, name_list, - from_clause, from_list, opt_array_bounds, nest_array_bounds, - expr_list, attrs, res_target_list, res_target_list2, -! def_list, opt_indirection, group_clause, TriggerFuncArgs, -! opt_select_limit - - %type <node> func_return - %type <boolean> set_opt -*************** -*** 192,197 **** ---- 194,201 ---- - - %type <ival> fetch_how_many - -+ %type <node> select_limit_value select_offset_value -+ - %type <list> OptSeqList - %type <defelt> OptSeqElem - -*************** -*** 267,273 **** - FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL, - GRANT, GROUP, HAVING, HOUR_P, - IN, INNER_P, INSENSITIVE, INSERT, INTERVAL, INTO, IS, -! JOIN, KEY, LANGUAGE, LEADING, LEFT, LIKE, LOCAL, - MATCH, MINUTE_P, MONTH_P, NAMES, - NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULL_P, NUMERIC, - OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P, ---- 271,277 ---- - FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL, - GRANT, GROUP, HAVING, HOUR_P, - IN, INNER_P, INSENSITIVE, INSERT, INTERVAL, INTO, IS, -! JOIN, KEY, LANGUAGE, LEADING, LEFT, LIKE, LIMIT, LOCAL, - MATCH, MINUTE_P, MONTH_P, NAMES, - NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULL_P, NUMERIC, - OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P, -*************** -*** 299,305 **** - INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL, - LANCOMPILER, LISTEN, LOAD, LOCATION, LOCK_P, MAXVALUE, MINVALUE, MOVE, - NEW, NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL, -! OIDS, OPERATOR, PASSWORD, PROCEDURAL, - RECIPE, RENAME, RESET, RETURNS, ROW, RULE, - SEQUENCE, SERIAL, SETOF, SHOW, START, STATEMENT, STDIN, STDOUT, TRUSTED, - UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION ---- 303,309 ---- - INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL, - LANCOMPILER, LISTEN, LOAD, LOCATION, LOCK_P, MAXVALUE, MINVALUE, MOVE, - NEW, NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL, -! OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL, - RECIPE, RENAME, RESET, RETURNS, ROW, RULE, - SEQUENCE, SERIAL, SETOF, SHOW, START, STATEMENT, STDIN, STDOUT, TRUSTED, - UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION -*************** -*** 2591,2596 **** ---- 2595,2601 ---- - result from_clause where_clause - group_clause having_clause - union_clause sort_clause -+ opt_select_limit - { - SelectStmt *n = makeNode(SelectStmt); - n->unique = $2; -*************** -*** 2602,2607 **** ---- 2607,2622 ---- - n->havingClause = $8; - n->unionClause = $9; - n->sortClause = $10; -+ if ($11 != NIL) -+ { -+ n->limitOffset = nth(0, $11); -+ n->limitCount = nth(1, $11); -+ } -+ else -+ { -+ n->limitOffset = NULL; -+ n->limitCount = NULL; -+ } - $$ = (Node *)n; - } - ; -*************** -*** 2699,2704 **** ---- 2714,2794 ---- - | ASC { $$ = "<"; } - | DESC { $$ = ">"; } - | /*EMPTY*/ { $$ = "<"; /*default*/ } -+ ; -+ -+ opt_select_limit: LIMIT select_offset_value ',' select_limit_value -+ { $$ = lappend(lappend(NIL, $2), $4); } -+ | LIMIT select_limit_value OFFSET select_offset_value -+ { $$ = lappend(lappend(NIL, $4), $2); } -+ | LIMIT select_limit_value -+ { $$ = lappend(lappend(NIL, NULL), $2); } -+ | OFFSET select_offset_value LIMIT select_limit_value -+ { $$ = lappend(lappend(NIL, $2), $4); } -+ | OFFSET select_offset_value -+ { $$ = lappend(lappend(NIL, $2), NULL); } -+ | /* EMPTY */ -+ { $$ = NIL; } -+ ; -+ -+ select_limit_value: Iconst -+ { -+ Const *n = makeNode(Const); -+ -+ if ($1 < 1) -+ elog(ERROR, "selection limit must be ALL or a positive integer value > 0"); -+ -+ n->consttype = INT4OID; -+ n->constlen = sizeof(int4); -+ n->constvalue = (Datum)$1; -+ n->constisnull = FALSE; -+ n->constbyval = TRUE; -+ n->constisset = FALSE; -+ n->constiscast = FALSE; -+ $$ = (Node *)n; -+ } -+ | ALL -+ { -+ Const *n = makeNode(Const); -+ n->consttype = INT4OID; -+ n->constlen = sizeof(int4); -+ n->constvalue = (Datum)0; -+ n->constisnull = FALSE; -+ n->constbyval = TRUE; -+ n->constisset = FALSE; -+ n->constiscast = FALSE; -+ $$ = (Node *)n; -+ } -+ | PARAM -+ { -+ Param *n = makeNode(Param); -+ n->paramkind = PARAM_NUM; -+ n->paramid = $1; -+ n->paramtype = INT4OID; -+ $$ = (Node *)n; -+ } -+ ; -+ -+ select_offset_value: Iconst -+ { -+ Const *n = makeNode(Const); -+ -+ n->consttype = INT4OID; -+ n->constlen = sizeof(int4); -+ n->constvalue = (Datum)$1; -+ n->constisnull = FALSE; -+ n->constbyval = TRUE; -+ n->constisset = FALSE; -+ n->constiscast = FALSE; -+ $$ = (Node *)n; -+ } -+ | PARAM -+ { -+ Param *n = makeNode(Param); -+ n->paramkind = PARAM_NUM; -+ n->paramid = $1; -+ n->paramtype = INT4OID; -+ $$ = (Node *)n; -+ } - ; - - /* -diff -cr src.orig/backend/parser/keywords.c src/backend/parser/keywords.c -*** src.orig/backend/parser/keywords.c Fri Oct 16 11:53:42 1998 ---- src/backend/parser/keywords.c Sun Oct 18 22:13:29 1998 -*************** -*** 128,133 **** ---- 128,134 ---- - {"leading", LEADING}, - {"left", LEFT}, - {"like", LIKE}, -+ {"limit", LIMIT}, - {"listen", LISTEN}, - {"load", LOAD}, - {"local", LOCAL}, -*************** -*** 156,161 **** ---- 157,163 ---- - {"null", NULL_P}, - {"numeric", NUMERIC}, - {"of", OF}, -+ {"offset", OFFSET}, - {"oids", OIDS}, - {"old", CURRENT}, - {"on", ON}, -diff -cr src.orig/backend/rewrite/rewriteDefine.c src/backend/rewrite/rewriteDefine.c -*** src.orig/backend/rewrite/rewriteDefine.c Fri Oct 16 11:53:46 1998 ---- src/backend/rewrite/rewriteDefine.c Fri Oct 16 13:48:55 1998 -*************** -*** 312,317 **** ---- 312,323 ---- - heap_close(event_relation); - - /* -+ * LIMIT in view is not supported -+ */ -+ if (query->limitOffset != NULL || query->limitCount != NULL) -+ elog(ERROR, "LIMIT clause not supported in views"); -+ -+ /* - * ... and finally the rule must be named _RETviewname. - */ - sprintf(expected_name, "_RET%s", event_obj->relname); -diff -cr src.orig/backend/tcop/pquery.c src/backend/tcop/pquery.c -*** src.orig/backend/tcop/pquery.c Fri Oct 16 11:53:47 1998 ---- src/backend/tcop/pquery.c Fri Oct 16 14:02:36 1998 -*************** -*** 40,46 **** - #include "commands/command.h" - - static char *CreateOperationTag(int operationType); -! static void ProcessQueryDesc(QueryDesc *queryDesc); - - - /* ---------------------------------------------------------------- ---- 40,46 ---- - #include "commands/command.h" - - static char *CreateOperationTag(int operationType); -! static void ProcessQueryDesc(QueryDesc *queryDesc, Node *limoffset, Node *limcount); - - - /* ---------------------------------------------------------------- -*************** -*** 205,211 **** - * ---------------------------------------------------------------- - */ - static void -! ProcessQueryDesc(QueryDesc *queryDesc) - { - Query *parseTree; - Plan *plan; ---- 205,211 ---- - * ---------------------------------------------------------------- - */ - static void -! ProcessQueryDesc(QueryDesc *queryDesc, Node *limoffset, Node *limcount) - { - Query *parseTree; - Plan *plan; -*************** -*** 330,336 **** - * actually run the plan.. - * ---------------- - */ -! ExecutorRun(queryDesc, state, EXEC_RUN, 0); - - /* save infos for EndCommand */ - UpdateCommandInfo(operation, state->es_lastoid, state->es_processed); ---- 330,336 ---- - * actually run the plan.. - * ---------------- - */ -! ExecutorRun(queryDesc, state, EXEC_RUN, limoffset, limcount); - - /* save infos for EndCommand */ - UpdateCommandInfo(operation, state->es_lastoid, state->es_processed); -*************** -*** 373,377 **** - print_plan(plan, parsetree); - } - else -! ProcessQueryDesc(queryDesc); - } ---- 373,377 ---- - print_plan(plan, parsetree); - } - else -! ProcessQueryDesc(queryDesc, parsetree->limitOffset, parsetree->limitCount); - } -diff -cr src.orig/include/executor/executor.h src/include/executor/executor.h -*** src.orig/include/executor/executor.h Fri Oct 16 11:53:56 1998 ---- src/include/executor/executor.h Fri Oct 16 12:04:17 1998 -*************** -*** 83,89 **** - * prototypes from functions in execMain.c - */ - extern TupleDesc ExecutorStart(QueryDesc *queryDesc, EState *estate); -! extern TupleTableSlot *ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count); - extern void ExecutorEnd(QueryDesc *queryDesc, EState *estate); - extern HeapTuple ExecConstraints(char *caller, Relation rel, HeapTuple tuple); - #ifdef QUERY_LIMIT ---- 83,89 ---- - * prototypes from functions in execMain.c - */ - extern TupleDesc ExecutorStart(QueryDesc *queryDesc, EState *estate); -! extern TupleTableSlot *ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, Node *limoffset, Node *limcount); - extern void ExecutorEnd(QueryDesc *queryDesc, EState *estate); - extern HeapTuple ExecConstraints(char *caller, Relation rel, HeapTuple tuple); - #ifdef QUERY_LIMIT - -From owner-pgsql-hackers@hub.org Thu Oct 22 13:12:34 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id NAA01350 - for <maillist@candle.pha.pa.us>; Thu, 22 Oct 1998 13:12:29 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id MAA17808 for <maillist@candle.pha.pa.us>; Thu, 22 Oct 1998 12:35:22 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.9.1/8.8.8) with SMTP id KAA14887; - Thu, 22 Oct 1998 10:49:09 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Thu, 22 Oct 1998 10:44:59 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.1/8.8.8) id KAA14445 - for pgsql-hackers-outgoing; Thu, 22 Oct 1998 10:44:57 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from dsh.de (firewall-user@neptun.sns-felb.debis.de [53.122.101.2]) - by hub.org (8.9.1/8.8.8) with ESMTP id KAA14431 - for <pgsql-hackers@postgreSQL.org>; Thu, 22 Oct 1998 10:44:47 -0400 (EDT) - (envelope-from wieck@sapserv.debis.de) -Received: by dsh.de; id QAA19394; Thu, 22 Oct 1998 16:43:42 +0200 (MET DST) -Received: from dshmail.dsh.de(53.47.15.3) by neptun.dsh.de via smap (3.2) - id xma017268; Thu, 22 Oct 98 16:39:44 +0200 -Received: from mail1.hh1.dsh.de (mail1.hh1.dsh.de [53.47.9.5]) - by dshmail.dsh.de (8.8.7/8.8.7) with ESMTP id QAA02988; - Thu, 22 Oct 1998 16:36:46 +0200 (MET DST) -Received: from mars.SAPserv.Hamburg.dsh.de (root@mail5.hh1.dsh.de [53.2.168.17]) - by mail1.hh1.dsh.de (8.8.7/8.8.7) with SMTP id QAA19155; - Thu, 22 Oct 1998 16:39:10 +0200 -Received: from orion.SAPserv.Hamburg.dsh.de - by mars.SAPserv.Hamburg.dsh.de with smtp - for <<maillist@candle.pha.pa.us>> - id m0zWJWL-000B5DC; Thu, 22 Oct 98 14:07 MET DST -Received: by orion.SAPserv.Hamburg.dsh.de - for maillist@candle.pha.pa.us - id m0zWM4W-000EBPC; Thu, 22 Oct 98 16:50 MET DST -Message-Id: <m0zWM4W-000EBPC@orion.SAPserv.Hamburg.dsh.de> -From: jwieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] psql's help (the LIMIT stuff) -To: maillist@candle.pha.pa.us (Bruce Momjian) -Date: Thu, 22 Oct 1998 16:50:40 +0200 (MET DST) -Cc: jwieck@debis.com, jose@sferacarta.com, pgsql-hackers@postgreSQL.org -Reply-To: jwieck@debis.com (Jan Wieck) -In-Reply-To: <199810221424.KAA20601@candle.pha.pa.us> from "Bruce Momjian" at Oct 22, 98 10:24:08 am -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: ROr - -> -> > > > -> > > > I hope the QUERY_LIMIT too. -> > > -> > > I still have that cnfify() possible fix to review for KQSO. Are you -> > > still thinking limit for 6.4 final, or a minor release after that? -> > -> > I posted the part that is the minimum applied to 6.4 to make -> > adding LIMIT later non-initdb earlier. Anyway, here it's -> > again. -> -> Already applied. I assume it is the same as the one I applied. - - Seen, thanks. Your 'Applied' just arrived after I packed it - again. It's the same. - -> We are close to final, and can easily put it in 6.4.1, which I am sure -> we will need, and if we split CVS trees, you'll have lots of minor -> versions to pick from. :-) -> -> Seems like it would be a nice minor release item, but the problem is -> that minor releases aren't tested as much as major ones. How confident -> are you in the code? What do others thing? - - I regression tested it, and did additional tests in the - SPI/PL area. It works. It only touches the parser and the - executor. Rules, planner/optimizer just bypass the values in - the parsetree. The parser and the executor are parts of - Postgres I feel very familiar with (not so in the optimizer). - I trust in the code and would use it in a production - environment. - - It's below. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#======================================== jwieck@debis.com (Jan Wieck) # - - -diff -cr src.orig/backend/commands/command.c src/backend/commands/command.c -*** src.orig/backend/commands/command.c Fri Oct 16 11:53:38 1998 ---- src/backend/commands/command.c Fri Oct 16 12:56:44 1998 -*************** -*** 39,44 **** ---- 39,45 ---- - #include "utils/mcxt.h" - #include "utils/portal.h" - #include "utils/syscache.h" -+ #include "string.h" - - /* ---------------- - * PortalExecutorHeapMemory stuff -*************** -*** 101,106 **** ---- 102,108 ---- - int feature; - QueryDesc *queryDesc; - MemoryContext context; -+ Const limcount; - - /* ---------------- - * sanity checks -*************** -*** 113,118 **** ---- 115,134 ---- - } - - /* ---------------- -+ * Create a const node from the given count value -+ * ---------------- -+ */ -+ memset(&limcount, 0, sizeof(limcount)); -+ limcount.type = T_Const; -+ limcount.consttype = INT4OID; -+ limcount.constlen = sizeof(int4); -+ limcount.constvalue = (Datum)count; -+ limcount.constisnull = FALSE; -+ limcount.constbyval = TRUE; -+ limcount.constisset = FALSE; -+ limcount.constiscast = FALSE; -+ -+ /* ---------------- - * get the portal from the portal name - * ---------------- - */ -*************** -*** 176,182 **** - PortalExecutorHeapMemory = (MemoryContext) - PortalGetHeapMemory(portal); - -! ExecutorRun(queryDesc, PortalGetState(portal), feature, count); - - if (dest == None) /* MOVE */ - pfree(queryDesc); ---- 192,198 ---- - PortalExecutorHeapMemory = (MemoryContext) - PortalGetHeapMemory(portal); - -! ExecutorRun(queryDesc, PortalGetState(portal), feature, (Node *)NULL, (Node *)&limcount); - - if (dest == None) /* MOVE */ - pfree(queryDesc); -diff -cr src.orig/backend/executor/execMain.c src/backend/executor/execMain.c -*** src.orig/backend/executor/execMain.c Fri Oct 16 11:53:38 1998 ---- src/backend/executor/execMain.c Fri Oct 16 20:05:19 1998 -*************** -*** 64,69 **** ---- 64,70 ---- - static void EndPlan(Plan *plan, EState *estate); - static TupleTableSlot *ExecutePlan(EState *estate, Plan *plan, - Query *parseTree, CmdType operation, -+ int offsetTuples, - int numberTuples, ScanDirection direction, - void (*printfunc) ()); - static void ExecRetrieve(TupleTableSlot *slot, void (*printfunc) (), -*************** -*** 163,169 **** - * ---------------------------------------------------------------- - */ - TupleTableSlot * -! ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count) - { - CmdType operation; - Query *parseTree; ---- 164,170 ---- - * ---------------------------------------------------------------- - */ - TupleTableSlot * -! ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, Node *limoffset, Node *limcount) - { - CmdType operation; - Query *parseTree; -*************** -*** 171,176 **** ---- 172,179 ---- - TupleTableSlot *result; - CommandDest dest; - void (*destination) (); -+ int offset = 0; -+ int count = 0; - - /****************** - * sanity checks -*************** -*** 191,196 **** ---- 194,289 ---- - estate->es_processed = 0; - estate->es_lastoid = InvalidOid; - -+ /****************** -+ * if given get the offset of the LIMIT clause -+ ****************** -+ */ -+ if (limoffset != NULL) -+ { -+ Const *coffset; -+ Param *poffset; -+ ParamListInfo paramLI; -+ int i; -+ -+ switch (nodeTag(limoffset)) -+ { -+ case T_Const: -+ coffset = (Const *)limoffset; -+ offset = (int)(coffset->constvalue); -+ break; -+ -+ case T_Param: -+ poffset = (Param *)limoffset; -+ paramLI = estate->es_param_list_info; -+ -+ if (paramLI == NULL) -+ elog(ERROR, "parameter for limit offset not in executor state"); -+ for (i = 0; paramLI[i].kind != PARAM_INVALID; i++) -+ { -+ if (paramLI[i].kind == PARAM_NUM && paramLI[i].id == poffset->paramid) -+ break; -+ } -+ if (paramLI[i].kind == PARAM_INVALID) -+ elog(ERROR, "parameter for limit offset not in executor state"); -+ if (paramLI[i].isnull) -+ elog(ERROR, "limit offset cannot be NULL value"); -+ offset = (int)(paramLI[i].value); -+ -+ break; -+ -+ default: -+ elog(ERROR, "unexpected node type %d as limit offset", nodeTag(limoffset)); -+ } -+ -+ if (offset < 0) -+ elog(ERROR, "limit offset cannot be negative"); -+ } -+ -+ /****************** -+ * if given get the count of the LIMIT clause -+ ****************** -+ */ -+ if (limcount != NULL) -+ { -+ Const *ccount; -+ Param *pcount; -+ ParamListInfo paramLI; -+ int i; -+ -+ switch (nodeTag(limcount)) -+ { -+ case T_Const: -+ ccount = (Const *)limcount; -+ count = (int)(ccount->constvalue); -+ break; -+ -+ case T_Param: -+ pcount = (Param *)limcount; -+ paramLI = estate->es_param_list_info; -+ -+ if (paramLI == NULL) -+ elog(ERROR, "parameter for limit count not in executor state"); -+ for (i = 0; paramLI[i].kind != PARAM_INVALID; i++) -+ { -+ if (paramLI[i].kind == PARAM_NUM && paramLI[i].id == pcount->paramid) -+ break; -+ } -+ if (paramLI[i].kind == PARAM_INVALID) -+ elog(ERROR, "parameter for limit count not in executor state"); -+ if (paramLI[i].isnull) -+ elog(ERROR, "limit count cannot be NULL value"); -+ count = (int)(paramLI[i].value); -+ -+ break; -+ -+ default: -+ elog(ERROR, "unexpected node type %d as limit count", nodeTag(limcount)); -+ } -+ -+ if (count < 0) -+ elog(ERROR, "limit count cannot be negative"); -+ } -+ - switch (feature) - { - -*************** -*** 199,205 **** - plan, - parseTree, - operation, -! ALL_TUPLES, - ForwardScanDirection, - destination); - break; ---- 292,299 ---- - plan, - parseTree, - operation, -! offset, -! count, - ForwardScanDirection, - destination); - break; -*************** -*** 208,213 **** ---- 302,308 ---- - plan, - parseTree, - operation, -+ offset, - count, - ForwardScanDirection, - destination); -*************** -*** 222,227 **** ---- 317,323 ---- - plan, - parseTree, - operation, -+ offset, - count, - BackwardScanDirection, - destination); -*************** -*** 237,242 **** ---- 333,339 ---- - plan, - parseTree, - operation, -+ 0, - ONE_TUPLE, - ForwardScanDirection, - destination); -*************** -*** 691,696 **** ---- 788,794 ---- - Plan *plan, - Query *parseTree, - CmdType operation, -+ int offsetTuples, - int numberTuples, - ScanDirection direction, - void (*printfunc) ()) -*************** -*** 742,747 **** ---- 840,859 ---- - { - result = NULL; - break; -+ } -+ -+ /****************** -+ * For now we completely execute the plan and skip -+ * result tuples if requested by LIMIT offset. -+ * Finally we should try to do it in deeper levels -+ * if possible (during index scan) -+ * - Jan -+ ****************** -+ */ -+ if (offsetTuples > 0) -+ { -+ --offsetTuples; -+ continue; - } - - /****************** -diff -cr src.orig/backend/executor/functions.c src/backend/executor/functions.c -*** src.orig/backend/executor/functions.c Fri Oct 16 11:53:38 1998 ---- src/backend/executor/functions.c Fri Oct 16 19:01:02 1998 -*************** -*** 130,135 **** ---- 130,138 ---- - None); - estate = CreateExecutorState(); - -+ if (queryTree->limitOffset != NULL || queryTree->limitCount != NULL) -+ elog(ERROR, "LIMIT clause from SQL functions not yet implemented"); -+ - if (nargs > 0) - { - int i; -*************** -*** 200,206 **** - - feature = (LAST_POSTQUEL_COMMAND(es)) ? EXEC_RETONE : EXEC_RUN; - -! return ExecutorRun(es->qd, es->estate, feature, 0); - } - - static void ---- 203,209 ---- - - feature = (LAST_POSTQUEL_COMMAND(es)) ? EXEC_RETONE : EXEC_RUN; - -! return ExecutorRun(es->qd, es->estate, feature, (Node *)NULL, (Node *)NULL); - } - - static void -diff -cr src.orig/backend/executor/spi.c src/backend/executor/spi.c -*** src.orig/backend/executor/spi.c Fri Oct 16 11:53:39 1998 ---- src/backend/executor/spi.c Fri Oct 16 19:25:33 1998 -*************** -*** 791,796 **** ---- 791,798 ---- - bool isRetrieveIntoRelation = false; - char *intoName = NULL; - int res; -+ Const tcount_const; -+ Node *count = NULL; - - switch (operation) - { -*************** -*** 825,830 **** ---- 827,865 ---- - return SPI_ERROR_OPUNKNOWN; - } - -+ /* ---------------- -+ * Get the query LIMIT tuple count -+ * ---------------- -+ */ -+ if (parseTree->limitCount != NULL) -+ { -+ /* ---------------- -+ * A limit clause in the parsetree overrides the -+ * tcount parameter -+ * ---------------- -+ */ -+ count = parseTree->limitCount; -+ } -+ else -+ { -+ /* ---------------- -+ * No LIMIT clause in parsetree. Use a local Const node -+ * to put tcount into it -+ * ---------------- -+ */ -+ memset(&tcount_const, 0, sizeof(tcount_const)); -+ tcount_const.type = T_Const; -+ tcount_const.consttype = INT4OID; -+ tcount_const.constlen = sizeof(int4); -+ tcount_const.constvalue = (Datum)tcount; -+ tcount_const.constisnull = FALSE; -+ tcount_const.constbyval = TRUE; -+ tcount_const.constisset = FALSE; -+ tcount_const.constiscast = FALSE; -+ -+ count = (Node *)&tcount_const; -+ } -+ - if (state == NULL) /* plan preparation */ - return res; - #ifdef SPI_EXECUTOR_STATS -*************** -*** 845,851 **** - return SPI_OK_CURSOR; - } - -! ExecutorRun(queryDesc, state, EXEC_FOR, tcount); - - _SPI_current->processed = state->es_processed; - if (operation == CMD_SELECT && queryDesc->dest == SPI) ---- 880,886 ---- - return SPI_OK_CURSOR; - } - -! ExecutorRun(queryDesc, state, EXEC_FOR, parseTree->limitOffset, count); - - _SPI_current->processed = state->es_processed; - if (operation == CMD_SELECT && queryDesc->dest == SPI) -diff -cr src.orig/backend/parser/analyze.c src/backend/parser/analyze.c -*** src.orig/backend/parser/analyze.c Fri Oct 16 11:53:41 1998 ---- src/backend/parser/analyze.c Fri Oct 16 13:29:27 1998 -*************** -*** 180,186 **** ---- 180,190 ---- - - case T_SelectStmt: - if (!((SelectStmt *) parseTree)->portalname) -+ { - result = transformSelectStmt(pstate, (SelectStmt *) parseTree); -+ result->limitOffset = ((SelectStmt *)parseTree)->limitOffset; -+ result->limitCount = ((SelectStmt *)parseTree)->limitCount; -+ } - else - result = transformCursorStmt(pstate, (SelectStmt *) parseTree); - break; -diff -cr src.orig/backend/parser/gram.y src/backend/parser/gram.y -*** src.orig/backend/parser/gram.y Fri Oct 16 11:53:42 1998 ---- src/backend/parser/gram.y Sun Oct 18 22:20:36 1998 -*************** -*** 45,50 **** ---- 45,51 ---- - #include "catalog/catname.h" - #include "utils/elog.h" - #include "access/xact.h" -+ #include "catalog/pg_type.h" - - #ifdef MULTIBYTE - #include "mb/pg_wchar.h" -*************** -*** 163,169 **** - sort_clause, sortby_list, index_params, index_list, name_list, - from_clause, from_list, opt_array_bounds, nest_array_bounds, - expr_list, attrs, res_target_list, res_target_list2, -! def_list, opt_indirection, group_clause, TriggerFuncArgs - - %type <node> func_return - %type <boolean> set_opt ---- 164,171 ---- - sort_clause, sortby_list, index_params, index_list, name_list, - from_clause, from_list, opt_array_bounds, nest_array_bounds, - expr_list, attrs, res_target_list, res_target_list2, -! def_list, opt_indirection, group_clause, TriggerFuncArgs, -! opt_select_limit - - %type <node> func_return - %type <boolean> set_opt -*************** -*** 192,197 **** ---- 194,201 ---- - - %type <ival> fetch_how_many - -+ %type <node> select_limit_value select_offset_value -+ - %type <list> OptSeqList - %type <defelt> OptSeqElem - -*************** -*** 267,273 **** - FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL, - GRANT, GROUP, HAVING, HOUR_P, - IN, INNER_P, INSENSITIVE, INSERT, INTERVAL, INTO, IS, -! JOIN, KEY, LANGUAGE, LEADING, LEFT, LIKE, LOCAL, - MATCH, MINUTE_P, MONTH_P, NAMES, - NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULL_P, NUMERIC, - OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P, ---- 271,277 ---- - FALSE_P, FETCH, FLOAT, FOR, FOREIGN, FROM, FULL, - GRANT, GROUP, HAVING, HOUR_P, - IN, INNER_P, INSENSITIVE, INSERT, INTERVAL, INTO, IS, -! JOIN, KEY, LANGUAGE, LEADING, LEFT, LIKE, LIMIT, LOCAL, - MATCH, MINUTE_P, MONTH_P, NAMES, - NATIONAL, NATURAL, NCHAR, NEXT, NO, NOT, NULL_P, NUMERIC, - OF, ON, ONLY, OPTION, OR, ORDER, OUTER_P, -*************** -*** 299,305 **** - INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL, - LANCOMPILER, LISTEN, LOAD, LOCATION, LOCK_P, MAXVALUE, MINVALUE, MOVE, - NEW, NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL, -! OIDS, OPERATOR, PASSWORD, PROCEDURAL, - RECIPE, RENAME, RESET, RETURNS, ROW, RULE, - SEQUENCE, SERIAL, SETOF, SHOW, START, STATEMENT, STDIN, STDOUT, TRUSTED, - UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION ---- 303,309 ---- - INCREMENT, INDEX, INHERITS, INSTEAD, ISNULL, - LANCOMPILER, LISTEN, LOAD, LOCATION, LOCK_P, MAXVALUE, MINVALUE, MOVE, - NEW, NOCREATEDB, NOCREATEUSER, NONE, NOTHING, NOTIFY, NOTNULL, -! OFFSET, OIDS, OPERATOR, PASSWORD, PROCEDURAL, - RECIPE, RENAME, RESET, RETURNS, ROW, RULE, - SEQUENCE, SERIAL, SETOF, SHOW, START, STATEMENT, STDIN, STDOUT, TRUSTED, - UNLISTEN, UNTIL, VACUUM, VALID, VERBOSE, VERSION -*************** -*** 2591,2596 **** ---- 2595,2601 ---- - result from_clause where_clause - group_clause having_clause - union_clause sort_clause -+ opt_select_limit - { - SelectStmt *n = makeNode(SelectStmt); - n->unique = $2; -*************** -*** 2602,2607 **** ---- 2607,2622 ---- - n->havingClause = $8; - n->unionClause = $9; - n->sortClause = $10; -+ if ($11 != NIL) -+ { -+ n->limitOffset = nth(0, $11); -+ n->limitCount = nth(1, $11); -+ } -+ else -+ { -+ n->limitOffset = NULL; -+ n->limitCount = NULL; -+ } - $$ = (Node *)n; - } - ; -*************** -*** 2699,2704 **** ---- 2714,2794 ---- - | ASC { $$ = "<"; } - | DESC { $$ = ">"; } - | /*EMPTY*/ { $$ = "<"; /*default*/ } -+ ; -+ -+ opt_select_limit: LIMIT select_offset_value ',' select_limit_value -+ { $$ = lappend(lappend(NIL, $2), $4); } -+ | LIMIT select_limit_value OFFSET select_offset_value -+ { $$ = lappend(lappend(NIL, $4), $2); } -+ | LIMIT select_limit_value -+ { $$ = lappend(lappend(NIL, NULL), $2); } -+ | OFFSET select_offset_value LIMIT select_limit_value -+ { $$ = lappend(lappend(NIL, $2), $4); } -+ | OFFSET select_offset_value -+ { $$ = lappend(lappend(NIL, $2), NULL); } -+ | /* EMPTY */ -+ { $$ = NIL; } -+ ; -+ -+ select_limit_value: Iconst -+ { -+ Const *n = makeNode(Const); -+ -+ if ($1 < 1) -+ elog(ERROR, "selection limit must be ALL or a positive integer value > 0"); -+ -+ n->consttype = INT4OID; -+ n->constlen = sizeof(int4); -+ n->constvalue = (Datum)$1; -+ n->constisnull = FALSE; -+ n->constbyval = TRUE; -+ n->constisset = FALSE; -+ n->constiscast = FALSE; -+ $$ = (Node *)n; -+ } -+ | ALL -+ { -+ Const *n = makeNode(Const); -+ n->consttype = INT4OID; -+ n->constlen = sizeof(int4); -+ n->constvalue = (Datum)0; -+ n->constisnull = FALSE; -+ n->constbyval = TRUE; -+ n->constisset = FALSE; -+ n->constiscast = FALSE; -+ $$ = (Node *)n; -+ } -+ | PARAM -+ { -+ Param *n = makeNode(Param); -+ n->paramkind = PARAM_NUM; -+ n->paramid = $1; -+ n->paramtype = INT4OID; -+ $$ = (Node *)n; -+ } -+ ; -+ -+ select_offset_value: Iconst -+ { -+ Const *n = makeNode(Const); -+ -+ n->consttype = INT4OID; -+ n->constlen = sizeof(int4); -+ n->constvalue = (Datum)$1; -+ n->constisnull = FALSE; -+ n->constbyval = TRUE; -+ n->constisset = FALSE; -+ n->constiscast = FALSE; -+ $$ = (Node *)n; -+ } -+ | PARAM -+ { -+ Param *n = makeNode(Param); -+ n->paramkind = PARAM_NUM; -+ n->paramid = $1; -+ n->paramtype = INT4OID; -+ $$ = (Node *)n; -+ } - ; - - /* -diff -cr src.orig/backend/parser/keywords.c src/backend/parser/keywords.c -*** src.orig/backend/parser/keywords.c Fri Oct 16 11:53:42 1998 ---- src/backend/parser/keywords.c Sun Oct 18 22:13:29 1998 -*************** -*** 128,133 **** ---- 128,134 ---- - {"leading", LEADING}, - {"left", LEFT}, - {"like", LIKE}, -+ {"limit", LIMIT}, - {"listen", LISTEN}, - {"load", LOAD}, - {"local", LOCAL}, -*************** -*** 156,161 **** ---- 157,163 ---- - {"null", NULL_P}, - {"numeric", NUMERIC}, - {"of", OF}, -+ {"offset", OFFSET}, - {"oids", OIDS}, - {"old", CURRENT}, - {"on", ON}, -diff -cr src.orig/backend/rewrite/rewriteDefine.c src/backend/rewrite/rewriteDefine.c -*** src.orig/backend/rewrite/rewriteDefine.c Fri Oct 16 11:53:46 1998 ---- src/backend/rewrite/rewriteDefine.c Fri Oct 16 13:48:55 1998 -*************** -*** 312,317 **** ---- 312,323 ---- - heap_close(event_relation); - - /* -+ * LIMIT in view is not supported -+ */ -+ if (query->limitOffset != NULL || query->limitCount != NULL) -+ elog(ERROR, "LIMIT clause not supported in views"); -+ -+ /* - * ... and finally the rule must be named _RETviewname. - */ - sprintf(expected_name, "_RET%s", event_obj->relname); -diff -cr src.orig/backend/tcop/pquery.c src/backend/tcop/pquery.c -*** src.orig/backend/tcop/pquery.c Fri Oct 16 11:53:47 1998 ---- src/backend/tcop/pquery.c Fri Oct 16 14:02:36 1998 -*************** -*** 40,46 **** - #include "commands/command.h" - - static char *CreateOperationTag(int operationType); -! static void ProcessQueryDesc(QueryDesc *queryDesc); - - - /* ---------------------------------------------------------------- ---- 40,46 ---- - #include "commands/command.h" - - static char *CreateOperationTag(int operationType); -! static void ProcessQueryDesc(QueryDesc *queryDesc, Node *limoffset, Node *limcount); - - - /* ---------------------------------------------------------------- -*************** -*** 205,211 **** - * ---------------------------------------------------------------- - */ - static void -! ProcessQueryDesc(QueryDesc *queryDesc) - { - Query *parseTree; - Plan *plan; ---- 205,211 ---- - * ---------------------------------------------------------------- - */ - static void -! ProcessQueryDesc(QueryDesc *queryDesc, Node *limoffset, Node *limcount) - { - Query *parseTree; - Plan *plan; -*************** -*** 330,336 **** - * actually run the plan.. - * ---------------- - */ -! ExecutorRun(queryDesc, state, EXEC_RUN, 0); - - /* save infos for EndCommand */ - UpdateCommandInfo(operation, state->es_lastoid, state->es_processed); ---- 330,336 ---- - * actually run the plan.. - * ---------------- - */ -! ExecutorRun(queryDesc, state, EXEC_RUN, limoffset, limcount); - - /* save infos for EndCommand */ - UpdateCommandInfo(operation, state->es_lastoid, state->es_processed); -*************** -*** 373,377 **** - print_plan(plan, parsetree); - } - else -! ProcessQueryDesc(queryDesc); - } ---- 373,377 ---- - print_plan(plan, parsetree); - } - else -! ProcessQueryDesc(queryDesc, parsetree->limitOffset, parsetree->limitCount); - } -diff -cr src.orig/include/executor/executor.h src/include/executor/executor.h -*** src.orig/include/executor/executor.h Fri Oct 16 11:53:56 1998 ---- src/include/executor/executor.h Fri Oct 16 12:04:17 1998 -*************** -*** 83,89 **** - * prototypes from functions in execMain.c - */ - extern TupleDesc ExecutorStart(QueryDesc *queryDesc, EState *estate); -! extern TupleTableSlot *ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, int count); - extern void ExecutorEnd(QueryDesc *queryDesc, EState *estate); - extern HeapTuple ExecConstraints(char *caller, Relation rel, HeapTuple tuple); - #ifdef QUERY_LIMIT ---- 83,89 ---- - * prototypes from functions in execMain.c - */ - extern TupleDesc ExecutorStart(QueryDesc *queryDesc, EState *estate); -! extern TupleTableSlot *ExecutorRun(QueryDesc *queryDesc, EState *estate, int feature, Node *limoffset, Node *limcount); - extern void ExecutorEnd(QueryDesc *queryDesc, EState *estate); - extern HeapTuple ExecConstraints(char *caller, Relation rel, HeapTuple tuple); - #ifdef QUERY_LIMIT - - diff --git a/doc/TODO.detail/null b/doc/TODO.detail/null deleted file mode 100644 index 7ac282c972a..00000000000 --- a/doc/TODO.detail/null +++ /dev/null @@ -1,119 +0,0 @@ -From owner-pgsql-general@hub.org Fri Oct 9 18:22:09 1998 -Received: from hub.org (majordom@hub.org [209.47.148.200]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id SAA04220 - for <maillist@candle.pha.pa.us>; Fri, 9 Oct 1998 18:22:08 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id SAA26960; - Fri, 9 Oct 1998 18:18:29 -0400 (EDT) - (envelope-from owner-pgsql-general@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Fri, 09 Oct 1998 18:18:07 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id SAA26917 - for pgsql-general-outgoing; Fri, 9 Oct 1998 18:18:04 -0400 (EDT) - (envelope-from owner-pgsql-general@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-general@postgreSQL.org using -f -Received: from gecko.statsol.com (gecko.statsol.com [198.11.51.133]) - by hub.org (8.8.8/8.8.8) with ESMTP id SAA26904 - for <pgsql-general@postgresql.org>; Fri, 9 Oct 1998 18:17:46 -0400 (EDT) - (envelope-from statsol@statsol.com) -Received: from gecko (gecko [198.11.51.133]) - by gecko.statsol.com (8.9.0/8.9.0) with SMTP id SAA00557 - for <pgsql-general@postgresql.org>; Fri, 9 Oct 1998 18:18:00 -0400 (EDT) -Date: Fri, 9 Oct 1998 18:18:00 -0400 (EDT) -From: Steve Doliov <statsol@statsol.com> -X-Sender: statsol@gecko -To: pgsql-general@postgreSQL.org -Subject: Re: [GENERAL] Making NULLs visible. -Message-ID: <Pine.GSO.3.96.981009181716.545B-100000@gecko> -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Sender: owner-pgsql-general@postgreSQL.org -Precedence: bulk -Status: RO - -On Fri, 9 Oct 1998, Bruce Momjian wrote: - -> [Charset iso-8859-1 unsupported, filtering to ASCII...] -> > > Yes, \ always outputs as \\, excepts someone changed it last week, and I -> > > am requesting a reversal. Do you like the \N if it is unique? -> > -> > Well, it's certainly clear, but could be confused with \n (newline). Can we -> > have \0 instead? -> -> Yes, but it is uppercase. \0 looks like an octal number to me, and I -> think we even output octals sometimes, don't we? -> - -my first suggestion may have been hare-brained, but why not just make the -specifics of the output user-configurable. So if the user chooses \0, so -be it, if the user chooses \N so be it, if the user likes NULL so be it. -but the option would only have one value per database at any given point -in time. so database x could use \N on tuesday and NULL on wednesday, but -database x could never have two references to the characters(s) used to -represent a null value. - -steve - - - - -From owner-pgsql-general@hub.org Sun Oct 11 17:31:08 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id RAA20043 - for <maillist@candle.pha.pa.us>; Sun, 11 Oct 1998 17:31:02 -0400 (EDT) -Received: from hub.org (majordom@hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id RAA03069 for <maillist@candle.pha.pa.us>; Sun, 11 Oct 1998 17:10:34 -0400 (EDT) -Received: from localhost (majordom@localhost) - by hub.org (8.8.8/8.8.8) with SMTP id QAA10856; - Sun, 11 Oct 1998 16:57:34 -0400 (EDT) - (envelope-from owner-pgsql-general@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sun, 11 Oct 1998 16:53:35 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.8.8/8.8.8) id QAA10393 - for pgsql-general-outgoing; Sun, 11 Oct 1998 16:53:34 -0400 (EDT) - (envelope-from owner-pgsql-general@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-general@postgreSQL.org using -f -Received: from mail1.panix.com (mail1.panix.com [166.84.0.212]) - by hub.org (8.8.8/8.8.8) with ESMTP id QAA10378 - for <pgsql-general@postgreSQL.org>; Sun, 11 Oct 1998 16:53:28 -0400 (EDT) - (envelope-from tomg@admin.nrnet.org) -Received: from mailhost.nrnet.org (root@mailhost.nrnet.org [166.84.192.39]) - by mail1.panix.com (8.8.8/8.8.8/PanixM1.3) with ESMTP id QAA16311 - for <pgsql-general@postgreSQL.org>; Sun, 11 Oct 1998 16:53:24 -0400 (EDT) -Received: from admin.nrnet.org (uucp@localhost) - by mailhost.nrnet.org (8.8.7/8.8.4) with UUCP - id QAA16345 for pgsql-general@postgreSQL.org; Sun, 11 Oct 1998 16:28:47 -0400 -Received: from localhost (tomg@localhost) - by admin.nrnet.org (8.8.7/8.8.7) with SMTP id QAA11569 - for <pgsql-general@postgreSQL.org>; Sun, 11 Oct 1998 16:28:41 -0400 -Date: Sun, 11 Oct 1998 16:28:41 -0400 (EDT) -From: Thomas Good <tomg@admin.nrnet.org> -To: pgsql-general@postgreSQL.org -Subject: Re: [GENERAL] Making NULLs visible. -In-Reply-To: <Pine.GSO.3.96.981009181716.545B-100000@gecko> -Message-ID: <Pine.LNX.3.96.981011161908.11556A-100000@admin.nrnet.org> -MIME-Version: 1.0 -Content-Type: TEXT/PLAIN; charset=US-ASCII -Sender: owner-pgsql-general@postgreSQL.org -Precedence: bulk -Status: RO - -Watching all this go by...as a guy who has to move alot of data -from legacy dbs to postgres, I've gotten used to \N being a null. - -My vote, if I were allowed to cast one, would be to have one null -and that would be the COPY command null. I have no difficulty -distinguishing a null from a newline... - -At the pgsql command prompt I would find seeing \N rather reassuring. -I've seen alot of these little guys. - - ---------- Sisters of Charity Medical Center ---------- - Department of Psychiatry - ---- - Thomas Good <tomg@q8.nrnet.org> - Coordinator, North Richmond C.M.H.C. Information Systems - 75 Vanderbilt Ave, Quarters 8 Phone: 718-354-5528 - Staten Island, NY 10304 Fax: 718-354-5056 - - - diff --git a/doc/TODO.detail/pg_shadow b/doc/TODO.detail/pg_shadow deleted file mode 100644 index 45ebe87e7a8..00000000000 --- a/doc/TODO.detail/pg_shadow +++ /dev/null @@ -1,55 +0,0 @@ -From owner-pgsql-hackers@hub.org Sun Aug 2 20:01:13 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.8.5/8.8.5) with ESMTP id UAA15937 - for <maillist@candle.pha.pa.us>; Sun, 2 Aug 1998 20:01:11 -0400 (EDT) -Received: from hub.org (hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id TAA01026 for <maillist@candle.pha.pa.us>; Sun, 2 Aug 1998 19:33:53 -0400 (EDT) -Received: from localhost (majordom@localhost) by hub.org (8.8.8/8.7.5) with SMTP id TAA19878; Sun, 2 Aug 1998 19:30:59 -0400 (EDT) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sun, 02 Aug 1998 19:28:23 +0000 (EDT) -Received: (from majordom@localhost) by hub.org (8.8.8/8.7.5) id TAA19534 for pgsql-hackers-outgoing; Sun, 2 Aug 1998 19:28:22 -0400 (EDT) -Received: from sss.sss.pgh.pa.us (sss.pgh.pa.us [206.210.65.6]) by hub.org (8.8.8/8.7.5) with ESMTP id TAA19521 for <pgsql-hackers@postgreSQL.org>; Sun, 2 Aug 1998 19:28:15 -0400 (EDT) -Received: from sss.sss.pgh.pa.us (localhost [127.0.0.1]) - by sss.sss.pgh.pa.us (8.9.1/8.9.1) with ESMTP id TAA22594 - for <pgsql-hackers@postgreSQL.org>; Sun, 2 Aug 1998 19:28:13 -0400 (EDT) -To: pgsql-hackers@postgreSQL.org -Subject: [HACKERS] TODO item: make pg_shadow updates more robust -Date: Sun, 02 Aug 1998 19:28:13 -0400 -Message-ID: <22591.902100493@sss.pgh.pa.us> -From: Tom Lane <tgl@sss.pgh.pa.us> -Sender: owner-pgsql-hackers@hub.org -Precedence: bulk -Status: ROr - -I learned the hard way last night that the postmaster's password -authentication routines don't look at the pg_shadow table. They -look at a separate file named pg_pwd, which certain backend operations -will update from pg_shadow. (This is not documented in any user -documentation that I could find; I had to burrow into -src/backend/commands/user.c to discover it.) - -Unfortunately, if a clueless dbadmin (like me ;-)) tries to update -password data with the obvious thing, - update pg_shadow set passwd = 'xxxxx' where usename = 'yyyy'; -pg_pwd doesn't get fixed. - -A more drastic problem is that pg_dump believes it can save and -restore pg_shadow data using "copy". Following an initdb and restore -from a pg_dump -z script, pg_shadow will look just fine, but only -the database admin will be listed in pg_pwd. This is likely to provoke -some confusion, IMHO. - -As a short-term thing, the fact that you *must* set passwords with -ALTER USER ought to be documented, preferably someplace where a -dbadmin who's never heard of ALTER USER is likely to find it. - -As a longer-term thing, I think it would be far better if ordinary -SQL operations on pg_shadow just did the right thing. Wouldn't it -be possible to implement copying to pg_pwd by means of a trigger on -pg_shadow updates, or something like that? - -(I'm afraid that pg_dump -z is pretty well broken for operations on -a password-protected database, btw. Has anyone used it successfully -in that situation?) - - regards, tom lane - - diff --git a/doc/TODO.detail/primary b/doc/TODO.detail/primary deleted file mode 100644 index 75bf82c1e0d..00000000000 --- a/doc/TODO.detail/primary +++ /dev/null @@ -1,805 +0,0 @@ -From owner-pgsql-hackers@hub.org Fri Sep 4 00:47:06 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.8.5/8.8.5) with ESMTP id AAA01047 - for <maillist@candle.pha.pa.us>; Fri, 4 Sep 1998 00:47:05 -0400 (EDT) -Received: from hub.org (hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id XAA02044 for <maillist@candle.pha.pa.us>; Thu, 3 Sep 1998 23:11:07 -0400 (EDT) -Received: from localhost (majordom@localhost) by hub.org (8.8.8/8.7.5) with SMTP id XAA27418; Thu, 3 Sep 1998 23:06:16 -0400 (EDT) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Thu, 03 Sep 1998 23:04:11 +0000 (EDT) -Received: (from majordom@localhost) by hub.org (8.8.8/8.7.5) id XAA27185 for pgsql-hackers-outgoing; Thu, 3 Sep 1998 23:04:09 -0400 (EDT) -Received: from dune.krs.ru (dune.krs.ru [195.161.16.38]) by hub.org (8.8.8/8.7.5) with ESMTP id XAA27169 for <hackers@postgreSQL.org>; Thu, 3 Sep 1998 23:03:59 -0400 (EDT) -Received: from krs.ru (localhost.krs.ru [127.0.0.1]) - by dune.krs.ru (8.8.8/8.8.8) with ESMTP id LAA10059; - Fri, 4 Sep 1998 11:03:00 +0800 (KRSS) - (envelope-from vadim@krs.ru) -Message-ID: <35EF5864.E5142D35@krs.ru> -Date: Fri, 04 Sep 1998 11:03:00 +0800 -From: Vadim Mikheev <vadim@krs.ru> -Organization: OJSC Rostelecom (Krasnoyarsk) -X-Mailer: Mozilla 4.05 [en] (X11; I; FreeBSD 2.2.6-RELEASE i386) -MIME-Version: 1.0 -To: "D'Arcy J.M. Cain" <darcy@druid.net> -CC: "Thomas G. Lockhart" <lockhart@alumni.caltech.edu>, hackers@postgreSQL.org -Subject: Re: [HACKERS] Adding PRIMARY KEY info -References: <m0zEaoV-00006JC@druid.net> -Content-Type: text/plain; charset=us-ascii -Content-Transfer-Encoding: 7bit -Sender: owner-pgsql-hackers@hub.org -Precedence: bulk -Status: RO - -D'Arcy J.M. Cain wrote: -> -> Thus spake Vadim Mikheev -> > Imho, indices should be used/created for FOREIGN keys and so pg_index -> > is good place for both PRIMARY and FOREIGN keys infos. -> -> Are you sure? I don't know about implementing it but it seems more -> like an attribute thing rather than an index thing. Certainly from a -> database design viewpoint you want to refer to the fields, not the -> index on them. If you put it into the index then you have to do -> an extra join to get the information. -> -> Perhaps you have to do the extra join anyway for other purposes so it -> may not matter. All I want is to be able to be able to extract the -> field that the designer specified as the key. As long as I can design -> a select statement that gives me that I don't much care how it is -> implemented. I'll cache the information anyway so it won't have a -> huge impact on my programs. - -First, let me note that you have to add int28 field to pg_class, -not just oid field, to know what attributeS are in primary key -(we support multi-attribute primary keys). -This could be done... -But what about foreign and unique (!) keys ? -There may be _many_ foreign/unique keys defined for one table! -And so foreign/unique keys info have to be stored somewhere else, -not in pg_class. - -pg_index is good place for all _3_ key types because of: - -1. index should be created for each foreign key - - just for performance. -2. pg_index already has int28 field for key attributes. -3. pg_index already has indisunique (note that foreign keys - may reference unique keys, not just primary ones). - -- so we have just add two fields to pg_index: - -bool indisprimary; -oid indreferenced; -^^^^^^^^^^^^^^^^^^ -this is for foreign keys: oid of referenced relation' -primary/unique key index. - -I agreed that indices are just implementation... -If you don't like to store key infos in pg_index then -new pg_key relation have to be added... - -Comments ? - -Vadim - - -From owner-pgsql-hackers@hub.org Sat Sep 5 02:01:13 1998 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.8.5/8.8.5) with ESMTP id CAA14437 - for <maillist@candle.pha.pa.us>; Sat, 5 Sep 1998 02:01:11 -0400 (EDT) -Received: from hub.org (hub.org [209.47.148.200]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id BAA09928 for <maillist@candle.pha.pa.us>; Sat, 5 Sep 1998 01:48:32 -0400 (EDT) -Received: from localhost (majordom@localhost) by hub.org (8.8.8/8.7.5) with SMTP id BAA18282; Sat, 5 Sep 1998 01:43:16 -0400 (EDT) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Sat, 05 Sep 1998 01:41:40 +0000 (EDT) -Received: (from majordom@localhost) by hub.org (8.8.8/8.7.5) id BAA18241 for pgsql-hackers-outgoing; Sat, 5 Sep 1998 01:41:38 -0400 (EDT) -Received: from dune.krs.ru (dune.krs.ru [195.161.16.38]) by hub.org (8.8.8/8.7.5) with ESMTP id BAA18211; Sat, 5 Sep 1998 01:41:21 -0400 (EDT) -Received: from krs.ru (localhost.krs.ru [127.0.0.1]) - by dune.krs.ru (8.8.8/8.8.8) with ESMTP id NAA20555; - Sat, 5 Sep 1998 13:40:44 +0800 (KRSS) - (envelope-from vadim@krs.ru) -Message-ID: <35F0CEDB.AD721090@krs.ru> -Date: Sat, 05 Sep 1998 13:40:43 +0800 -From: Vadim Mikheev <vadim@krs.ru> -Organization: OJSC Rostelecom (Krasnoyarsk) -X-Mailer: Mozilla 4.05 [en] (X11; I; FreeBSD 2.2.6-RELEASE i386) -MIME-Version: 1.0 -To: "D'Arcy J.M. Cain" <darcy@druid.net> -CC: hackers@postgreSQL.org, pgsql-core@postgreSQL.org -Subject: Re: [HACKERS] Adding PRIMARY KEY info -References: <m0zEvLK-00006FC@druid.net> -Content-Type: text/plain; charset=us-ascii -Content-Transfer-Encoding: 7bit -Sender: owner-pgsql-hackers@hub.org -Precedence: bulk -Status: ROr - -D'Arcy J.M. Cain wrote: -> -> > -> > pg_index is good place for all _3_ key types because of: -> > -> > 1. index should be created for each foreign key - -> > just for performance. -> > 2. pg_index already has int28 field for key attributes. -> > 3. pg_index already has indisunique (note that foreign keys -> > may reference unique keys, not just primary ones). -> > -> > - so we have just add two fields to pg_index: -> > -> > bool indisprimary; -> > oid indreferenced; -> > ^^^^^^^^^^^^^^^^^^ -> > this is for foreign keys: oid of referenced relation' -> > primary/unique key index. -> -> Sounds fine to me. Any chance of seeing this in 6.4? - -I could add this (and FOREIGN key implementation) before -11-13 Sep... But not the ALTER TABLE ADD/DROP CONSTRAINT -stuff (ok for Entry SQL). -But we are in beta... - -Comments? - -> Nope, pg_index is fine by me. Now, once we have this, how do we find -> the index for a particular attribute? I can't seem to figure out the -> relationship between pg_attribute and pg_index. The chart in the docs -> suggests that indkey is the relation but I can't see any useful info -> there for joining the tables. - -pg_index: - indrelid - oid of indexed relation - indkey - up to the 8 attnums - -pg_attribute: - attrelid - oid of relation - attnum - ... - -Without outer join you have to query pg_attribute for each -valid attnum from pg_index->indkey -:( - -Vadim - - -From owner-pgsql-hackers@hub.org Tue Sep 21 05:31:11 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id FAA07543 - for <maillist@candle.pha.pa.us>; Tue, 21 Sep 1999 05:31:09 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id FAA19587 for <maillist@candle.pha.pa.us>; Tue, 21 Sep 1999 05:12:03 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id EAA55119; - Tue, 21 Sep 1999 04:48:48 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Tue, 21 Sep 1999 04:45:33 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id EAA54532 - for pgsql-hackers-outgoing; Tue, 21 Sep 1999 04:44:35 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -Received: from orion.SAPserv.Hamburg.dsh.de (Tpolaris2.sapham.debis.de [53.2.131.8]) - by hub.org (8.9.3/8.9.3) with SMTP id EAA54496 - for <pgsql-hackers@postgreSQL.org>; Tue, 21 Sep 1999 04:44:13 -0400 (EDT) - (envelope-from wieck@debis.com) -Received: by orion.SAPserv.Hamburg.dsh.de - for pgsql-hackers@postgreSQL.org - id m11TLQP-0003kLC; Tue, 21 Sep 99 10:37 MET DST -Message-Id: <m11TLQP-0003kLC@orion.SAPserv.Hamburg.dsh.de> -From: wieck@debis.com (Jan Wieck) -Subject: [HACKERS] Re: Referential Integrity In PostgreSQL -To: pgsql-hackers@postgreSQL.org (PostgreSQL HACKERS) -Date: Tue, 21 Sep 1999 10:37:21 +0200 (MET DST) -Reply-To: wieck@debis.com (Jan Wieck) -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -> -> Hi , Jan -> -> my name is Max . - -Hi Max, - -> -> I have contributed to SPI interface , -> that with external Trigger try to make -> a referential integrity. -> -> If I can Help , in something , -> I'm here . -> - - You're welcome. - - I've CC'd the hackers list because we might get some ideas - from there too (and to surface once in a while - Bruce - already missed me). - - Currently I'm very busy for serious work so I don't find - enough spare time to start on such a big change to - PostgreSQL. But I'd like to give you an overview of what I - have in mind so far so you can decide if you're able to help. - - Referential integrity (RI) is based on constraints defined in - the schema of a database. There are some different types of - constraints: - - 1. Uniqueness constraints. - - 2. Foreign key constraints that ensure that a key value used - in an attribute exists in another relation. One - constraint must ensure you're unable to INSERT/UPDATE to - a value that doesn't exist, another one must prevent - DELETE on a referenced key item or that it is changed - during UPDATE. - - 3. Cascading deletes that let rows referring to a key follow - on DELETE silently. - - Even if not defined in the standard (AFAIK) there could be - others like letting references automatically follow on UPDATE - to a key value. - - All constraints can be enabled and/or default to be deferred. - That means, that the RI checks aren't performed when they are - triggerd. Instead, they're checked at transaction end or if - explicitly invoked by some special statement. This is really - important because someone must be able to setup cyclic RI - checks that could never be satisfied if the checks would be - performed immediately. The major problem on this is the - amount of data affected until the checks must be performed. - The number of statements executed, that trigger such deferred - constraints, shouldn't be limited. And one single - INSERT/UPDATE/DELETE could affect thousands of rows. - - Due to these problems I thought, it might not be such a good - idea to remember CTID's or the like to get back OLD/NEW rows - at the time the constraints are checked. Instead I planned to - misuse the rule system for it. Unfortunately, the rule system - has damned tricky problems itself when it comes to having-, - distinct and other clauses and extremely on aggregates and - subselects. These problems would have to get fixed first. So - it's a solution that cannot be implemented right now. - - Fallback to CTID remembering though. There are problems too - :-(. Let's enhance the trigger mechanism with a deferred - feature. First this requires two additional bool attributes - in the pg_trigger relation that tell if this trigger is - deferrable and if it is deferred by default. While at it we - should add another bool that tells if the trigger is enabled - (ALTER TRIGGER {ENABLE|DISABLE} trigger). - - Second we need an internal list of triggers, that are - currently DEFINED AS DEFERRED. Either because they default to - it, or the user explicitly asked to deferr it. - - Third we need an internal list of triggers that must be - invoked later because at the time an event occured where they - should have been triggered, they appeared in the other list - and their execution is delayed until transaction end or - explicit execution. This list must remember the OID of the - trigger to invoke (to identify the procedure and the - arguments), the relation that caused the trigger and the - CTID's of the OLD and NEW row. - - That last list could grow extremely! Think of a trigger - that's executing commands over SPI which in turn activate - deferred triggers. Since the order of trigger execution is - very important for RI, I can't see any chance to - simplify/condense this information. Thus it is 16 bytes at - least per deferred trigger call (2 OID's plus 2 CTID's). I - think one or more temp files would fit best for this. - - A last tricky point is if one of a bunch of deferred triggers - is explicitly called for execution. At this time, the entries - for it in the temp file(s) must get processed and marked - executed (maybe by overwriting the triggers OID with the - invalid OID) while other trigger events still have to get - recorded. - - Needless to say that reading thousands of those entries just - to find a few isn't good on performance. But better have this - special case slow that dealing with hundreds of temp files or - other overhead slowing down the usual case where ALL deferred - triggers get called at transaction end. - - Trigger invocation is simple now - fetch the OLD and NEW rows - by CTID and execute the trigger as done by the trigger - manager. Oh - well - vacuum shouldn't touch relations where - deferred triggers are outstanding. Might require some - special lock entry - Vadim? - - Did I miss something? - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#========================================= wieck@debis.com (Jan Wieck) # - -************ - - -From owner-pgsql-hackers@hub.org Tue Sep 21 08:31:03 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id IAA09071 - for <maillist@candle.pha.pa.us>; Tue, 21 Sep 1999 08:31:02 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id IAA25991 for <maillist@candle.pha.pa.us>; Tue, 21 Sep 1999 08:04:59 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id HAA82019; - Tue, 21 Sep 1999 07:48:14 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Tue, 21 Sep 1999 07:47:30 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id HAA81906 - for pgsql-hackers-outgoing; Tue, 21 Sep 1999 07:46:38 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -Received: from orion.SAPserv.Hamburg.dsh.de (Tpolaris2.sapham.debis.de [53.2.131.8]) - by hub.org (8.9.3/8.9.3) with SMTP id HAA81888 - for <hackers@postgreSQL.org>; Tue, 21 Sep 1999 07:46:26 -0400 (EDT) - (envelope-from wieck@debis.com) -Received: by orion.SAPserv.Hamburg.dsh.de - for hackers@postgreSQL.org - id m11TOGd-0003kwC; Tue, 21 Sep 99 13:39 MET DST -Message-Id: <m11TOGd-0003kwC@orion.SAPserv.Hamburg.dsh.de> -From: wieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] Re: Referential Integrity In PostgreSQL -To: andreas.zeugswetter@telecom.at (Andreas Zeugswetter) -Date: Tue, 21 Sep 1999 13:39:27 +0200 (MET DST) -Cc: hackers@postgresql.org -Reply-To: wieck@debis.com (Jan Wieck) -In-Reply-To: <37E74EB9.44F9766E@telecom.at> from "Andreas Zeugswetter" at Sep 21, 99 11:24:09 am -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgresql.org -Precedence: bulk -Status: RO - -> -> > Oh - well - vacuum shouldn't touch relations where -> > deferred triggers are outstanding. Might require some -> > special lock entry - Vadim? -> -> All modified data will be in this same still open transaction. -> Therefore no relevant data can be removed by vacuum anyway. - - I expect this, but I really need to be sure that not even the - location of the tuple in the heap will change. I need to find - the tuples at the time the deferred triggers must be executed - via heap_fetch() by their CTID! - -> -> It is my understanding, that the RI check is performed on the newest -> available (committed) data (+ modified data from my own tx). -> E.g. a primary key that has been removed by another transaction after -> my begin work will lead to an RI violation if referenced as foreign key. - - Absolutely right. The function that will fire the deferred - triggers must switch to READ COMMITTED isolevel while doing - so. - - What I'm not sure about is which snapshot to use to get the - OLD tuples (outdated in this transaction by a previous - command). Vadim? - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#========================================= wieck@debis.com (Jan Wieck) # - - - -************ - - -From owner-pgsql-hackers@hub.org Tue Sep 21 10:45:40 1999 -Received: from hub.org (hub.org [216.126.84.1]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id KAA10993 - for <maillist@candle.pha.pa.us>; Tue, 21 Sep 1999 10:45:39 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id KAA22590; - Tue, 21 Sep 1999 10:36:16 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Tue, 21 Sep 1999 10:35:37 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id KAA22200 - for pgsql-hackers-outgoing; Tue, 21 Sep 1999 10:34:47 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -Received: from sunpine.krs.ru (SunPine.krs.ru [195.161.16.37]) - by hub.org (8.9.3/8.9.3) with ESMTP id KAA22048 - for <hackers@postgreSQL.org>; Tue, 21 Sep 1999 10:33:38 -0400 (EDT) - (envelope-from vadim@krs.ru) -Received: from krs.ru (dune.krs.ru [195.161.16.38]) - by sunpine.krs.ru (8.8.8/8.8.8) with ESMTP id WAA27122; - Tue, 21 Sep 1999 22:33:22 +0800 (KRSS) -Message-ID: <37E79730.CC415030@krs.ru> -Date: Tue, 21 Sep 1999 22:33:20 +0800 -From: Vadim Mikheev <vadim@krs.ru> -Organization: OJSC Rostelecom (Krasnoyarsk) -X-Mailer: Mozilla 4.5 [en] (X11; I; FreeBSD 3.0-RELEASE i386) -X-Accept-Language: ru, en -MIME-Version: 1.0 -To: Jan Wieck <wieck@debis.com> -CC: Andreas Zeugswetter <andreas.zeugswetter@telecom.at>, - hackers@postgreSQL.org -Subject: Re: [HACKERS] Re: Referential Integrity In PostgreSQL -References: <m11TOGd-0003kwC@orion.SAPserv.Hamburg.dsh.de> -Content-Type: text/plain; charset=us-ascii -Content-Transfer-Encoding: 7bit -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -Jan Wieck wrote: -> -> > It is my understanding, that the RI check is performed on the newest -> > available (committed) data (+ modified data from my own tx). -> > E.g. a primary key that has been removed by another transaction after -> > my begin work will lead to an RI violation if referenced as foreign key. -> -> Absolutely right. The function that will fire the deferred -> triggers must switch to READ COMMITTED isolevel while doing - ^^^^^^^^^^^^^^ -> so. - -NO! -What if one transaction deleted PK, another one inserted FK -and now both performe RI check? Both transactions _must_ -use DIRTY READs to notice that RI violated by another -in-progress transaction and wait for concurrent transaction... - -BTW, using triggers to check _each_ modified tuple -(i.e. run Executor for each modified tuple) is bad for -performance. We could implement direct support for -standard RI constraints. - -Using rules (statement level triggers) for INSERT...SELECT, -UPDATE and DELETE queries would be nice! Actually, RI constraint -checks need in very simple queries (i.e. without distinct etc) -and the only we would have to do is - -> What I'm not sure about is which snapshot to use to get the -> OLD tuples (outdated in this transaction by a previous -> command). Vadim? - -1. Add CommandId to Snapshot. -2. Use Snapshot->CommandId instead of global CurrentScanCommandId. -3. Use Snapshots with different CommandId-s to get OLD/NEW - versions. - -But I agreed that the size of parsetrees may be big and for -COPY...FROM/INSERTs we should remember IDs of modified -tuples. Well. Please remember that I implement WAL right -now, already have 1000 lines of code and hope to run first -tests after writing additional ~200 lines -:) -We could read modified tuple IDs from WAL... - -Vadim - -************ - - -From owner-pgsql-hackers@hub.org Tue Sep 21 11:18:19 1999 -Received: from hub.org (hub.org [216.126.84.1]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id LAA11537 - for <maillist@candle.pha.pa.us>; Tue, 21 Sep 1999 11:18:18 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id LAA27395; - Tue, 21 Sep 1999 11:04:42 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Tue, 21 Sep 1999 11:03:56 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id LAA27106 - for pgsql-hackers-outgoing; Tue, 21 Sep 1999 11:02:50 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -Received: from orion.SAPserv.Hamburg.dsh.de (Tpolaris2.sapham.debis.de [53.2.131.8]) - by hub.org (8.9.3/8.9.3) with SMTP id LAA27041 - for <hackers@postgreSQL.org>; Tue, 21 Sep 1999 11:02:34 -0400 (EDT) - (envelope-from wieck@debis.com) -Received: by orion.SAPserv.Hamburg.dsh.de - for hackers@postgreSQL.org - id m11TRKP-0003kLC; Tue, 21 Sep 99 16:55 MET DST -Message-Id: <m11TRKP-0003kLC@orion.SAPserv.Hamburg.dsh.de> -From: wieck@debis.com (Jan Wieck) -Subject: Re: [HACKERS] Re: Referential Integrity In PostgreSQL -To: vadim@krs.ru (Vadim Mikheev) -Date: Tue, 21 Sep 1999 16:55:33 +0200 (MET DST) -Cc: wieck@debis.com, andreas.zeugswetter@telecom.at, hackers@postgreSQL.org -Reply-To: wieck@debis.com (Jan Wieck) -In-Reply-To: <37E79730.CC415030@krs.ru> from "Vadim Mikheev" at Sep 21, 99 10:33:20 pm -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -> -> Jan Wieck wrote: -> > -> > > It is my understanding, that the RI check is performed on the newest -> > > available (committed) data (+ modified data from my own tx). -> > > E.g. a primary key that has been removed by another transaction after -> > > my begin work will lead to an RI violation if referenced as foreign key. -> > -> > Absolutely right. The function that will fire the deferred -> > triggers must switch to READ COMMITTED isolevel while doing -> ^^^^^^^^^^^^^^ -> > so. -> -> NO! -> What if one transaction deleted PK, another one inserted FK -> and now both performe RI check? Both transactions _must_ -> use DIRTY READs to notice that RI violated by another -> in-progress transaction and wait for concurrent transaction... - - Oh - I see - yes. - -> -> BTW, using triggers to check _each_ modified tuple -> (i.e. run Executor for each modified tuple) is bad for -> performance. We could implement direct support for -> standard RI constraints. - - As I want to implement it, there would be not much difference - between a regular trigger invocation and a deferred one. If - that causes a performance problem, I think we should speed up - the trigger call mechanism in general instead of not using - triggers. - -> -> Using rules (statement level triggers) for INSERT...SELECT, -> UPDATE and DELETE queries would be nice! Actually, RI constraint -> checks need in very simple queries (i.e. without distinct etc) -> and the only we would have to do is -> -> > What I'm not sure about is which snapshot to use to get the -> > OLD tuples (outdated in this transaction by a previous -> > command). Vadim? -> -> 1. Add CommandId to Snapshot. -> 2. Use Snapshot->CommandId instead of global CurrentScanCommandId. -> 3. Use Snapshots with different CommandId-s to get OLD/NEW -> versions. -> -> But I agreed that the size of parsetrees may be big and for -> COPY...FROM/INSERTs we should remember IDs of modified -> tuples. Well. Please remember that I implement WAL right -> now, already have 1000 lines of code and hope to run first -> tests after writing additional ~200 lines -:) -> We could read modified tuple IDs from WAL... - - Not only on COPY. One regular INSERT/UPDATE/DELETE statement - can actually fire thousands of trigger calls right now. These - triggers normally use SPI to execute their own queries. If - such a trigger now uses a query that in turn causes a - deferred constraint, we might have to save thousands of - deferred querytrees - impossible mission. - - That's IMHO a clear drawback against using rules for - deferrable RI. - - What I'm currently doing is clearly encapsulated in some - functions in commands/trigger.c (except for some additional - attributes in pg_trigger). If it later turns out that we can - combine the information required into WAL, I think we have - time enough to do so and shouldn't really care if v6.6 - doesn't have it already combined. - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#========================================= wieck@debis.com (Jan Wieck) # - - - -************ - - -From owner-pgsql-hackers@hub.org Tue Sep 21 15:30:29 1999 -Received: from renoir.op.net (root@renoir.op.net [209.152.193.4]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id PAA14590 - for <maillist@candle.pha.pa.us>; Tue, 21 Sep 1999 15:30:28 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) by renoir.op.net (o1/$ Revision: 1.18 $) with ESMTP id PAA09192 for <maillist@candle.pha.pa.us>; Tue, 21 Sep 1999 15:06:09 -0400 (EDT) -Received: from hub.org (hub.org [216.126.84.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id OAA73126; - Tue, 21 Sep 1999 14:56:15 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Tue, 21 Sep 1999 14:54:47 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id OAA72607 - for pgsql-hackers-outgoing; Tue, 21 Sep 1999 14:53:51 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -Received: from orion.SAPserv.Hamburg.dsh.de (Tpolaris2.sapham.debis.de [53.2.131.8]) - by hub.org (8.9.3/8.9.3) with SMTP id OAA72516 - for <pgsql-hackers@postgreSQL.org>; Tue, 21 Sep 1999 14:52:56 -0400 (EDT) - (envelope-from wieck@debis.com) -Received: by orion.SAPserv.Hamburg.dsh.de - for pgsql-hackers@postgreSQL.org - id m11TUvX-0003kLC; Tue, 21 Sep 99 20:46 MET DST -Message-Id: <m11TUvX-0003kLC@orion.SAPserv.Hamburg.dsh.de> -From: wieck@debis.com (Jan Wieck) -Subject: [HACKERS] RI question -To: pgsql-hackers@postgreSQL.org (PostgreSQL HACKERS) -Date: Tue, 21 Sep 1999 20:46:06 +0200 (MET DST) -Reply-To: wieck@debis.com (Jan Wieck) -X-Mailer: ELM [version 2.4 PL25] -Content-Type: text -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -Uh oh, - - I think deferred RI constraints must only fire the actions - that remain after all commands during the entire transaction - are condensed to the total minimum required to get that - state, because deferred RI must only check what VISIBLY - happened during the transaction. - - Thinking on the tuple level, a sequence of - INSERT,UPDATE,UPDATE must fire only one INSERT trigger, but - with the values of the last UPDATE. An UPDATE,DELETE sequence - is in fact a DELETE of the original tuple and an - INSERT,UPDATE,DELETE sequence is nothing. - - That means that the recording mechnism of the trigger events - must be very smart on UPDATE and DELETE events, looking at - the x_min of the old tuple if that resulted from the current - transaction. If so, follow the events backward, disable - previous ones and change the new event into what it really - has to be. - - But some problems remain unsolvable by this: - - - PK has an ON DELETE CASCADE for FK - - BEGIN - - DELETE PK - - INSERT same PK - - COMMIT. - - This really shouldn't invoke the cascading delete, because at - COMMIT the PK still is there. Same for a constraint that - forbids deletion of a PK while referenced by FK. Therefore - the deferred event recorder must check on INSERT any previous - DELETES for the same relation if the key does match and drop - both deferred triggers if so. Therefore it needs to know - which attributes build the PK of that relation - (<relname>_pkey guaranteed?). - - Well, I think that's finally the death of RI over rules. The - code managing those rules during CREATE/ALTER TABLE would - become totally unmaintainable. And (sorry Vadim) it's the - death of SLT for this too because this event tracking must be - done on the tuple level. - - It complicated the trigger approach too, but IMHO not too - bad. Anyway, some co-developer(s) doing the parser- and - utility-statement stuff (SET CONSTRAINTS ... etc.) would be - great. - - Volunteers? - - -Jan - --- - -#======================================================================# -# It's easier to get forgiveness for being wrong than for being right. # -# Let's break this rule - forgive me. # -#========================================= wieck@debis.com (Jan Wieck) # - - - -************ - - -From owner-pgsql-hackers@hub.org Tue Jul 13 22:30:50 1999 -Received: from hub.org (hub.org [209.167.229.1]) - by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id WAA08452 - for <maillist@candle.pha.pa.us>; Tue, 13 Jul 1999 22:30:49 -0400 (EDT) -Received: from hub.org (hub.org [209.167.229.1]) - by hub.org (8.9.3/8.9.3) with ESMTP id WAA31614; - Tue, 13 Jul 1999 22:25:04 -0400 (EDT) - (envelope-from owner-pgsql-hackers@hub.org) -Received: by hub.org (TLB v0.10a (1.23 tibbs 1997/01/09 00:29:32)); Tue, 13 Jul 1999 22:22:59 +0000 (EDT) -Received: (from majordom@localhost) - by hub.org (8.9.3/8.9.3) id WAA31285 - for pgsql-hackers-outgoing; Tue, 13 Jul 1999 22:22:58 -0400 (EDT) - (envelope-from owner-pgsql-hackers@postgreSQL.org) -X-Authentication-Warning: hub.org: majordom set sender to owner-pgsql-hackers@postgreSQL.org using -f -Received: from sd.tpf.co.jp (sd.tpf.co.jp [210.161.239.34]) - by hub.org (8.9.3/8.9.3) with ESMTP id WAA31259 - for <pgsql-hackers@postgreSQL.org>; Tue, 13 Jul 1999 22:22:47 -0400 (EDT) - (envelope-from Inoue@tpf.co.jp) -Received: from cadzone ([126.0.1.40] (may be forged)) - by sd.tpf.co.jp (2.5 Build 2640 (Berkeley 8.8.6)/8.8.4) with SMTP - id LAA04296 for <pgsql-hackers@postgreSQL.org>; Wed, 14 Jul 1999 11:22:46 +0900 -From: "Hiroshi Inoue" <Inoue@tpf.co.jp> -To: "pgsql-hackers" <pgsql-hackers@postgreSQL.org> -Subject: [HACKERS] 9-key index ? -Date: Wed, 14 Jul 1999 11:25:09 +0900 -Message-ID: <000401becda0$17deee60$2801007e@cadzone.tpf.co.jp> -MIME-Version: 1.0 -Content-Type: text/plain; - charset="iso-2022-jp" -Content-Transfer-Encoding: 7bit -X-Priority: 3 (Normal) -X-MSMail-Priority: Normal -X-Mailer: Microsoft Outlook 8.5, Build 4.71.2173.0 -X-MimeOLE: Produced By Microsoft MimeOLE V4.72.2106.4 -Importance: Normal -Sender: owner-pgsql-hackers@postgreSQL.org -Precedence: bulk -Status: RO - -Hi all, - -I could create a 9-key index. - -create table ix9 ( -i1 int4, -i2 int4, -i3 int4, -i4 int4, -i5 int4, -i6 int4, -i7 int4, -i8 int4, -i9 int4, -primary key (i1,i2,i3,i4,i5,i6,i7,i8,i9) -); -NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'ix9_pkey' -for table 'ix9' -CREATE - -\d ix9_pkey - -Table = ix9_pkey -+----------------------------------+----------------------------------+----- ---+ -| Field | Type | -Length| -+----------------------------------+----------------------------------+----- ---+ -| i1 | int4 | -4 | -| i2 | int4 | -4 | -| i3 | int4 | -4 | -| i4 | int4 | -4 | -| i5 | int4 | -4 | -| i6 | int4 | -4 | -| i7 | int4 | -4 | -| i8 | int4 | -4 | -| i9 | int4 | -4 | -+----------------------------------+----------------------------------+----- ---+ - -Is it right ? - -Regards. - -Hiroshi Inoue -Inoue@tpf.co.jp - - - |