Unix Technical Forum

SEO

vBulletin Search Engine Optimization


Go Back   Unix Technical Forum > Database Server Software > PostgreSQL > pgsql Bugs

Register FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 04-10-2008, 10:03 AM
John Rylander
 
Posts: n/a
Default BUG #2477: Aggregate Integer divisors incorrectly yield integer-type quotient


The following bug has been logged online:

Bug reference: 2477
Logged by: John Rylander
Email address: rylander@prolexia.com
PostgreSQL version: 8.1.4
Operating system: Windows XP
Description: Aggregate Integer divisors incorrectly yield
integer-type quotient
Details:

When for some reason I did a sum/count instead of an avg, the result was
always an integer (either 0 or 1):

Sum(
Case when Sign(Delta)=Sign(AvgDelta) then
1
else
0
) / Count(*) as HitRate;

If I use "/ Count(*)::float4", or use Avg instead of Sum/Count, it works
fine.

Yet another maddening PostgreSQL bug/idiosyncrasy. Time for this boy to go
to Oracle (not because of this, but because of the function->transaction
problem, such that a function that has nested loops that create myriad
temporary analytical tables necessarily runs out of disk space; if it
weren't for the mandatory and completely counterproductive implicit
transaction, it'd take very little space and a lot less time).

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #2 (permalink)  
Old 04-10-2008, 10:03 AM
Tom Lane
 
Posts: n/a
Default Re: BUG #2477: Aggregate Integer divisors incorrectly yield integer-type quotient

"John Rylander" <rylander@prolexia.com> writes:
> When for some reason I did a sum/count instead of an avg, the result was
> always an integer (either 0 or 1):


What's your point? Postgres has always defined division of integers as
yielding an integer result. AFAICS this choice is fully sanctioned by
the SQL standard:

1) If the data type of both operands of a dyadic arithmetic opera-
tor is exact numeric, then the data type of the result is exact
numeric, with precision and scale determined as follows:
...
d) The precision and scale of the result of division is
implementation-defined.

(SQL92 6.12 <numeric value expression> syntax rule 1)

> Yet another maddening PostgreSQL bug/idiosyncrasy. Time for this boy to go
> to Oracle


Sayonara. Last I checked, they had a few idiosyncrasies too.

regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #3 (permalink)  
Old 04-10-2008, 10:03 AM
Jim C. Nasby
 
Posts: n/a
Default Re: BUG #2477: Aggregate Integer divisors incorrectly yield integer-type quotient

On Sun, Jun 11, 2006 at 09:08:00PM +0000, John Rylander wrote:
>
> The following bug has been logged online:
>
> Bug reference: 2477
> Logged by: John Rylander
> Email address: rylander@prolexia.com
> PostgreSQL version: 8.1.4
> Operating system: Windows XP
> Description: Aggregate Integer divisors incorrectly yield
> integer-type quotient
> Details:
>
> When for some reason I did a sum/count instead of an avg, the result was
> always an integer (either 0 or 1):
>
> Sum(
> Case when Sign(Delta)=Sign(AvgDelta) then
> 1
> else
> 0
> ) / Count(*) as HitRate;
>
> If I use "/ Count(*)::float4", or use Avg instead of Sum/Count, it works
> fine.


Do you have a test case for this?

> Yet another maddening PostgreSQL bug/idiosyncrasy. Time for this boy to go
> to Oracle (not because of this, but because of the function->transaction
> problem, such that a function that has nested loops that create myriad
> temporary analytical tables necessarily runs out of disk space; if it
> weren't for the mandatory and completely counterproductive implicit
> transaction, it'd take very little space and a lot less time).


Huh? What implicit transaction? Do you have an example that illustrates
this problem?
--
Jim C. Nasby, Sr. Engineering Consultant jnasby@pervasive.com
Pervasive Software http://pervasive.com work: 512-231-6117
vcard: http://jim.nasby.net/pervasive.vcf cell: 512-569-9461

---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #4 (permalink)  
Old 04-10-2008, 10:03 AM
John E. Rylander
 
Posts: n/a
Default Re: BUG #2477: Aggregate Integer divisors incorrectly yield integer-type quotient

Jim,

First, I got a minor rebuke from Tom Lane on this matter, he rightly
pointing out to me that this integer division "bug" is in fact a part of the
SQL standard. For the simplest illustration of it, try this:

Select 2/3;

It comes back with zero! To me, this is unbelievable; but it's not a bug,
and it's not PostgreSQL's fault, as it were. As Tom put it:

>What's your point? Postgres has always defined division of integers as
>yielding an integer result. AFAICS this choice is fully sanctioned by
>the SQL standard:
>
> 1) If the data type of both operands of a dyadic arithmetic opera-
> tor is exact numeric, then the data type of the result is exact
> numeric, with precision and scale determined as follows:
> ...
> d) The precision and scale of the result of division is
> implementation-defined.


I suppose point d) leaves PostgreSQL developers some freedom here, but it
also, particularly when combined with 1), gives an apparent okay to what is
done now. (After all, the result is "exact", even if it's exactly wrong!
)

It's interesting that this isn't wholly consistent: the AVG aggregate, e.g.,
doesn't follow this rule in the same way, even though it's strictly composed
of such dyadic operations-and it's a good thing, too.

