numeric.sql 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365
  1. --
  2. -- NUMERIC
  3. --
  4. CREATE TABLE num_data (id int4, val numeric(210,10));
  5. CREATE TABLE num_exp_add (id1 int4, id2 int4, expected numeric(210,10));
  6. CREATE TABLE num_exp_sub (id1 int4, id2 int4, expected numeric(210,10));
  7. CREATE TABLE num_exp_div (id1 int4, id2 int4, expected numeric(210,10));
  8. CREATE TABLE num_exp_mul (id1 int4, id2 int4, expected numeric(210,10));
  9. CREATE TABLE num_exp_sqrt (id int4, expected numeric(210,10));
  10. CREATE TABLE num_exp_ln (id int4, expected numeric(210,10));
  11. CREATE TABLE num_exp_log10 (id int4, expected numeric(210,10));
  12. CREATE TABLE num_exp_power_10_ln (id int4, expected numeric(210,10));
  13. CREATE TABLE num_result (id1 int4, id2 int4, result numeric(210,10));
  14. -- ******************************
  15. -- * The following EXPECTED results are computed by bc(1)
  16. -- * with a scale of 200
  17. -- ******************************
  18. BEGIN TRANSACTION;
  19. INSERT INTO num_exp_add VALUES (0,0,'0');
  20. INSERT INTO num_exp_sub VALUES (0,0,'0');
  21. INSERT INTO num_exp_mul VALUES (0,0,'0');
  22. INSERT INTO num_exp_div VALUES (0,0,'NaN');
  23. INSERT INTO num_exp_add VALUES (0,1,'0');
  24. INSERT INTO num_exp_sub VALUES (0,1,'0');
  25. INSERT INTO num_exp_mul VALUES (0,1,'0');
  26. INSERT INTO num_exp_div VALUES (0,1,'NaN');
  27. INSERT INTO num_exp_add VALUES (0,2,'-34338492.215397047');
  28. INSERT INTO num_exp_sub VALUES (0,2,'34338492.215397047');
  29. INSERT INTO num_exp_mul VALUES (0,2,'0');
  30. INSERT INTO num_exp_div VALUES (0,2,'0');
  31. INSERT INTO num_exp_add VALUES (0,3,'4.31');
  32. INSERT INTO num_exp_sub VALUES (0,3,'-4.31');
  33. INSERT INTO num_exp_mul VALUES (0,3,'0');
  34. INSERT INTO num_exp_div VALUES (0,3,'0');
  35. INSERT INTO num_exp_add VALUES (0,4,'7799461.4119');
  36. INSERT INTO num_exp_sub VALUES (0,4,'-7799461.4119');
  37. INSERT INTO num_exp_mul VALUES (0,4,'0');
  38. INSERT INTO num_exp_div VALUES (0,4,'0');
  39. INSERT INTO num_exp_add VALUES (0,5,'16397.038491');
  40. INSERT INTO num_exp_sub VALUES (0,5,'-16397.038491');
  41. INSERT INTO num_exp_mul VALUES (0,5,'0');
  42. INSERT INTO num_exp_div VALUES (0,5,'0');
  43. INSERT INTO num_exp_add VALUES (0,6,'93901.57763026');
  44. INSERT INTO num_exp_sub VALUES (0,6,'-93901.57763026');
  45. INSERT INTO num_exp_mul VALUES (0,6,'0');
  46. INSERT INTO num_exp_div VALUES (0,6,'0');
  47. INSERT INTO num_exp_add VALUES (0,7,'-83028485');
  48. INSERT INTO num_exp_sub VALUES (0,7,'83028485');
  49. INSERT INTO num_exp_mul VALUES (0,7,'0');
  50. INSERT INTO num_exp_div VALUES (0,7,'0');
  51. INSERT INTO num_exp_add VALUES (0,8,'74881');
  52. INSERT INTO num_exp_sub VALUES (0,8,'-74881');
  53. INSERT INTO num_exp_mul VALUES (0,8,'0');
  54. INSERT INTO num_exp_div VALUES (0,8,'0');
  55. INSERT INTO num_exp_add VALUES (0,9,'-24926804.045047420');
  56. INSERT INTO num_exp_sub VALUES (0,9,'24926804.045047420');
  57. INSERT INTO num_exp_mul VALUES (0,9,'0');
  58. INSERT INTO num_exp_div VALUES (0,9,'0');
  59. INSERT INTO num_exp_add VALUES (1,0,'0');
  60. INSERT INTO num_exp_sub VALUES (1,0,'0');
  61. INSERT INTO num_exp_mul VALUES (1,0,'0');
  62. INSERT INTO num_exp_div VALUES (1,0,'NaN');
  63. INSERT INTO num_exp_add VALUES (1,1,'0');
  64. INSERT INTO num_exp_sub VALUES (1,1,'0');
  65. INSERT INTO num_exp_mul VALUES (1,1,'0');
  66. INSERT INTO num_exp_div VALUES (1,1,'NaN');
  67. INSERT INTO num_exp_add VALUES (1,2,'-34338492.215397047');
  68. INSERT INTO num_exp_sub VALUES (1,2,'34338492.215397047');
  69. INSERT INTO num_exp_mul VALUES (1,2,'0');
  70. INSERT INTO num_exp_div VALUES (1,2,'0');
  71. INSERT INTO num_exp_add VALUES (1,3,'4.31');
  72. INSERT INTO num_exp_sub VALUES (1,3,'-4.31');
  73. INSERT INTO num_exp_mul VALUES (1,3,'0');
  74. INSERT INTO num_exp_div VALUES (1,3,'0');
  75. INSERT INTO num_exp_add VALUES (1,4,'7799461.4119');
  76. INSERT INTO num_exp_sub VALUES (1,4,'-7799461.4119');
  77. INSERT INTO num_exp_mul VALUES (1,4,'0');
  78. INSERT INTO num_exp_div VALUES (1,4,'0');
  79. INSERT INTO num_exp_add VALUES (1,5,'16397.038491');
  80. INSERT INTO num_exp_sub VALUES (1,5,'-16397.038491');
  81. INSERT INTO num_exp_mul VALUES (1,5,'0');
  82. INSERT INTO num_exp_div VALUES (1,5,'0');
  83. INSERT INTO num_exp_add VALUES (1,6,'93901.57763026');
  84. INSERT INTO num_exp_sub VALUES (1,6,'-93901.57763026');
  85. INSERT INTO num_exp_mul VALUES (1,6,'0');
  86. INSERT INTO num_exp_div VALUES (1,6,'0');
  87. INSERT INTO num_exp_add VALUES (1,7,'-83028485');
  88. INSERT INTO num_exp_sub VALUES (1,7,'83028485');
  89. INSERT INTO num_exp_mul VALUES (1,7,'0');
  90. INSERT INTO num_exp_div VALUES (1,7,'0');
  91. INSERT INTO num_exp_add VALUES (1,8,'74881');
  92. INSERT INTO num_exp_sub VALUES (1,8,'-74881');
  93. INSERT INTO num_exp_mul VALUES (1,8,'0');
  94. INSERT INTO num_exp_div VALUES (1,8,'0');
  95. INSERT INTO num_exp_add VALUES (1,9,'-24926804.045047420');
  96. INSERT INTO num_exp_sub VALUES (1,9,'24926804.045047420');
  97. INSERT INTO num_exp_mul VALUES (1,9,'0');
  98. INSERT INTO num_exp_div VALUES (1,9,'0');
  99. INSERT INTO num_exp_add VALUES (2,0,'-34338492.215397047');
  100. INSERT INTO num_exp_sub VALUES (2,0,'-34338492.215397047');
  101. INSERT INTO num_exp_mul VALUES (2,0,'0');
  102. INSERT INTO num_exp_div VALUES (2,0,'NaN');
  103. INSERT INTO num_exp_add VALUES (2,1,'-34338492.215397047');
  104. INSERT INTO num_exp_sub VALUES (2,1,'-34338492.215397047');
  105. INSERT INTO num_exp_mul VALUES (2,1,'0');
  106. INSERT INTO num_exp_div VALUES (2,1,'NaN');
  107. INSERT INTO num_exp_add VALUES (2,2,'-68676984.430794094');
  108. INSERT INTO num_exp_sub VALUES (2,2,'0');
  109. INSERT INTO num_exp_mul VALUES (2,2,'1179132047626883.596862135856320209');
  110. INSERT INTO num_exp_div VALUES (2,2,'1.00000000000000000000');
  111. INSERT INTO num_exp_add VALUES (2,3,'-34338487.905397047');
  112. INSERT INTO num_exp_sub VALUES (2,3,'-34338496.525397047');
  113. INSERT INTO num_exp_mul VALUES (2,3,'-147998901.44836127257');
  114. INSERT INTO num_exp_div VALUES (2,3,'-7967167.56737750510440835266');
  115. INSERT INTO num_exp_add VALUES (2,4,'-26539030.803497047');
  116. INSERT INTO num_exp_sub VALUES (2,4,'-42137953.627297047');
  117. INSERT INTO num_exp_mul VALUES (2,4,'-267821744976817.8111137106593');
  118. INSERT INTO num_exp_div VALUES (2,4,'-4.40267480046830116685');
  119. INSERT INTO num_exp_add VALUES (2,5,'-34322095.176906047');
  120. INSERT INTO num_exp_sub VALUES (2,5,'-34354889.253888047');
  121. INSERT INTO num_exp_mul VALUES (2,5,'-563049578578.769242506736077');
  122. INSERT INTO num_exp_div VALUES (2,5,'-2094.18866914563535496429');
  123. INSERT INTO num_exp_add VALUES (2,6,'-34244590.637766787');
  124. INSERT INTO num_exp_sub VALUES (2,6,'-34432393.793027307');
  125. INSERT INTO num_exp_mul VALUES (2,6,'-3224438592470.18449811926184222');
  126. INSERT INTO num_exp_div VALUES (2,6,'-365.68599891479766440940');
  127. INSERT INTO num_exp_add VALUES (2,7,'-117366977.215397047');
  128. INSERT INTO num_exp_sub VALUES (2,7,'48689992.784602953');
  129. INSERT INTO num_exp_mul VALUES (2,7,'2851072985828710.485883795');
  130. INSERT INTO num_exp_div VALUES (2,7,'.41357483778485235518');
  131. INSERT INTO num_exp_add VALUES (2,8,'-34263611.215397047');
  132. INSERT INTO num_exp_sub VALUES (2,8,'-34413373.215397047');
  133. INSERT INTO num_exp_mul VALUES (2,8,'-2571300635581.146276407');
  134. INSERT INTO num_exp_div VALUES (2,8,'-458.57416721727870888476');
  135. INSERT INTO num_exp_add VALUES (2,9,'-59265296.260444467');
  136. INSERT INTO num_exp_sub VALUES (2,9,'-9411688.170349627');
  137. INSERT INTO num_exp_mul VALUES (2,9,'855948866655588.453741509242968740');
  138. INSERT INTO num_exp_div VALUES (2,9,'1.37757299946438931811');
  139. INSERT INTO num_exp_add VALUES (3,0,'4.31');
  140. INSERT INTO num_exp_sub VALUES (3,0,'4.31');
  141. INSERT INTO num_exp_mul VALUES (3,0,'0');
  142. INSERT INTO num_exp_div VALUES (3,0,'NaN');
  143. INSERT INTO num_exp_add VALUES (3,1,'4.31');
  144. INSERT INTO num_exp_sub VALUES (3,1,'4.31');
  145. INSERT INTO num_exp_mul VALUES (3,1,'0');
  146. INSERT INTO num_exp_div VALUES (3,1,'NaN');
  147. INSERT INTO num_exp_add VALUES (3,2,'-34338487.905397047');
  148. INSERT INTO num_exp_sub VALUES (3,2,'34338496.525397047');
  149. INSERT INTO num_exp_mul VALUES (3,2,'-147998901.44836127257');
  150. INSERT INTO num_exp_div VALUES (3,2,'-.00000012551512084352');
  151. INSERT INTO num_exp_add VALUES (3,3,'8.62');
  152. INSERT INTO num_exp_sub VALUES (3,3,'0');
  153. INSERT INTO num_exp_mul VALUES (3,3,'18.5761');
  154. INSERT INTO num_exp_div VALUES (3,3,'1.00000000000000000000');
  155. INSERT INTO num_exp_add VALUES (3,4,'7799465.7219');
  156. INSERT INTO num_exp_sub VALUES (3,4,'-7799457.1019');
  157. INSERT INTO num_exp_mul VALUES (3,4,'33615678.685289');
  158. INSERT INTO num_exp_div VALUES (3,4,'.00000055260225961552');
  159. INSERT INTO num_exp_add VALUES (3,5,'16401.348491');
  160. INSERT INTO num_exp_sub VALUES (3,5,'-16392.728491');
  161. INSERT INTO num_exp_mul VALUES (3,5,'70671.23589621');
  162. INSERT INTO num_exp_div VALUES (3,5,'.00026285234387695504');
  163. INSERT INTO num_exp_add VALUES (3,6,'93905.88763026');
  164. INSERT INTO num_exp_sub VALUES (3,6,'-93897.26763026');
  165. INSERT INTO num_exp_mul VALUES (3,6,'404715.7995864206');
  166. INSERT INTO num_exp_div VALUES (3,6,'.00004589912234457595');
  167. INSERT INTO num_exp_add VALUES (3,7,'-83028480.69');
  168. INSERT INTO num_exp_sub VALUES (3,7,'83028489.31');
  169. INSERT INTO num_exp_mul VALUES (3,7,'-357852770.35');
  170. INSERT INTO num_exp_div VALUES (3,7,'-.00000005190989574240');
  171. INSERT INTO num_exp_add VALUES (3,8,'74885.31');
  172. INSERT INTO num_exp_sub VALUES (3,8,'-74876.69');
  173. INSERT INTO num_exp_mul VALUES (3,8,'322737.11');
  174. INSERT INTO num_exp_div VALUES (3,8,'.00005755799201399553');
  175. INSERT INTO num_exp_add VALUES (3,9,'-24926799.735047420');
  176. INSERT INTO num_exp_sub VALUES (3,9,'24926808.355047420');
  177. INSERT INTO num_exp_mul VALUES (3,9,'-107434525.43415438020');
  178. INSERT INTO num_exp_div VALUES (3,9,'-.00000017290624149854');
  179. INSERT INTO num_exp_add VALUES (4,0,'7799461.4119');
  180. INSERT INTO num_exp_sub VALUES (4,0,'7799461.4119');
  181. INSERT INTO num_exp_mul VALUES (4,0,'0');
  182. INSERT INTO num_exp_div VALUES (4,0,'NaN');
  183. INSERT INTO num_exp_add VALUES (4,1,'7799461.4119');
  184. INSERT INTO num_exp_sub VALUES (4,1,'7799461.4119');
  185. INSERT INTO num_exp_mul VALUES (4,1,'0');
  186. INSERT INTO num_exp_div VALUES (4,1,'NaN');
  187. INSERT INTO num_exp_add VALUES (4,2,'-26539030.803497047');
  188. INSERT INTO num_exp_sub VALUES (4,2,'42137953.627297047');
  189. INSERT INTO num_exp_mul VALUES (4,2,'-267821744976817.8111137106593');
  190. INSERT INTO num_exp_div VALUES (4,2,'-.22713465002993920385');
  191. INSERT INTO num_exp_add VALUES (4,3,'7799465.7219');
  192. INSERT INTO num_exp_sub VALUES (4,3,'7799457.1019');
  193. INSERT INTO num_exp_mul VALUES (4,3,'33615678.685289');
  194. INSERT INTO num_exp_div VALUES (4,3,'1809619.81714617169373549883');
  195. INSERT INTO num_exp_add VALUES (4,4,'15598922.8238');
  196. INSERT INTO num_exp_sub VALUES (4,4,'0');
  197. INSERT INTO num_exp_mul VALUES (4,4,'60831598315717.14146161');
  198. INSERT INTO num_exp_div VALUES (4,4,'1.00000000000000000000');
  199. INSERT INTO num_exp_add VALUES (4,5,'7815858.450391');
  200. INSERT INTO num_exp_sub VALUES (4,5,'7783064.373409');
  201. INSERT INTO num_exp_mul VALUES (4,5,'127888068979.9935054429');
  202. INSERT INTO num_exp_div VALUES (4,5,'475.66281046305802686061');
  203. INSERT INTO num_exp_add VALUES (4,6,'7893362.98953026');
  204. INSERT INTO num_exp_sub VALUES (4,6,'7705559.83426974');
  205. INSERT INTO num_exp_mul VALUES (4,6,'732381731243.745115764094');
  206. INSERT INTO num_exp_div VALUES (4,6,'83.05996138436129499606');
  207. INSERT INTO num_exp_add VALUES (4,7,'-75229023.5881');
  208. INSERT INTO num_exp_sub VALUES (4,7,'90827946.4119');
  209. INSERT INTO num_exp_mul VALUES (4,7,'-647577464846017.9715');
  210. INSERT INTO num_exp_div VALUES (4,7,'-.09393717604145131637');
  211. INSERT INTO num_exp_add VALUES (4,8,'7874342.4119');
  212. INSERT INTO num_exp_sub VALUES (4,8,'7724580.4119');
  213. INSERT INTO num_exp_mul VALUES (4,8,'584031469984.4839');
  214. INSERT INTO num_exp_div VALUES (4,8,'104.15808298366741897143');
  215. INSERT INTO num_exp_add VALUES (4,9,'-17127342.633147420');
  216. INSERT INTO num_exp_sub VALUES (4,9,'32726265.456947420');
  217. INSERT INTO num_exp_mul VALUES (4,9,'-194415646271340.1815956522980');
  218. INSERT INTO num_exp_div VALUES (4,9,'-.31289456112403769409');
  219. INSERT INTO num_exp_add VALUES (5,0,'16397.038491');
  220. INSERT INTO num_exp_sub VALUES (5,0,'16397.038491');
  221. INSERT INTO num_exp_mul VALUES (5,0,'0');
  222. INSERT INTO num_exp_div VALUES (5,0,'NaN');
  223. INSERT INTO num_exp_add VALUES (5,1,'16397.038491');
  224. INSERT INTO num_exp_sub VALUES (5,1,'16397.038491');
  225. INSERT INTO num_exp_mul VALUES (5,1,'0');
  226. INSERT INTO num_exp_div VALUES (5,1,'NaN');
  227. INSERT INTO num_exp_add VALUES (5,2,'-34322095.176906047');
  228. INSERT INTO num_exp_sub VALUES (5,2,'34354889.253888047');
  229. INSERT INTO num_exp_mul VALUES (5,2,'-563049578578.769242506736077');
  230. INSERT INTO num_exp_div VALUES (5,2,'-.00047751189505192446');
  231. INSERT INTO num_exp_add VALUES (5,3,'16401.348491');
  232. INSERT INTO num_exp_sub VALUES (5,3,'16392.728491');
  233. INSERT INTO num_exp_mul VALUES (5,3,'70671.23589621');
  234. INSERT INTO num_exp_div VALUES (5,3,'3804.41728329466357308584');
  235. INSERT INTO num_exp_add VALUES (5,4,'7815858.450391');
  236. INSERT INTO num_exp_sub VALUES (5,4,'-7783064.373409');
  237. INSERT INTO num_exp_mul VALUES (5,4,'127888068979.9935054429');
  238. INSERT INTO num_exp_div VALUES (5,4,'.00210232958726897192');
  239. INSERT INTO num_exp_add VALUES (5,5,'32794.076982');
  240. INSERT INTO num_exp_sub VALUES (5,5,'0');
  241. INSERT INTO num_exp_mul VALUES (5,5,'268862871.275335557081');
  242. INSERT INTO num_exp_div VALUES (5,5,'1.00000000000000000000');
  243. INSERT INTO num_exp_add VALUES (5,6,'110298.61612126');
  244. INSERT INTO num_exp_sub VALUES (5,6,'-77504.53913926');
  245. INSERT INTO num_exp_mul VALUES (5,6,'1539707782.76899778633766');
  246. INSERT INTO num_exp_div VALUES (5,6,'.17461941433576102689');
  247. INSERT INTO num_exp_add VALUES (5,7,'-83012087.961509');
  248. INSERT INTO num_exp_sub VALUES (5,7,'83044882.038491');
  249. INSERT INTO num_exp_mul VALUES (5,7,'-1361421264394.416135');
  250. INSERT INTO num_exp_div VALUES (5,7,'-.00019748690453643710');
  251. INSERT INTO num_exp_add VALUES (5,8,'91278.038491');
  252. INSERT INTO num_exp_sub VALUES (5,8,'-58483.961509');
  253. INSERT INTO num_exp_mul VALUES (5,8,'1227826639.244571');
  254. INSERT INTO num_exp_div VALUES (5,8,'.21897461960978085228');
  255. INSERT INTO num_exp_add VALUES (5,9,'-24910407.006556420');
  256. INSERT INTO num_exp_sub VALUES (5,9,'24943201.083538420');
  257. INSERT INTO num_exp_mul VALUES (5,9,'-408725765384.257043660243220');
  258. INSERT INTO num_exp_div VALUES (5,9,'-.00065780749354660427');
  259. INSERT INTO num_exp_add VALUES (6,0,'93901.57763026');
  260. INSERT INTO num_exp_sub VALUES (6,0,'93901.57763026');
  261. INSERT INTO num_exp_mul VALUES (6,0,'0');
  262. INSERT INTO num_exp_div VALUES (6,0,'NaN');
  263. INSERT INTO num_exp_add VALUES (6,1,'93901.57763026');
  264. INSERT INTO num_exp_sub VALUES (6,1,'93901.57763026');
  265. INSERT INTO num_exp_mul VALUES (6,1,'0');
  266. INSERT INTO num_exp_div VALUES (6,1,'NaN');
  267. INSERT INTO num_exp_add VALUES (6,2,'-34244590.637766787');
  268. INSERT INTO num_exp_sub VALUES (6,2,'34432393.793027307');
  269. INSERT INTO num_exp_mul VALUES (6,2,'-3224438592470.18449811926184222');
  270. INSERT INTO num_exp_div VALUES (6,2,'-.00273458651128995823');
  271. INSERT INTO num_exp_add VALUES (6,3,'93905.88763026');
  272. INSERT INTO num_exp_sub VALUES (6,3,'93897.26763026');
  273. INSERT INTO num_exp_mul VALUES (6,3,'404715.7995864206');
  274. INSERT INTO num_exp_div VALUES (6,3,'21786.90896293735498839907');
  275. INSERT INTO num_exp_add VALUES (6,4,'7893362.98953026');
  276. INSERT INTO num_exp_sub VALUES (6,4,'-7705559.83426974');
  277. INSERT INTO num_exp_mul VALUES (6,4,'732381731243.745115764094');
  278. INSERT INTO num_exp_div VALUES (6,4,'.01203949512295682469');
  279. INSERT INTO num_exp_add VALUES (6,5,'110298.61612126');
  280. INSERT INTO num_exp_sub VALUES (6,5,'77504.53913926');
  281. INSERT INTO num_exp_mul VALUES (6,5,'1539707782.76899778633766');
  282. INSERT INTO num_exp_div VALUES (6,5,'5.72674008674192359679');
  283. INSERT INTO num_exp_add VALUES (6,6,'187803.15526052');
  284. INSERT INTO num_exp_sub VALUES (6,6,'0');
  285. INSERT INTO num_exp_mul VALUES (6,6,'8817506281.4517452372676676');
  286. INSERT INTO num_exp_div VALUES (6,6,'1.00000000000000000000');
  287. INSERT INTO num_exp_add VALUES (6,7,'-82934583.42236974');
  288. INSERT INTO num_exp_sub VALUES (6,7,'83122386.57763026');
  289. INSERT INTO num_exp_mul VALUES (6,7,'-7796505729750.37795610');
  290. INSERT INTO num_exp_div VALUES (6,7,'-.00113095617281538980');
  291. INSERT INTO num_exp_add VALUES (6,8,'168782.57763026');
  292. INSERT INTO num_exp_sub VALUES (6,8,'19020.57763026');
  293. INSERT INTO num_exp_mul VALUES (6,8,'7031444034.53149906');
  294. INSERT INTO num_exp_div VALUES (6,8,'1.25401073209839612184');
  295. INSERT INTO num_exp_add VALUES (6,9,'-24832902.467417160');
  296. INSERT INTO num_exp_sub VALUES (6,9,'25020705.622677680');
  297. INSERT INTO num_exp_mul VALUES (6,9,'-2340666225110.29929521292692920');
  298. INSERT INTO num_exp_div VALUES (6,9,'-.00376709254265256789');
  299. INSERT INTO num_exp_add VALUES (7,0,'-83028485');
  300. INSERT INTO num_exp_sub VALUES (7,0,'-83028485');
  301. INSERT INTO num_exp_mul VALUES (7,0,'0');
  302. INSERT INTO num_exp_div VALUES (7,0,'NaN');
  303. INSERT INTO num_exp_add VALUES (7,1,'-83028485');
  304. INSERT INTO num_exp_sub VALUES (7,1,'-83028485');
  305. INSERT INTO num_exp_mul VALUES (7,1,'0');
  306. INSERT INTO num_exp_div VALUES (7,1,'NaN');
  307. INSERT INTO num_exp_add VALUES (7,2,'-117366977.215397047');
  308. INSERT INTO num_exp_sub VALUES (7,2,'-48689992.784602953');
  309. INSERT INTO num_exp_mul VALUES (7,2,'2851072985828710.485883795');
  310. INSERT INTO num_exp_div VALUES (7,2,'2.41794207151503385700');
  311. INSERT INTO num_exp_add VALUES (7,3,'-83028480.69');
  312. INSERT INTO num_exp_sub VALUES (7,3,'-83028489.31');
  313. INSERT INTO num_exp_mul VALUES (7,3,'-357852770.35');
  314. INSERT INTO num_exp_div VALUES (7,3,'-19264149.65197215777262180974');
  315. INSERT INTO num_exp_add VALUES (7,4,'-75229023.5881');
  316. INSERT INTO num_exp_sub VALUES (7,4,'-90827946.4119');
  317. INSERT INTO num_exp_mul VALUES (7,4,'-647577464846017.9715');
  318. INSERT INTO num_exp_div VALUES (7,4,'-10.64541262725136247686');
  319. INSERT INTO num_exp_add VALUES (7,5,'-83012087.961509');
  320. INSERT INTO num_exp_sub VALUES (7,5,'-83044882.038491');
  321. INSERT INTO num_exp_mul VALUES (7,5,'-1361421264394.416135');
  322. INSERT INTO num_exp_div VALUES (7,5,'-5063.62688881730941836574');
  323. INSERT INTO num_exp_add VALUES (7,6,'-82934583.42236974');
  324. INSERT INTO num_exp_sub VALUES (7,6,'-83122386.57763026');
  325. INSERT INTO num_exp_mul VALUES (7,6,'-7796505729750.37795610');
  326. INSERT INTO num_exp_div VALUES (7,6,'-884.20756174009028770294');
  327. INSERT INTO num_exp_add VALUES (7,7,'-166056970');
  328. INSERT INTO num_exp_sub VALUES (7,7,'0');
  329. INSERT INTO num_exp_mul VALUES (7,7,'6893729321395225');
  330. INSERT INTO num_exp_div VALUES (7,7,'1.00000000000000000000');
  331. INSERT INTO num_exp_add VALUES (7,8,'-82953604');
  332. INSERT INTO num_exp_sub VALUES (7,8,'-83103366');
  333. INSERT INTO num_exp_mul VALUES (7,8,'-6217255985285');
  334. INSERT INTO num_exp_div VALUES (7,8,'-1108.80577182462841041118');
  335. INSERT INTO num_exp_add VALUES (7,9,'-107955289.045047420');
  336. INSERT INTO num_exp_sub VALUES (7,9,'-58101680.954952580');
  337. INSERT INTO num_exp_mul VALUES (7,9,'2069634775752159.035758700');
  338. INSERT INTO num_exp_div VALUES (7,9,'3.33089171198810413382');
  339. INSERT INTO num_exp_add VALUES (8,0,'74881');
  340. INSERT INTO num_exp_sub VALUES (8,0,'74881');
  341. INSERT INTO num_exp_mul VALUES (8,0,'0');
  342. INSERT INTO num_exp_div VALUES (8,0,'NaN');
  343. INSERT INTO num_exp_add VALUES (8,1,'74881');
  344. INSERT INTO num_exp_sub VALUES (8,1,'74881');
  345. INSERT INTO num_exp_mul VALUES (8,1,'0');
  346. INSERT INTO num_exp_div VALUES (8,1,'NaN');
  347. INSERT INTO num_exp_add VALUES (8,2,'-34263611.215397047');
  348. INSERT INTO num_exp_sub VALUES (8,2,'34413373.215397047');
  349. INSERT INTO num_exp_mul VALUES (8,2,'-2571300635581.146276407');
  350. INSERT INTO num_exp_div VALUES (8,2,'-.00218067233500788615');
  351. INSERT INTO num_exp_add VALUES (8,3,'74885.31');
  352. INSERT INTO num_exp_sub VALUES (8,3,'74876.69');
  353. INSERT INTO num_exp_mul VALUES (8,3,'322737.11');
  354. INSERT INTO num_exp_div VALUES (8,3,'17373.78190255220417633410');
  355. INSERT INTO num_exp_add VALUES (8,4,'7874342.4119');
  356. INSERT INTO num_exp_sub VALUES (8,4,'-7724580.4119');
  357. INSERT INTO num_exp_mul VALUES (8,4,'584031469984.4839');
  358. INSERT INTO num_exp_div VALUES (8,4,'.00960079113741758956');
  359. INSERT INTO num_exp_add VALUES (8,5,'91278.038491');
  360. INSERT INTO num_exp_sub VALUES (8,5,'58483.961509');
  361. INSERT INTO num_exp_mul VALUES (8,5,'1227826639.244571');
  362. INSERT INTO num_exp_div VALUES (8,5,'4.56673929509287019456');
  363. INSERT INTO num_exp_add VALUES (8,6,'168782.57763026');
  364. INSERT INTO num_exp_sub VALUES (8,6,'-19020.57763026');
  365. INSERT INTO num_exp_mul VALUES (8,6,'7031444034.53149906');
  366. INSERT INTO num_exp_div VALUES (8,6,'.79744134113322314424');
  367. INSERT INTO num_exp_add VALUES (8,7,'-82953604');
  368. INSERT INTO num_exp_sub VALUES (8,7,'83103366');
  369. INSERT INTO num_exp_mul VALUES (8,7,'-6217255985285');
  370. INSERT INTO num_exp_div VALUES (8,7,'-.00090187120721280172');
  371. INSERT INTO num_exp_add VALUES (8,8,'149762');
  372. INSERT INTO num_exp_sub VALUES (8,8,'0');
  373. INSERT INTO num_exp_mul VALUES (8,8,'5607164161');
  374. INSERT INTO num_exp_div VALUES (8,8,'1.00000000000000000000');
  375. INSERT INTO num_exp_add VALUES (8,9,'-24851923.045047420');
  376. INSERT INTO num_exp_sub VALUES (8,9,'25001685.045047420');
  377. INSERT INTO num_exp_mul VALUES (8,9,'-1866544013697.195857020');
  378. INSERT INTO num_exp_div VALUES (8,9,'-.00300403532938582735');
  379. INSERT INTO num_exp_add VALUES (9,0,'-24926804.045047420');
  380. INSERT INTO num_exp_sub VALUES (9,0,'-24926804.045047420');
  381. INSERT INTO num_exp_mul VALUES (9,0,'0');
  382. INSERT INTO num_exp_div VALUES (9,0,'NaN');
  383. INSERT INTO num_exp_add VALUES (9,1,'-24926804.045047420');
  384. INSERT INTO num_exp_sub VALUES (9,1,'-24926804.045047420');
  385. INSERT INTO num_exp_mul VALUES (9,1,'0');
  386. INSERT INTO num_exp_div VALUES (9,1,'NaN');
  387. INSERT INTO num_exp_add VALUES (9,2,'-59265296.260444467');
  388. INSERT INTO num_exp_sub VALUES (9,2,'9411688.170349627');
  389. INSERT INTO num_exp_mul VALUES (9,2,'855948866655588.453741509242968740');
  390. INSERT INTO num_exp_div VALUES (9,2,'.72591434384152961526');
  391. INSERT INTO num_exp_add VALUES (9,3,'-24926799.735047420');
  392. INSERT INTO num_exp_sub VALUES (9,3,'-24926808.355047420');
  393. INSERT INTO num_exp_mul VALUES (9,3,'-107434525.43415438020');
  394. INSERT INTO num_exp_div VALUES (9,3,'-5783481.21694835730858468677');
  395. INSERT INTO num_exp_add VALUES (9,4,'-17127342.633147420');
  396. INSERT INTO num_exp_sub VALUES (9,4,'-32726265.456947420');
  397. INSERT INTO num_exp_mul VALUES (9,4,'-194415646271340.1815956522980');
  398. INSERT INTO num_exp_div VALUES (9,4,'-3.19596478892958416484');
  399. INSERT INTO num_exp_add VALUES (9,5,'-24910407.006556420');
  400. INSERT INTO num_exp_sub VALUES (9,5,'-24943201.083538420');
  401. INSERT INTO num_exp_mul VALUES (9,5,'-408725765384.257043660243220');
  402. INSERT INTO num_exp_div VALUES (9,5,'-1520.20159364322004505807');
  403. INSERT INTO num_exp_add VALUES (9,6,'-24832902.467417160');
  404. INSERT INTO num_exp_sub VALUES (9,6,'-25020705.622677680');
  405. INSERT INTO num_exp_mul VALUES (9,6,'-2340666225110.29929521292692920');
  406. INSERT INTO num_exp_div VALUES (9,6,'-265.45671195426965751280');
  407. INSERT INTO num_exp_add VALUES (9,7,'-107955289.045047420');
  408. INSERT INTO num_exp_sub VALUES (9,7,'58101680.954952580');
  409. INSERT INTO num_exp_mul VALUES (9,7,'2069634775752159.035758700');
  410. INSERT INTO num_exp_div VALUES (9,7,'.30021990699995814689');
  411. INSERT INTO num_exp_add VALUES (9,8,'-24851923.045047420');
  412. INSERT INTO num_exp_sub VALUES (9,8,'-25001685.045047420');
  413. INSERT INTO num_exp_mul VALUES (9,8,'-1866544013697.195857020');
  414. INSERT INTO num_exp_div VALUES (9,8,'-332.88556569820675471748');
  415. INSERT INTO num_exp_add VALUES (9,9,'-49853608.090094840');
  416. INSERT INTO num_exp_sub VALUES (9,9,'0');
  417. INSERT INTO num_exp_mul VALUES (9,9,'621345559900192.420120630048656400');
  418. INSERT INTO num_exp_div VALUES (9,9,'1.00000000000000000000');
  419. COMMIT TRANSACTION;
  420. BEGIN TRANSACTION;
  421. INSERT INTO num_exp_sqrt VALUES (0,'0');
  422. INSERT INTO num_exp_sqrt VALUES (1,'0');
  423. INSERT INTO num_exp_sqrt VALUES (2,'5859.90547836712524903505');
  424. INSERT INTO num_exp_sqrt VALUES (3,'2.07605394920266944396');
  425. INSERT INTO num_exp_sqrt VALUES (4,'2792.75158435189147418923');
  426. INSERT INTO num_exp_sqrt VALUES (5,'128.05092147657509145473');
  427. INSERT INTO num_exp_sqrt VALUES (6,'306.43364311096782703406');
  428. INSERT INTO num_exp_sqrt VALUES (7,'9111.99676251039939975230');
  429. INSERT INTO num_exp_sqrt VALUES (8,'273.64392922189960397542');
  430. INSERT INTO num_exp_sqrt VALUES (9,'4992.67503899937593364766');
  431. COMMIT TRANSACTION;
  432. BEGIN TRANSACTION;
  433. INSERT INTO num_exp_ln VALUES (0,'NaN');
  434. INSERT INTO num_exp_ln VALUES (1,'NaN');
  435. INSERT INTO num_exp_ln VALUES (2,'17.35177750493897715514');
  436. INSERT INTO num_exp_ln VALUES (3,'1.46093790411565641971');
  437. INSERT INTO num_exp_ln VALUES (4,'15.86956523951936572464');
  438. INSERT INTO num_exp_ln VALUES (5,'9.70485601768871834038');
  439. INSERT INTO num_exp_ln VALUES (6,'11.45000246622944403127');
  440. INSERT INTO num_exp_ln VALUES (7,'18.23469429965478772991');
  441. INSERT INTO num_exp_ln VALUES (8,'11.22365546576315513668');
  442. INSERT INTO num_exp_ln VALUES (9,'17.03145425013166006962');
  443. COMMIT TRANSACTION;
  444. BEGIN TRANSACTION;
  445. INSERT INTO num_exp_log10 VALUES (0,'NaN');
  446. INSERT INTO num_exp_log10 VALUES (1,'NaN');
  447. INSERT INTO num_exp_log10 VALUES (2,'7.53578122160797276459');
  448. INSERT INTO num_exp_log10 VALUES (3,'.63447727016073160075');
  449. INSERT INTO num_exp_log10 VALUES (4,'6.89206461372691743345');
  450. INSERT INTO num_exp_log10 VALUES (5,'4.21476541614777768626');
  451. INSERT INTO num_exp_log10 VALUES (6,'4.97267288886207207671');
  452. INSERT INTO num_exp_log10 VALUES (7,'7.91922711353275546914');
  453. INSERT INTO num_exp_log10 VALUES (8,'4.87437163556421004138');
  454. INSERT INTO num_exp_log10 VALUES (9,'7.39666659961986567059');
  455. COMMIT TRANSACTION;
  456. BEGIN TRANSACTION;
  457. INSERT INTO num_exp_power_10_ln VALUES (0,'NaN');
  458. INSERT INTO num_exp_power_10_ln VALUES (1,'NaN');
  459. INSERT INTO num_exp_power_10_ln VALUES (2,'224790267919917955.13261618583642653184');
  460. INSERT INTO num_exp_power_10_ln VALUES (3,'28.90266599445155957393');
  461. INSERT INTO num_exp_power_10_ln VALUES (4,'7405685069594999.07733999469386277636');
  462. INSERT INTO num_exp_power_10_ln VALUES (5,'5068226527.32127265408584640098');
  463. INSERT INTO num_exp_power_10_ln VALUES (6,'281839893606.99372343357047819067');
  464. INSERT INTO num_exp_power_10_ln VALUES (7,'1716699575118597095.42330819910640247627');
  465. INSERT INTO num_exp_power_10_ln VALUES (8,'167361463828.07491320069016125952');
  466. INSERT INTO num_exp_power_10_ln VALUES (9,'107511333880052007.04141124673540337457');
  467. COMMIT TRANSACTION;
  468. BEGIN TRANSACTION;
  469. INSERT INTO num_data VALUES (0, '0');
  470. INSERT INTO num_data VALUES (1, '0');
  471. INSERT INTO num_data VALUES (2, '-34338492.215397047');
  472. INSERT INTO num_data VALUES (3, '4.31');
  473. INSERT INTO num_data VALUES (4, '7799461.4119');
  474. INSERT INTO num_data VALUES (5, '16397.038491');
  475. INSERT INTO num_data VALUES (6, '93901.57763026');
  476. INSERT INTO num_data VALUES (7, '-83028485');
  477. INSERT INTO num_data VALUES (8, '74881');
  478. INSERT INTO num_data VALUES (9, '-24926804.045047420');
  479. COMMIT TRANSACTION;
  480. -- ******************************
  481. -- * Create indices for faster checks
  482. -- ******************************
  483. CREATE UNIQUE INDEX num_exp_add_idx ON num_exp_add (id1, id2);
  484. CREATE UNIQUE INDEX num_exp_sub_idx ON num_exp_sub (id1, id2);
  485. CREATE UNIQUE INDEX num_exp_div_idx ON num_exp_div (id1, id2);
  486. CREATE UNIQUE INDEX num_exp_mul_idx ON num_exp_mul (id1, id2);
  487. CREATE UNIQUE INDEX num_exp_sqrt_idx ON num_exp_sqrt (id);
  488. CREATE UNIQUE INDEX num_exp_ln_idx ON num_exp_ln (id);
  489. CREATE UNIQUE INDEX num_exp_log10_idx ON num_exp_log10 (id);
  490. CREATE UNIQUE INDEX num_exp_power_10_ln_idx ON num_exp_power_10_ln (id);
  491. VACUUM ANALYZE num_exp_add;
  492. VACUUM ANALYZE num_exp_sub;
  493. VACUUM ANALYZE num_exp_div;
  494. VACUUM ANALYZE num_exp_mul;
  495. VACUUM ANALYZE num_exp_sqrt;
  496. VACUUM ANALYZE num_exp_ln;
  497. VACUUM ANALYZE num_exp_log10;
  498. VACUUM ANALYZE num_exp_power_10_ln;
  499. -- ******************************
  500. -- * Now check the behaviour of the NUMERIC type
  501. -- ******************************
  502. -- ******************************
  503. -- * Addition check
  504. -- ******************************
  505. DELETE FROM num_result;
  506. INSERT INTO num_result SELECT t1.id, t2.id, t1.val + t2.val
  507. FROM num_data t1, num_data t2;
  508. SELECT t1.id1, t1.id2, t1.result, t2.expected
  509. FROM num_result t1, num_exp_add t2
  510. WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2
  511. AND t1.result != t2.expected;
  512. DELETE FROM num_result;
  513. INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val + t2.val, 10)
  514. FROM num_data t1, num_data t2;
  515. SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 10) as expected
  516. FROM num_result t1, num_exp_add t2
  517. WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2
  518. AND t1.result != round(t2.expected, 10);
  519. -- ******************************
  520. -- * Subtraction check
  521. -- ******************************
  522. DELETE FROM num_result;
  523. INSERT INTO num_result SELECT t1.id, t2.id, t1.val - t2.val
  524. FROM num_data t1, num_data t2;
  525. SELECT t1.id1, t1.id2, t1.result, t2.expected
  526. FROM num_result t1, num_exp_sub t2
  527. WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2
  528. AND t1.result != t2.expected;
  529. DELETE FROM num_result;
  530. INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val - t2.val, 40)
  531. FROM num_data t1, num_data t2;
  532. SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 40)
  533. FROM num_result t1, num_exp_sub t2
  534. WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2
  535. AND t1.result != round(t2.expected, 40);
  536. -- ******************************
  537. -- * Multiply check
  538. -- ******************************
  539. DELETE FROM num_result;
  540. INSERT INTO num_result SELECT t1.id, t2.id, t1.val * t2.val
  541. FROM num_data t1, num_data t2;
  542. SELECT t1.id1, t1.id2, t1.result, t2.expected
  543. FROM num_result t1, num_exp_mul t2
  544. WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2
  545. AND t1.result != t2.expected;
  546. DELETE FROM num_result;
  547. INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val * t2.val, 30)
  548. FROM num_data t1, num_data t2;
  549. SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 30) as expected
  550. FROM num_result t1, num_exp_mul t2
  551. WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2
  552. AND t1.result != round(t2.expected, 30);
  553. -- ******************************
  554. -- * Division check
  555. -- ******************************
  556. DELETE FROM num_result;
  557. INSERT INTO num_result SELECT t1.id, t2.id, t1.val / t2.val
  558. FROM num_data t1, num_data t2
  559. WHERE t2.val != '0.0';
  560. SELECT t1.id1, t1.id2, t1.result, t2.expected
  561. FROM num_result t1, num_exp_div t2
  562. WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2
  563. AND t1.result != t2.expected;
  564. DELETE FROM num_result;
  565. INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val / t2.val, 80)
  566. FROM num_data t1, num_data t2
  567. WHERE t2.val != '0.0';
  568. SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 80) as expected
  569. FROM num_result t1, num_exp_div t2
  570. WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2
  571. AND t1.result != round(t2.expected, 80);
  572. -- ******************************
  573. -- * Square root check
  574. -- ******************************
  575. DELETE FROM num_result;
  576. INSERT INTO num_result SELECT id, 0, SQRT(ABS(val))
  577. FROM num_data;
  578. SELECT t1.id1, t1.result, t2.expected
  579. FROM num_result t1, num_exp_sqrt t2
  580. WHERE t1.id1 = t2.id
  581. AND t1.result != t2.expected;
  582. -- ******************************
  583. -- * Natural logarithm check
  584. -- ******************************
  585. DELETE FROM num_result;
  586. INSERT INTO num_result SELECT id, 0, LN(ABS(val))
  587. FROM num_data
  588. WHERE val != '0.0';
  589. SELECT t1.id1, t1.result, t2.expected
  590. FROM num_result t1, num_exp_ln t2
  591. WHERE t1.id1 = t2.id
  592. AND t1.result != t2.expected;
  593. -- ******************************
  594. -- * Logarithm base 10 check
  595. -- ******************************
  596. DELETE FROM num_result;
  597. INSERT INTO num_result SELECT id, 0, LOG(numeric '10', ABS(val))
  598. FROM num_data
  599. WHERE val != '0.0';
  600. SELECT t1.id1, t1.result, t2.expected
  601. FROM num_result t1, num_exp_log10 t2
  602. WHERE t1.id1 = t2.id
  603. AND t1.result != t2.expected;
  604. -- ******************************
  605. -- * POWER(10, LN(value)) check
  606. -- ******************************
  607. DELETE FROM num_result;
  608. INSERT INTO num_result SELECT id, 0, POWER(numeric '10', LN(ABS(round(val,200))))
  609. FROM num_data
  610. WHERE val != '0.0';
  611. SELECT t1.id1, t1.result, t2.expected
  612. FROM num_result t1, num_exp_power_10_ln t2
  613. WHERE t1.id1 = t2.id
  614. AND t1.result != t2.expected;
  615. -- ******************************
  616. -- * Check behavior with Inf and NaN inputs. It's easiest to handle these
  617. -- * separately from the num_data framework used above, because some input
  618. -- * combinations will throw errors.
  619. -- ******************************
  620. WITH v(x) AS
  621. (VALUES('0'::numeric),('1'),('-1'),('4.2'),('inf'),('-inf'),('nan'))
  622. SELECT x1, x2,
  623. x1 + x2 AS sum,
  624. x1 - x2 AS diff,
  625. x1 * x2 AS prod
  626. FROM v AS v1(x1), v AS v2(x2);
  627. WITH v(x) AS
  628. (VALUES('0'::numeric),('1'),('-1'),('4.2'),('inf'),('-inf'),('nan'))
  629. SELECT x1, x2,
  630. x1 / x2 AS quot,
  631. x1 % x2 AS mod,
  632. div(x1, x2) AS div
  633. FROM v AS v1(x1), v AS v2(x2) WHERE x2 != 0;
  634. SELECT 'inf'::numeric / '0';
  635. SELECT '-inf'::numeric / '0';
  636. SELECT 'nan'::numeric / '0';
  637. SELECT '0'::numeric / '0';
  638. SELECT 'inf'::numeric % '0';
  639. SELECT '-inf'::numeric % '0';
  640. SELECT 'nan'::numeric % '0';
  641. SELECT '0'::numeric % '0';
  642. SELECT div('inf'::numeric, '0');
  643. SELECT div('-inf'::numeric, '0');
  644. SELECT div('nan'::numeric, '0');
  645. SELECT div('0'::numeric, '0');
  646. WITH v(x) AS
  647. (VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan'))
  648. SELECT x, -x as minusx, abs(x), floor(x), ceil(x), sign(x), numeric_inc(x) as inc
  649. FROM v;
  650. WITH v(x) AS
  651. (VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('inf'),('-inf'),('nan'))
  652. SELECT x, round(x), round(x,1) as round1, trunc(x), trunc(x,1) as trunc1
  653. FROM v;
  654. -- the large values fall into the numeric abbreviation code's maximal classes
  655. WITH v(x) AS
  656. (VALUES('0'::numeric),('1'),('-1'),('4.2'),('-7.777'),('1e340'),('-1e340'),
  657. ('inf'),('-inf'),('nan'),
  658. ('inf'),('-inf'),('nan'))
  659. SELECT substring(x::text, 1, 32)
  660. FROM v ORDER BY x;
  661. WITH v(x) AS
  662. (VALUES('0'::numeric),('1'),('4.2'),('inf'),('nan'))
  663. SELECT x, sqrt(x)
  664. FROM v;
  665. SELECT sqrt('-1'::numeric);
  666. SELECT sqrt('-inf'::numeric);
  667. WITH v(x) AS
  668. (VALUES('1'::numeric),('4.2'),('inf'),('nan'))
  669. SELECT x,
  670. log(x),
  671. log10(x),
  672. ln(x)
  673. FROM v;
  674. SELECT ln('0'::numeric);
  675. SELECT ln('-1'::numeric);
  676. SELECT ln('-inf'::numeric);
  677. WITH v(x) AS
  678. (VALUES('2'::numeric),('4.2'),('inf'),('nan'))
  679. SELECT x1, x2,
  680. log(x1, x2)
  681. FROM v AS v1(x1), v AS v2(x2);
  682. SELECT log('0'::numeric, '10');
  683. SELECT log('10'::numeric, '0');
  684. SELECT log('-inf'::numeric, '10');
  685. SELECT log('10'::numeric, '-inf');
  686. SELECT log('inf'::numeric, '0');
  687. SELECT log('inf'::numeric, '-inf');
  688. SELECT log('-inf'::numeric, 'inf');
  689. WITH v(x) AS
  690. (VALUES('0'::numeric),('1'),('2'),('4.2'),('inf'),('nan'))
  691. SELECT x1, x2,
  692. power(x1, x2)
  693. FROM v AS v1(x1), v AS v2(x2) WHERE x1 != 0 OR x2 >= 0;
  694. SELECT power('0'::numeric, '-1');
  695. SELECT power('0'::numeric, '-inf');
  696. SELECT power('-1'::numeric, 'inf');
  697. SELECT power('-2'::numeric, '3');
  698. SELECT power('-2'::numeric, '3.3');
  699. SELECT power('-2'::numeric, '-1');
  700. SELECT power('-2'::numeric, '-1.5');
  701. SELECT power('-2'::numeric, 'inf');
  702. SELECT power('-2'::numeric, '-inf');
  703. SELECT power('inf'::numeric, '-2');
  704. SELECT power('inf'::numeric, '-inf');
  705. SELECT power('-inf'::numeric, '2');
  706. SELECT power('-inf'::numeric, '3');
  707. SELECT power('-inf'::numeric, '4.5');
  708. SELECT power('-inf'::numeric, '-2');
  709. SELECT power('-inf'::numeric, '-3');
  710. SELECT power('-inf'::numeric, '0');
  711. SELECT power('-inf'::numeric, 'inf');
  712. SELECT power('-inf'::numeric, '-inf');
  713. -- ******************************
  714. -- * miscellaneous checks for things that have been broken in the past...
  715. -- ******************************
  716. -- numeric AVG used to fail on some platforms
  717. SELECT AVG(val) FROM num_data;
  718. SELECT MAX(val) FROM num_data;
  719. SELECT MIN(val) FROM num_data;
  720. SELECT STDDEV(val) FROM num_data;
  721. SELECT VARIANCE(val) FROM num_data;
  722. -- Check for appropriate rounding and overflow
  723. CREATE TABLE fract_only (id int, val numeric(4,4));
  724. INSERT INTO fract_only VALUES (1, '0.0');
  725. INSERT INTO fract_only VALUES (2, '0.1');
  726. INSERT INTO fract_only VALUES (3, '1.0'); -- should fail
  727. INSERT INTO fract_only VALUES (4, '-0.9999');
  728. INSERT INTO fract_only VALUES (5, '0.99994');
  729. INSERT INTO fract_only VALUES (6, '0.99995'); -- should fail
  730. INSERT INTO fract_only VALUES (7, '0.00001');
  731. INSERT INTO fract_only VALUES (8, '0.00017');
  732. INSERT INTO fract_only VALUES (9, 'NaN');
  733. INSERT INTO fract_only VALUES (10, 'Inf'); -- should fail
  734. INSERT INTO fract_only VALUES (11, '-Inf'); -- should fail
  735. SELECT * FROM fract_only;
  736. DROP TABLE fract_only;
  737. -- Check conversion to integers
  738. SELECT (-9223372036854775808.5)::int8; -- should fail
  739. SELECT (-9223372036854775808.4)::int8; -- ok
  740. SELECT 9223372036854775807.4::int8; -- ok
  741. SELECT 9223372036854775807.5::int8; -- should fail
  742. SELECT (-2147483648.5)::int4; -- should fail
  743. SELECT (-2147483648.4)::int4; -- ok
  744. SELECT 2147483647.4::int4; -- ok
  745. SELECT 2147483647.5::int4; -- should fail
  746. SELECT (-32768.5)::int2; -- should fail
  747. SELECT (-32768.4)::int2; -- ok
  748. SELECT 32767.4::int2; -- ok
  749. SELECT 32767.5::int2; -- should fail
  750. -- Check inf/nan conversion behavior
  751. SELECT 'NaN'::float8::numeric;
  752. SELECT 'Infinity'::float8::numeric;
  753. SELECT '-Infinity'::float8::numeric;
  754. SELECT 'NaN'::numeric::float8;
  755. SELECT 'Infinity'::numeric::float8;
  756. SELECT '-Infinity'::numeric::float8;
  757. SELECT 'NaN'::float4::numeric;
  758. SELECT 'Infinity'::float4::numeric;
  759. SELECT '-Infinity'::float4::numeric;
  760. SELECT 'NaN'::numeric::float4;
  761. SELECT 'Infinity'::numeric::float4;
  762. SELECT '-Infinity'::numeric::float4;
  763. SELECT '42'::int2::numeric;
  764. SELECT 'NaN'::numeric::int2;
  765. SELECT 'Infinity'::numeric::int2;
  766. SELECT '-Infinity'::numeric::int2;
  767. SELECT 'NaN'::numeric::int4;
  768. SELECT 'Infinity'::numeric::int4;
  769. SELECT '-Infinity'::numeric::int4;
  770. SELECT 'NaN'::numeric::int8;
  771. SELECT 'Infinity'::numeric::int8;
  772. SELECT '-Infinity'::numeric::int8;
  773. -- Simple check that ceil(), floor(), and round() work correctly
  774. CREATE TABLE ceil_floor_round (a numeric);
  775. INSERT INTO ceil_floor_round VALUES ('-5.5');
  776. INSERT INTO ceil_floor_round VALUES ('-5.499999');
  777. INSERT INTO ceil_floor_round VALUES ('9.5');
  778. INSERT INTO ceil_floor_round VALUES ('9.4999999');
  779. INSERT INTO ceil_floor_round VALUES ('0.0');
  780. INSERT INTO ceil_floor_round VALUES ('0.0000001');
  781. INSERT INTO ceil_floor_round VALUES ('-0.000001');
  782. SELECT a, ceil(a), ceiling(a), floor(a), round(a) FROM ceil_floor_round;
  783. DROP TABLE ceil_floor_round;
  784. -- Check rounding, it should round ties away from zero.
  785. SELECT i as pow,
  786. round((-2.5 * 10 ^ i)::numeric, -i),
  787. round((-1.5 * 10 ^ i)::numeric, -i),
  788. round((-0.5 * 10 ^ i)::numeric, -i),
  789. round((0.5 * 10 ^ i)::numeric, -i),
  790. round((1.5 * 10 ^ i)::numeric, -i),
  791. round((2.5 * 10 ^ i)::numeric, -i)
  792. FROM generate_series(-5,5) AS t(i);
  793. -- Testing for width_bucket(). For convenience, we test both the
  794. -- numeric and float8 versions of the function in this file.
  795. -- errors
  796. SELECT width_bucket(5.0, 3.0, 4.0, 0);
  797. SELECT width_bucket(5.0, 3.0, 4.0, -5);
  798. SELECT width_bucket(3.5, 3.0, 3.0, 888);
  799. SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, 0);
  800. SELECT width_bucket(5.0::float8, 3.0::float8, 4.0::float8, -5);
  801. SELECT width_bucket(3.5::float8, 3.0::float8, 3.0::float8, 888);
  802. SELECT width_bucket('NaN', 3.0, 4.0, 888);
  803. SELECT width_bucket(0::float8, 'NaN', 4.0::float8, 888);
  804. SELECT width_bucket(2.0, 3.0, '-inf', 888);
  805. SELECT width_bucket(0::float8, '-inf', 4.0::float8, 888);
  806. -- normal operation
  807. CREATE TABLE width_bucket_test (operand_num numeric, operand_f8 float8);
  808. COPY width_bucket_test (operand_num) FROM stdin;
  809. -5.2
  810. -0.0000000001
  811. 0.000000000001
  812. 1
  813. 1.99999999999999
  814. 2
  815. 2.00000000000001
  816. 3
  817. 4
  818. 4.5
  819. 5
  820. 5.5
  821. 6
  822. 7
  823. 8
  824. 9
  825. 9.99999999999999
  826. 10
  827. 10.0000000000001
  828. \.
  829. UPDATE width_bucket_test SET operand_f8 = operand_num::float8;
  830. SELECT
  831. operand_num,
  832. width_bucket(operand_num, 0, 10, 5) AS wb_1,
  833. width_bucket(operand_f8, 0, 10, 5) AS wb_1f,
  834. width_bucket(operand_num, 10, 0, 5) AS wb_2,
  835. width_bucket(operand_f8, 10, 0, 5) AS wb_2f,
  836. width_bucket(operand_num, 2, 8, 4) AS wb_3,
  837. width_bucket(operand_f8, 2, 8, 4) AS wb_3f,
  838. width_bucket(operand_num, 5.0, 5.5, 20) AS wb_4,
  839. width_bucket(operand_f8, 5.0, 5.5, 20) AS wb_4f,
  840. width_bucket(operand_num, -25, 25, 10) AS wb_5,
  841. width_bucket(operand_f8, -25, 25, 10) AS wb_5f
  842. FROM width_bucket_test;
  843. -- Check positive and negative infinity: we require
  844. -- finite bucket bounds, but allow an infinite operand
  845. SELECT width_bucket(0.0::numeric, 'Infinity'::numeric, 5, 10); -- error
  846. SELECT width_bucket(0.0::numeric, 5, '-Infinity'::numeric, 20); -- error
  847. SELECT width_bucket('Infinity'::numeric, 1, 10, 10),
  848. width_bucket('-Infinity'::numeric, 1, 10, 10);
  849. SELECT width_bucket(0.0::float8, 'Infinity'::float8, 5, 10); -- error
  850. SELECT width_bucket(0.0::float8, 5, '-Infinity'::float8, 20); -- error
  851. SELECT width_bucket('Infinity'::float8, 1, 10, 10),
  852. width_bucket('-Infinity'::float8, 1, 10, 10);
  853. DROP TABLE width_bucket_test;
  854. -- Simple test for roundoff error when results should be exact
  855. SELECT x, width_bucket(x::float8, 10, 100, 9) as flt,
  856. width_bucket(x::numeric, 10, 100, 9) as num
  857. FROM generate_series(0, 110, 10) x;
  858. SELECT x, width_bucket(x::float8, 100, 10, 9) as flt,
  859. width_bucket(x::numeric, 100, 10, 9) as num
  860. FROM generate_series(0, 110, 10) x;
  861. --
  862. -- TO_CHAR()
  863. --
  864. SELECT to_char(val, '9G999G999G999G999G999')
  865. FROM num_data;
  866. SELECT to_char(val, '9G999G999G999G999G999D999G999G999G999G999')
  867. FROM num_data;
  868. SELECT to_char(val, '9999999999999999.999999999999999PR')
  869. FROM num_data;
  870. SELECT to_char(val, '9999999999999999.999999999999999S')
  871. FROM num_data;
  872. SELECT to_char(val, 'MI9999999999999999.999999999999999') FROM num_data;
  873. SELECT to_char(val, 'FMS9999999999999999.999999999999999') FROM num_data;
  874. SELECT to_char(val, 'FM9999999999999999.999999999999999THPR') FROM num_data;
  875. SELECT to_char(val, 'SG9999999999999999.999999999999999th') FROM num_data;
  876. SELECT to_char(val, '0999999999999999.999999999999999') FROM num_data;
  877. SELECT to_char(val, 'S0999999999999999.999999999999999') FROM num_data;
  878. SELECT to_char(val, 'FM0999999999999999.999999999999999') FROM num_data;
  879. SELECT to_char(val, 'FM9999999999999999.099999999999999') FROM num_data;
  880. SELECT to_char(val, 'FM9999999999990999.990999999999999') FROM num_data;
  881. SELECT to_char(val, 'FM0999999999999999.999909999999999') FROM num_data;
  882. SELECT to_char(val, 'FM9999999990999999.099999999999999') FROM num_data;
  883. SELECT to_char(val, 'L9999999999999999.099999999999999') FROM num_data;
  884. SELECT to_char(val, 'FM9999999999999999.99999999999999') FROM num_data;
  885. SELECT to_char(val, 'S 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9') FROM num_data;
  886. SELECT to_char(val, 'FMS 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9') FROM num_data;
  887. SELECT to_char(val, E'99999 "text" 9999 "9999" 999 "\\"text between quote marks\\"" 9999') FROM num_data;
  888. SELECT to_char(val, '999999SG9999999999') FROM num_data;
  889. SELECT to_char(val, 'FM9999999999999999.999999999999999') FROM num_data;
  890. SELECT to_char(val, '9.999EEEE') FROM num_data;
  891. WITH v(val) AS
  892. (VALUES('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan'))
  893. SELECT val,
  894. to_char(val, '9.999EEEE') as numeric,
  895. to_char(val::float8, '9.999EEEE') as float8,
  896. to_char(val::float4, '9.999EEEE') as float4
  897. FROM v;
  898. WITH v(exp) AS
  899. (VALUES(-16379),(-16378),(-1234),(-789),(-45),(-5),(-4),(-3),(-2),(-1),(0),
  900. (1),(2),(3),(4),(5),(38),(275),(2345),(45678),(131070),(131071))
  901. SELECT exp,
  902. to_char(('1.2345e'||exp)::numeric, '9.999EEEE') as numeric
  903. FROM v;
  904. WITH v(val) AS
  905. (VALUES('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan'))
  906. SELECT val,
  907. to_char(val, 'MI9999999999.99') as numeric,
  908. to_char(val::float8, 'MI9999999999.99') as float8,
  909. to_char(val::float4, 'MI9999999999.99') as float4
  910. FROM v;
  911. WITH v(val) AS
  912. (VALUES('0'::numeric),('-4.2'),('4.2e9'),('1.2e-5'),('inf'),('-inf'),('nan'))
  913. SELECT val,
  914. to_char(val, 'MI99.99') as numeric,
  915. to_char(val::float8, 'MI99.99') as float8,
  916. to_char(val::float4, 'MI99.99') as float4
  917. FROM v;
  918. SELECT to_char('100'::numeric, 'FM999.9');
  919. SELECT to_char('100'::numeric, 'FM999.');
  920. SELECT to_char('100'::numeric, 'FM999');
  921. -- Check parsing of literal text in a format string
  922. SELECT to_char('100'::numeric, 'foo999');
  923. SELECT to_char('100'::numeric, 'f\oo999');
  924. SELECT to_char('100'::numeric, 'f\\oo999');
  925. SELECT to_char('100'::numeric, 'f\"oo999');
  926. SELECT to_char('100'::numeric, 'f\\"oo999');
  927. SELECT to_char('100'::numeric, 'f"ool"999');
  928. SELECT to_char('100'::numeric, 'f"\ool"999');
  929. SELECT to_char('100'::numeric, 'f"\\ool"999');
  930. SELECT to_char('100'::numeric, 'f"ool\"999');
  931. SELECT to_char('100'::numeric, 'f"ool\\"999');
  932. -- TO_NUMBER()
  933. --
  934. SET lc_numeric = 'C';
  935. SELECT to_number('-34,338,492', '99G999G999');
  936. SELECT to_number('-34,338,492.654,878', '99G999G999D999G999');
  937. SELECT to_number('<564646.654564>', '999999.999999PR');
  938. SELECT to_number('0.00001-', '9.999999S');
  939. SELECT to_number('5.01-', 'FM9.999999S');
  940. SELECT to_number('5.01-', 'FM9.999999MI');
  941. SELECT to_number('5 4 4 4 4 8 . 7 8', '9 9 9 9 9 9 . 9 9');
  942. SELECT to_number('.01', 'FM9.99');
  943. SELECT to_number('.0', '99999999.99999999');
  944. SELECT to_number('0', '99.99');
  945. SELECT to_number('.-01', 'S99.99');
  946. SELECT to_number('.01-', '99.99S');
  947. SELECT to_number(' . 0 1-', ' 9 9 . 9 9 S');
  948. SELECT to_number('34,50','999,99');
  949. SELECT to_number('123,000','999G');
  950. SELECT to_number('123456','999G999');
  951. SELECT to_number('$1234.56','L9,999.99');
  952. SELECT to_number('$1234.56','L99,999.99');
  953. SELECT to_number('$1,234.56','L99,999.99');
  954. SELECT to_number('1234.56','L99,999.99');
  955. SELECT to_number('1,234.56','L99,999.99');
  956. SELECT to_number('42nd', '99th');
  957. RESET lc_numeric;
  958. --
  959. -- Input syntax
  960. --
  961. CREATE TABLE num_input_test (n1 numeric);
  962. -- good inputs
  963. INSERT INTO num_input_test(n1) VALUES (' 123');
  964. INSERT INTO num_input_test(n1) VALUES (' 3245874 ');
  965. INSERT INTO num_input_test(n1) VALUES (' -93853');
  966. INSERT INTO num_input_test(n1) VALUES ('555.50');
  967. INSERT INTO num_input_test(n1) VALUES ('-555.50');
  968. INSERT INTO num_input_test(n1) VALUES ('NaN ');
  969. INSERT INTO num_input_test(n1) VALUES (' nan');
  970. INSERT INTO num_input_test(n1) VALUES (' inf ');
  971. INSERT INTO num_input_test(n1) VALUES (' +inf ');
  972. INSERT INTO num_input_test(n1) VALUES (' -inf ');
  973. INSERT INTO num_input_test(n1) VALUES (' Infinity ');
  974. INSERT INTO num_input_test(n1) VALUES (' +inFinity ');
  975. INSERT INTO num_input_test(n1) VALUES (' -INFINITY ');
  976. -- bad inputs
  977. INSERT INTO num_input_test(n1) VALUES (' ');
  978. INSERT INTO num_input_test(n1) VALUES (' 1234 %');
  979. INSERT INTO num_input_test(n1) VALUES ('xyz');
  980. INSERT INTO num_input_test(n1) VALUES ('- 1234');
  981. INSERT INTO num_input_test(n1) VALUES ('5 . 0');
  982. INSERT INTO num_input_test(n1) VALUES ('5. 0 ');
  983. INSERT INTO num_input_test(n1) VALUES ('');
  984. INSERT INTO num_input_test(n1) VALUES (' N aN ');
  985. INSERT INTO num_input_test(n1) VALUES ('+ infinity');
  986. SELECT * FROM num_input_test;
  987. --
  988. -- Test some corner cases for multiplication
  989. --
  990. select 4790999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999;
  991. select 4789999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999;
  992. select 4770999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999;
  993. select 4769999999999999999999999999999999999999999999999999999999999999999999999999999999999999 * 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999;
  994. select trim_scale((0.1 - 2e-16383) * (0.1 - 3e-16383));
  995. --
  996. -- Test some corner cases for division
  997. --
  998. select 999999999999999999999::numeric/1000000000000000000000;
  999. select div(999999999999999999999::numeric,1000000000000000000000);
  1000. select mod(999999999999999999999::numeric,1000000000000000000000);
  1001. select div(-9999999999999999999999::numeric,1000000000000000000000);
  1002. select mod(-9999999999999999999999::numeric,1000000000000000000000);
  1003. select div(-9999999999999999999999::numeric,1000000000000000000000)*1000000000000000000000 + mod(-9999999999999999999999::numeric,1000000000000000000000);
  1004. select mod (70.0,70) ;
  1005. select div (70.0,70) ;
  1006. select 70.0 / 70 ;
  1007. select 12345678901234567890 % 123;
  1008. select 12345678901234567890 / 123;
  1009. select div(12345678901234567890, 123);
  1010. select div(12345678901234567890, 123) * 123 + 12345678901234567890 % 123;
  1011. --
  1012. -- Test some corner cases for square root
  1013. --
  1014. select sqrt(1.000000000000003::numeric);
  1015. select sqrt(1.000000000000004::numeric);
  1016. select sqrt(96627521408608.56340355805::numeric);
  1017. select sqrt(96627521408608.56340355806::numeric);
  1018. select sqrt(515549506212297735.073688290367::numeric);
  1019. select sqrt(515549506212297735.073688290368::numeric);
  1020. select sqrt(8015491789940783531003294973900306::numeric);
  1021. select sqrt(8015491789940783531003294973900307::numeric);
  1022. --
  1023. -- Test code path for raising to integer powers
  1024. --
  1025. select 10.0 ^ -2147483648 as rounds_to_zero;
  1026. select 10.0 ^ -2147483647 as rounds_to_zero;
  1027. select 10.0 ^ 2147483647 as overflows;
  1028. select 117743296169.0 ^ 1000000000 as overflows;
  1029. -- cases that used to return inaccurate results
  1030. select 3.789 ^ 21;
  1031. select 3.789 ^ 35;
  1032. select 1.2 ^ 345;
  1033. select 0.12 ^ (-20);
  1034. select 1.000000000123 ^ (-2147483648);
  1035. select coalesce(nullif(0.9999999999 ^ 23300000000000, 0), 0) as rounds_to_zero;
  1036. select round(((1 - 1.500012345678e-1000) ^ 1.45e1003) * 1e1000);
  1037. -- cases that used to error out
  1038. select 0.12 ^ (-25);
  1039. select 0.5678 ^ (-85);
  1040. select coalesce(nullif(0.9999999999 ^ 70000000000000, 0), 0) as underflows;
  1041. -- negative base to integer powers
  1042. select (-1.0) ^ 2147483646;
  1043. select (-1.0) ^ 2147483647;
  1044. select (-1.0) ^ 2147483648;
  1045. select (-1.0) ^ 1000000000000000;
  1046. select (-1.0) ^ 1000000000000001;
  1047. --
  1048. -- Tests for raising to non-integer powers
  1049. --
  1050. -- special cases
  1051. select 0.0 ^ 0.0;
  1052. select (-12.34) ^ 0.0;
  1053. select 12.34 ^ 0.0;
  1054. select 0.0 ^ 12.34;
  1055. -- NaNs
  1056. select 'NaN'::numeric ^ 'NaN'::numeric;
  1057. select 'NaN'::numeric ^ 0;
  1058. select 'NaN'::numeric ^ 1;
  1059. select 0 ^ 'NaN'::numeric;
  1060. select 1 ^ 'NaN'::numeric;
  1061. -- invalid inputs
  1062. select 0.0 ^ (-12.34);
  1063. select (-12.34) ^ 1.2;
  1064. -- cases that used to generate inaccurate results
  1065. select 32.1 ^ 9.8;
  1066. select 32.1 ^ (-9.8);
  1067. select 12.3 ^ 45.6;
  1068. select 12.3 ^ (-45.6);
  1069. -- big test
  1070. select 1.234 ^ 5678;
  1071. --
  1072. -- Tests for EXP()
  1073. --
  1074. -- special cases
  1075. select exp(0.0);
  1076. select exp(1.0);
  1077. select exp(1.0::numeric(71,70));
  1078. select exp('nan'::numeric);
  1079. select exp('inf'::numeric);
  1080. select exp('-inf'::numeric);
  1081. select coalesce(nullif(exp(-5000::numeric), 0), 0) as rounds_to_zero;
  1082. select coalesce(nullif(exp(-10000::numeric), 0), 0) as underflows;
  1083. -- cases that used to generate inaccurate results
  1084. select exp(32.999);
  1085. select exp(-32.999);
  1086. select exp(123.456);
  1087. select exp(-123.456);
  1088. -- big test
  1089. select exp(1234.5678);
  1090. --
  1091. -- Tests for generate_series
  1092. --
  1093. select * from generate_series(0.0::numeric, 4.0::numeric);
  1094. select * from generate_series(0.1::numeric, 4.0::numeric, 1.3::numeric);
  1095. select * from generate_series(4.0::numeric, -1.5::numeric, -2.2::numeric);
  1096. -- Trigger errors
  1097. select * from generate_series(-100::numeric, 100::numeric, 0::numeric);
  1098. select * from generate_series(-100::numeric, 100::numeric, 'nan'::numeric);
  1099. select * from generate_series('nan'::numeric, 100::numeric, 10::numeric);
  1100. select * from generate_series(0::numeric, 'nan'::numeric, 10::numeric);
  1101. select * from generate_series('inf'::numeric, 'inf'::numeric, 10::numeric);
  1102. select * from generate_series(0::numeric, 'inf'::numeric, 10::numeric);
  1103. select * from generate_series(0::numeric, '42'::numeric, '-inf'::numeric);
  1104. -- Checks maximum, output is truncated
  1105. select (i / (10::numeric ^ 131071))::numeric(1,0)
  1106. from generate_series(6 * (10::numeric ^ 131071),
  1107. 9 * (10::numeric ^ 131071),
  1108. 10::numeric ^ 131071) as a(i);
  1109. -- Check usage with variables
  1110. select * from generate_series(1::numeric, 3::numeric) i, generate_series(i,3) j;
  1111. select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,i) j;
  1112. select * from generate_series(1::numeric, 3::numeric) i, generate_series(1,5,i) j;
  1113. --
  1114. -- Tests for LN()
  1115. --
  1116. -- Invalid inputs
  1117. select ln(-12.34);
  1118. select ln(0.0);
  1119. -- Some random tests
  1120. select ln(1.2345678e-28);
  1121. select ln(0.0456789);
  1122. select ln(0.349873948359354029493948309745709580730482050975);
  1123. select ln(0.99949452);
  1124. select ln(1.00049687395);
  1125. select ln(1234.567890123456789);
  1126. select ln(5.80397490724e5);
  1127. select ln(9.342536355e34);
  1128. --
  1129. -- Tests for LOG() (base 10)
  1130. --
  1131. -- invalid inputs
  1132. select log(-12.34);
  1133. select log(0.0);
  1134. -- some random tests
  1135. select log(1.234567e-89);
  1136. select log(3.4634998359873254962349856073435545);
  1137. select log(9.999999999999999999);
  1138. select log(10.00000000000000000);
  1139. select log(10.00000000000000001);
  1140. select log(590489.45235237);
  1141. --
  1142. -- Tests for LOG() (arbitrary base)
  1143. --
  1144. -- invalid inputs
  1145. select log(-12.34, 56.78);
  1146. select log(-12.34, -56.78);
  1147. select log(12.34, -56.78);
  1148. select log(0.0, 12.34);
  1149. select log(12.34, 0.0);
  1150. select log(1.0, 12.34);
  1151. -- some random tests
  1152. select log(1.23e-89, 6.4689e45);
  1153. select log(0.99923, 4.58934e34);
  1154. select log(1.000016, 8.452010e18);
  1155. select log(3.1954752e47, 9.4792021e-73);
  1156. --
  1157. -- Tests for scale()
  1158. --
  1159. select scale(numeric 'NaN');
  1160. select scale(numeric 'inf');
  1161. select scale(NULL::numeric);
  1162. select scale(1.12);
  1163. select scale(0);
  1164. select scale(0.00);
  1165. select scale(1.12345);
  1166. select scale(110123.12475871856128);
  1167. select scale(-1123.12471856128);
  1168. select scale(-13.000000000000000);
  1169. --
  1170. -- Tests for min_scale()
  1171. --
  1172. select min_scale(numeric 'NaN') is NULL; -- should be true
  1173. select min_scale(numeric 'inf') is NULL; -- should be true
  1174. select min_scale(0); -- no digits
  1175. select min_scale(0.00); -- no digits again
  1176. select min_scale(1.0); -- no scale
  1177. select min_scale(1.1); -- scale 1
  1178. select min_scale(1.12); -- scale 2
  1179. select min_scale(1.123); -- scale 3
  1180. select min_scale(1.1234); -- scale 4, filled digit
  1181. select min_scale(1.12345); -- scale 5, 2 NDIGITS
  1182. select min_scale(1.1000); -- 1 pos in NDIGITS
  1183. select min_scale(1e100); -- very big number
  1184. --
  1185. -- Tests for trim_scale()
  1186. --
  1187. select trim_scale(numeric 'NaN');
  1188. select trim_scale(numeric 'inf');
  1189. select trim_scale(1.120);
  1190. select trim_scale(0);
  1191. select trim_scale(0.00);
  1192. select trim_scale(1.1234500);
  1193. select trim_scale(110123.12475871856128000);
  1194. select trim_scale(-1123.124718561280000000);
  1195. select trim_scale(-13.00000000000000000000);
  1196. select trim_scale(1e100);
  1197. --
  1198. -- Tests for SUM()
  1199. --
  1200. -- cases that need carry propagation
  1201. SELECT SUM(9999::numeric) FROM generate_series(1, 100000);
  1202. SELECT SUM((-9999)::numeric) FROM generate_series(1, 100000);
  1203. --
  1204. -- Tests for GCD()
  1205. --
  1206. SELECT a, b, gcd(a, b), gcd(a, -b), gcd(-b, a), gcd(-b, -a)
  1207. FROM (VALUES (0::numeric, 0::numeric),
  1208. (0::numeric, numeric 'NaN'),
  1209. (0::numeric, 46375::numeric),
  1210. (433125::numeric, 46375::numeric),
  1211. (43312.5::numeric, 4637.5::numeric),
  1212. (4331.250::numeric, 463.75000::numeric),
  1213. ('inf', '0'),
  1214. ('inf', '42'),
  1215. ('inf', 'inf')
  1216. ) AS v(a, b);
  1217. --
  1218. -- Tests for LCM()
  1219. --
  1220. SELECT a,b, lcm(a, b), lcm(a, -b), lcm(-b, a), lcm(-b, -a)
  1221. FROM (VALUES (0::numeric, 0::numeric),
  1222. (0::numeric, numeric 'NaN'),
  1223. (0::numeric, 13272::numeric),
  1224. (13272::numeric, 13272::numeric),
  1225. (423282::numeric, 13272::numeric),
  1226. (42328.2::numeric, 1327.2::numeric),
  1227. (4232.820::numeric, 132.72000::numeric),
  1228. ('inf', '0'),
  1229. ('inf', '42'),
  1230. ('inf', 'inf')
  1231. ) AS v(a, b);
  1232. SELECT lcm(9999 * (10::numeric)^131068 + (10::numeric^131068 - 1), 2); -- overflow
  1233. --
  1234. -- Tests for factorial
  1235. --
  1236. SELECT factorial(4);
  1237. SELECT factorial(15);
  1238. SELECT factorial(100000);
  1239. SELECT factorial(0);
  1240. SELECT factorial(-4);
  1241. --
  1242. -- Tests for pg_lsn()
  1243. --
  1244. SELECT pg_lsn(23783416::numeric);
  1245. SELECT pg_lsn(0::numeric);
  1246. SELECT pg_lsn(18446744073709551615::numeric);
  1247. SELECT pg_lsn(-1::numeric);
  1248. SELECT pg_lsn(18446744073709551616::numeric);
  1249. SELECT pg_lsn('NaN'::numeric);