decimal-sum.td 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. #
  10. # Test the implementation of SUM over decimals using the EXCEPT method to issue retractions
  11. #
  12. #
  13. # The name of each table corresponds to the number it stores. We use multiple tables per value in order
  14. # to prevent the optimizer from folding our UNION + EXCEPT constructs in a way that will case no
  15. # retractions to actually be processed
  16. #
  17. > CREATE TABLE "A-999999999999999999999999999999999999999" (f1 DECIMAL);
  18. > INSERT INTO "A-999999999999999999999999999999999999999" VALUES ('-999999999999999999999999999999999999999');
  19. > CREATE TABLE "A-999999999999999999999999999999999999998" (f1 DECIMAL);
  20. > INSERT INTO "A-999999999999999999999999999999999999998" VALUES ('-999999999999999999999999999999999999999');
  21. > CREATE TABLE "A+999999999999999999999999999999999999999" (f1 DECIMAL);
  22. > INSERT INTO "A+999999999999999999999999999999999999999" VALUES ('999999999999999999999999999999999999999');
  23. > CREATE TABLE "A+999999999999999999999999999999999999998" (f1 DECIMAL);
  24. > INSERT INTO "A+999999999999999999999999999999999999998" VALUES ('999999999999999999999999999999999999999');
  25. > CREATE TABLE "B-999999999999999999999999999999999999999" (f1 DECIMAL);
  26. > INSERT INTO "B-999999999999999999999999999999999999999" VALUES ('-999999999999999999999999999999999999999');
  27. > CREATE TABLE "B-999999999999999999999999999999999999998" (f1 DECIMAL);
  28. > INSERT INTO "B-999999999999999999999999999999999999998" VALUES ('-999999999999999999999999999999999999999');
  29. > CREATE TABLE "B+999999999999999999999999999999999999999" (f1 DECIMAL);
  30. > INSERT INTO "B+999999999999999999999999999999999999999" VALUES ('999999999999999999999999999999999999999');
  31. > CREATE TABLE "B+999999999999999999999999999999999999998" (f1 DECIMAL);
  32. > INSERT INTO "B+999999999999999999999999999999999999998" VALUES ('999999999999999999999999999999999999999');
  33. > CREATE TABLE "C-999999999999999999999999999999999999999" (f1 DECIMAL);
  34. > INSERT INTO "C-999999999999999999999999999999999999999" VALUES ('-999999999999999999999999999999999999999');
  35. > CREATE TABLE "C-999999999999999999999999999999999999998" (f1 DECIMAL);
  36. > INSERT INTO "C-999999999999999999999999999999999999998" VALUES ('-999999999999999999999999999999999999999');
  37. > CREATE TABLE "C+999999999999999999999999999999999999999" (f1 DECIMAL);
  38. > INSERT INTO "C+999999999999999999999999999999999999999" VALUES ('999999999999999999999999999999999999999');
  39. > CREATE TABLE "C+999999999999999999999999999999999999998" (f1 DECIMAL);
  40. > INSERT INTO "C+999999999999999999999999999999999999998" VALUES ('999999999999999999999999999999999999999');
  41. > SELECT SUM(f1) FROM (SELECT * FROM "A-999999999999999999999999999999999999999");
  42. -999999999999999999999999999999999999999
  43. > SELECT SUM(DISTINCT f1) FROM (
  44. SELECT * FROM "A-999999999999999999999999999999999999999"
  45. UNION ALL SELECT * FROM "B-999999999999999999999999999999999999999"
  46. );
  47. -999999999999999999999999999999999999999
  48. > SELECT SUM(f1) FROM (
  49. SELECT * FROM "A-999999999999999999999999999999999999999"
  50. UNION ALL SELECT * FROM "B-999999999999999999999999999999999999999"
  51. );
  52. -Infinity
  53. # Retracting the offending value causes the sum to go back within bounds
  54. > SELECT SUM(f1) FROM (
  55. SELECT * FROM "A-999999999999999999999999999999999999999"
  56. UNION ALL SELECT * FROM "B-999999999999999999999999999999999999999"
  57. EXCEPT ALL SELECT * FROM "C-999999999999999999999999999999999999999"
  58. );
  59. -999999999999999999999999999999999999999
  60. > SELECT SUM(ABS(f1)) FROM (
  61. SELECT * FROM "A-999999999999999999999999999999999999999"
  62. UNION ALL SELECT * FROM "B-999999999999999999999999999999999999999"
  63. EXCEPT ALL SELECT * FROM "C-999999999999999999999999999999999999999"
  64. );
  65. 999999999999999999999999999999999999999
  66. > CREATE TABLE "A+0.000000000000000000000000000000000000001" (f1 DECIMAL);
  67. > INSERT INTO "A+0.000000000000000000000000000000000000001" VALUES ('0.000000000000000000000000000000000000001');
  68. > CREATE TABLE "B+0.000000000000000000000000000000000000001" (f1 DECIMAL);
  69. > INSERT INTO "B+0.000000000000000000000000000000000000001" VALUES ('0.000000000000000000000000000000000000001');
  70. > CREATE TABLE "C+0.000000000000000000000000000000000000001" (f1 DECIMAL);
  71. > INSERT INTO "C+0.000000000000000000000000000000000000001" VALUES ('0.000000000000000000000000000000000000001');
  72. > SELECT SUM(f1) FROM (
  73. SELECT * FROM "A+0.000000000000000000000000000000000000001"
  74. UNION ALL SELECT * FROM "B+0.000000000000000000000000000000000000001"
  75. );
  76. 0.000000000000000000000000000000000000002
  77. > SELECT SUM(f1) FROM (
  78. SELECT * FROM "A+0.000000000000000000000000000000000000001"
  79. UNION ALL SELECT * FROM "B+0.000000000000000000000000000000000000001"
  80. EXCEPT ALL SELECT * FROM "C+0.000000000000000000000000000000000000001"
  81. );
  82. 0.000000000000000000000000000000000000001
  83. > SELECT SUM(f1) FROM (
  84. SELECT f1 FROM "A+0.000000000000000000000000000000000000001"
  85. UNION ALL SELECT -f1 FROM "B+0.000000000000000000000000000000000000001"
  86. );
  87. 0
  88. > SELECT SUM(f1) FROM (
  89. SELECT f1 FROM "A+0.000000000000000000000000000000000000001"
  90. UNION ALL SELECT -f1 FROM "B+0.000000000000000000000000000000000000001"
  91. EXCEPT ALL SELECT -f1 FROM "C+0.000000000000000000000000000000000000001"
  92. );
  93. 0.000000000000000000000000000000000000001
  94. > SELECT SUM(f1) FROM (
  95. SELECT f1 FROM "A+0.000000000000000000000000000000000000001"
  96. UNION ALL SELECT -f1 FROM "B+0.000000000000000000000000000000000000001"
  97. EXCEPT ALL SELECT f1 FROM "C+0.000000000000000000000000000000000000001"
  98. );
  99. -0.000000000000000000000000000000000000001