- Notifications
You must be signed in to change notification settings - Fork28
Commitcbdb8b4
committed
Fix float-to-integer coercions to handle edge cases correctly.
ftoi4 and its sibling coercion functions did their overflow checks ina way that looked superficially plausible, but actually depended on anassumption that the MIN and MAX comparison constants can be representedexactly in the float4 or float8 domain. That fails in ftoi4, ftoi8,and dtoi8, resulting in a possibility that values near the MAX limit willbe wrongly converted (to negative values) when they need to be rejected.Also, because we compared before rounding off the fractional part,the other three functions threw errors for values that really oughtto get rounded to the min or max integer value.Fix by doing rint() first (requiring an assumption that it handlesNaN and Inf correctly; but dtoi8 and ftoi8 were assuming that already),and by comparing to values that should coerce to float exactly, namelyINTxx_MIN and -INTxx_MIN. Also remove some random cosmetic discrepanciesbetween these six functions.Per bug #15519 from Victor Petrovykh. This should get back-patched,but first let's see what the buildfarm thinks of it --- I'm not toosure about portability of some of the regression test cases.Patch by me; thanks to Andrew Gierth for analysis and discussion.Discussion:https://postgr.es/m/15519-4fc785b483201ff1@postgresql.org1 parenteb6f291 commitcbdb8b4
File tree
7 files changed
+277
-29
lines changed- src
- backend/utils/adt
- test/regress
- expected
- sql
7 files changed
+277
-29
lines changedLines changed: 68 additions & 11 deletions
Original file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
1112 | 1112 |
| |
1113 | 1113 |
| |
1114 | 1114 |
| |
1115 |
| - | |
1116 | 1115 |
| |
1117 |
| - | |
1118 |
| - | |
| 1116 | + | |
| 1117 | + | |
| 1118 | + | |
| 1119 | + | |
| 1120 | + | |
| 1121 | + | |
| 1122 | + | |
| 1123 | + | |
| 1124 | + | |
| 1125 | + | |
| 1126 | + | |
| 1127 | + | |
| 1128 | + | |
| 1129 | + | |
| 1130 | + | |
| 1131 | + | |
1119 | 1132 |
| |
1120 | 1133 |
| |
1121 | 1134 |
| |
1122 | 1135 |
| |
1123 |
| - | |
1124 |
| - | |
| 1136 | + | |
1125 | 1137 |
| |
1126 | 1138 |
| |
1127 | 1139 |
| |
| |||
1133 | 1145 |
| |
1134 | 1146 |
| |
1135 | 1147 |
| |
1136 |
| - | |
| 1148 | + | |
| 1149 | + | |
| 1150 | + | |
| 1151 | + | |
| 1152 | + | |
| 1153 | + | |
| 1154 | + | |
| 1155 | + | |
| 1156 | + | |
| 1157 | + | |
| 1158 | + | |
| 1159 | + | |
| 1160 | + | |
| 1161 | + | |
| 1162 | + | |
| 1163 | + | |
1137 | 1164 |
| |
1138 | 1165 |
| |
1139 | 1166 |
| |
1140 | 1167 |
| |
1141 |
| - | |
| 1168 | + | |
1142 | 1169 |
| |
1143 | 1170 |
| |
1144 | 1171 |
| |
| |||
1174 | 1201 |
| |
1175 | 1202 |
| |
1176 | 1203 |
| |
1177 |
| - | |
| 1204 | + | |
| 1205 | + | |
| 1206 | + | |
| 1207 | + | |
| 1208 | + | |
| 1209 | + | |
| 1210 | + | |
| 1211 | + | |
| 1212 | + | |
| 1213 | + | |
| 1214 | + | |
| 1215 | + | |
| 1216 | + | |
| 1217 | + | |
| 1218 | + | |
| 1219 | + | |
1178 | 1220 |
| |
1179 | 1221 |
| |
1180 | 1222 |
| |
1181 | 1223 |
| |
1182 |
| - | |
| 1224 | + | |
1183 | 1225 |
| |
1184 | 1226 |
| |
1185 | 1227 |
| |
| |||
1191 | 1233 |
| |
1192 | 1234 |
| |
1193 | 1235 |
| |
1194 |
| - | |
| 1236 | + | |
| 1237 | + | |
| 1238 | + | |
| 1239 | + | |
| 1240 | + | |
| 1241 | + | |
| 1242 | + | |
| 1243 | + | |
| 1244 | + | |
| 1245 | + | |
| 1246 | + | |
| 1247 | + | |
| 1248 | + | |
| 1249 | + | |
| 1250 | + | |
| 1251 | + | |
1195 | 1252 |
| |
1196 | 1253 |
| |
1197 | 1254 |
| |
1198 | 1255 |
| |
1199 |
| - | |
| 1256 | + | |
1200 | 1257 |
| |
1201 | 1258 |
| |
1202 | 1259 |
| |
|
Lines changed: 34 additions & 18 deletions
Original file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
1204 | 1204 |
| |
1205 | 1205 |
| |
1206 | 1206 |
| |
1207 |
| - | |
1208 |
| - | |
| 1207 | + | |
1209 | 1208 |
| |
1210 |
| - | |
1211 |
| - | |
| 1209 | + | |
| 1210 | + | |
| 1211 | + | |
| 1212 | + | |
| 1213 | + | |
| 1214 | + | |
1212 | 1215 |
| |
1213 |
| - | |
1214 |
| - | |
1215 |
| - | |
| 1216 | + | |
| 1217 | + | |
| 1218 | + | |
| 1219 | + | |
| 1220 | + | |
| 1221 | + | |
| 1222 | + | |
| 1223 | + | |
| 1224 | + | |
1216 | 1225 |
| |
1217 | 1226 |
| |
1218 | 1227 |
| |
1219 | 1228 |
| |
1220 |
| - | |
1221 |
| - | |
1222 |
| - | |
| 1229 | + | |
1223 | 1230 |
| |
1224 | 1231 |
| |
1225 | 1232 |
| |
| |||
1239 | 1246 |
| |
1240 | 1247 |
| |
1241 | 1248 |
| |
1242 |
| - | |
1243 |
| - | |
| 1249 | + | |
1244 | 1250 |
| |
1245 |
| - | |
1246 |
| - | |
| 1251 | + | |
| 1252 | + | |
| 1253 | + | |
| 1254 | + | |
| 1255 | + | |
| 1256 | + | |
1247 | 1257 |
| |
1248 |
| - | |
1249 |
| - | |
1250 |
| - | |
| 1258 | + | |
| 1259 | + | |
| 1260 | + | |
| 1261 | + | |
| 1262 | + | |
| 1263 | + | |
| 1264 | + | |
| 1265 | + | |
| 1266 | + | |
1251 | 1267 |
| |
1252 | 1268 |
| |
1253 | 1269 |
| |
1254 | 1270 |
| |
1255 |
| - | |
| 1271 | + | |
1256 | 1272 |
| |
1257 | 1273 |
| |
1258 | 1274 |
| |
|
Lines changed: 49 additions & 0 deletions
Original file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
257 | 257 |
| |
258 | 258 |
| |
259 | 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 | + |
Lines changed: 49 additions & 0 deletions
Original file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
478 | 478 |
| |
479 | 479 |
| |
480 | 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 | + | |
481 | 530 |
| |
482 | 531 |
| |
483 | 532 |
| |
|
Lines changed: 49 additions & 0 deletions
Original file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
480 | 480 |
| |
481 | 481 |
| |
482 | 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 | + | |
483 | 532 |
| |
484 | 533 |
| |
485 | 534 |
| |
|
Lines changed: 14 additions & 0 deletions
Original file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
81 | 81 |
| |
82 | 82 |
| |
83 | 83 |
| |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + |
0 commit comments
Comments
(0)