8000
We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
1 parent 87e6ed7 commit 9c79e64Copy full SHA for 9c79e64
src/backend/utils/adt/numeric.c
@@ -8191,7 +8191,6 @@ mul_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result,
8191
int res_weight;
8192
int maxdigits;
8193
int *dig;
8194
- int *dig_i1_2;
8195
int carry;
8196
int maxdig;
8197
int newdig;
@@ -8327,7 +8326,7 @@ mul_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result,
8327
8326
* Add the appropriate multiple of var2 into the accumulator.
8328
*
8329
* As above, digits of var2 can be ignored if they don't contribute,
8330
- * so we only include digits for which i1+i2+2 <= res_ndigits - 1.
+ * so we only include digits for which i1+i2+2 < res_ndigits.
8331
8332
* This inner loop is the performance bottleneck for multiplication,
8333
* so we want to keep it simple enough so that it can be
@@ -8336,10 +8335,13 @@ mul_var(const NumericVar *var1, const NumericVar *var2, NumericVar *result,
8336
8335
* Since we aren't propagating carries in this loop, the order does
8337
* not matter.
8338
*/
8339
- i = Min(var2ndigits - 1, res_ndigits - i1 - 3);
8340
- dig_i1_2 = &dig[i1 + 2];
8341
- for (i2 = 0; i2 <= i; i2++)
8342
- dig_i1_2[i2] += var1digit * var2digits[i2];
+ {
+ int i2limit = Min(var2ndigits, res_ndigits - i1 - 2);
+ int *dig_i1_2 = &dig[i1 + 2];
+
+ for (i2 = 0; i2 < i2limit; i2++)
8343
+ dig_i1_2[i2] += var1digit * var2digits[i2];
8344
+ }
8345
}
8346
8347
/*