I reported this as a bug because I never considered the possibility that
this could be by design. Truncating or rounding to an integer manually, or
when assigning a floating point value to an integer variable or field, sure;
but doing it that way even when assigning the result to a floating point
field? I have no idea why this is considered desirable, and have to wonder
if that's the best way of interpreting the standard, but I'm an SQL and
(hence) PostgreSQL newbie, so....


Second, and this is the real showstopper for me, it's my understanding that
PostgreSQL (unlike, I've read, most other SQL RDBMS) implicitly and
necessarily wraps every user-defined function call in a transactional
wrapper. Typically, this seems like a sound approach-no worries then when a
function fails. But when it's mandatory, one runs into problems with highly
query-intensive and analytical functions. I have a PL/PGSQL analytical
function that iteratively drops a table, queries to create a new table of
the same name based on iterated parameters, and then runs numerous queries
on the resulting table, storing a few summary records to a log table. The
nested loops in the function intelligently iterate tens or hundreds of
thousands of times on tables containing tens or low-hundreds of thousands of
records.
The problem is, I think, since this function is involuntarily
wrapped in a transaction, PostgreSQL wastes a TON of time and space keeping
track of every single interim table, and eventually (pretty soon, in fact)
it runs out of disk space. (I have only 20 GB free, but the same thing
might happen if I had 200 GB free.)
This involuntary transaction wrapping has another serious downside:
it makes debugging functions harder, since one can't do any table-based
"bomb damage assessment" when a function blows up-the target site is all
cleaned up (i.e., rolled back) before one can take a look.
(I've read that Oracle does NOT do this; OTOH, since Oracle does (I
believe) wrap each SQL statement in a transactional wrapper, then it seems a
bit ambiguous as to how that applies to an SQL statement that calls a stored
procedure. I sure HOPE that it doesn't wrap the call in a transaction,
however appealing that might be at first glance!)

If I'm misunderstanding things, I'd greatly appreciate correction on these
matters! As it is now, I may need painfully to switch to Oracle just to
get my analytical functions to work properly on anything but very small
scale tables-otherwise I just run of out disk space a small part of the way
through.

Thanks for any guidance you can offer on this-I'd love to stick with
PostgreSQL!

Best regards,

John Rylander


-----Original Message-----
From: Jim C. Nasby [mailto:jnasby@pervasive.com]
Sent: Monday, June 12, 2006 10:48 AM
To: John Rylander
Cc: pgsql-bugs@postgresql.org
Subject: Re: [BUGS] BUG #2477: Aggregate Integer divisors incorrectly yield
integer-type quotient

On Sun, Jun 11, 2006 at 09:08:00PM +0000, John Rylander wrote:
>
> The following bug has been logged online:
>
> Bug reference: 2477
> Logged by: John Rylander
> Email address: rylander@prolexia.com
> PostgreSQL version: 8.1.4
> Operating system: Windows XP
> Description: Aggregate Integer divisors incorrectly yield
> integer-type quotient
> Details:
>
> When for some reason I did a sum/count instead of an avg, the result was
> always an integer (either 0 or 1):
>
> Sum(
> Case when Sign(Delta)=Sign(AvgDelta) then
> 1
> else
> 0
> ) / Count(*) as HitRate;
>
> If I use "/ Count(*)::float4", or use Avg instead of Sum/Count, it works
> fine.


Do you have a test case for this?

> Yet another maddening PostgreSQL bug/idiosyncrasy. Time for this boy to

go
> to Oracle (not because of this, but because of the function->transaction
> problem, such that a function that has nested loops that create myriad
> temporary analytical tables necessarily runs out of disk space; if it
> weren't for the mandatory and completely counterproductive implicit
> transaction, it'd take very little space and a lot less time).


Huh? What implicit transaction? Do you have an example that illustrates
this problem?
--
Jim C. Nasby, Sr. Engineering Consultant jnasby@pervasive.com
Pervasive Software http://pervasive.com work: 512-231-6117
vcard: http://jim.nasby.net/pervasive.vcf cell: 512-569-9461


---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
choose an index scan if your joining column's datatypes do not
match

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #5 (permalink)  
Old 04-10-2008, 10:03 AM
Tom Lane
 
Posts: n/a
Default Re: BUG #2477: Aggregate Integer divisors incorrectly yield integer-type quotient

"John E. Rylander" <rylander@prolexia.com> writes:
> ... I have a PL/PGSQL analytical
> function that iteratively drops a table, queries to create a new table of
> the same name based on iterated parameters, and then runs numerous queries
> on the resulting table, storing a few summary records to a log table. The
> nested loops in the function intelligently iterate tens or hundreds of
> thousands of times on tables containing tens or low-hundreds of thousands of
> records.
> The problem is, I think, since this function is involuntarily
> wrapped in a transaction, PostgreSQL wastes a TON of time and space keeping
> track of every single interim table, and eventually (pretty soon, in fact)
> it runs out of disk space.


It might be possible to teach the system that it could immediately
unlink the table file when dropping a table that was created in the
current transaction. See the NOTE in smgrscheduleunlink() for a hint
about one way to do it. I think you'd have to worry about matching
subtransaction nest levels, but if they're the same then allowing
inverse unlink requests to "blow each other up" would work.

regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump


All times are GMT. The time now is 10:25 AM.


Powered by vBulletin® Version 3.6.5
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.2.0
UnixAdminTalk.com

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836