@@ -4430,35 +4430,62 @@ int8_numeric(PG_FUNCTION_ARGS)
4430
4430
PG_RETURN_NUMERIC (int64_to_numeric (val ));
4431
4431
}
4432
4432
4433
-
4434
- Datum
4435
- numeric_int8 (PG_FUNCTION_ARGS )
4433
+ int64
4434
+ numeric_int8_opt_error (Numeric num , bool * have_error )
4436
4435
{
4437
- Numeric num = PG_GETARG_NUMERIC (0 );
4438
4436
NumericVar x ;
4439
4437
int64 result ;
4440
4438
4439
+ if (have_error )
4440
+ * have_error = false;
4441
+
4441
4442
if (NUMERIC_IS_SPECIAL (num ))
4442
4443
{
4443
- if (NUMERIC_IS_NAN (num ))
4444
- ereport (ERROR ,
4445
- (errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
4446
- errmsg ("cannot convert NaN to %s" , "bigint" )));
4444
+ if (have_error )
4445
+ {
4446
+ * have_error = true;
4447
+ return 0 ;
4448
+ }
4447
4449
else
4448
- ereport (ERROR ,
4449
- (errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
4450
- errmsg ("cannot convert infinity to %s" , "bigint" )));
4450
+ {
4451
+ if (NUMERIC_IS_NAN (num ))
4452
+ ereport (ERROR ,
4453
+ (errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
4454
+ errmsg ("cannot convert NaN to %s" , "bigint" )));
4455
+ else
4456
+ ereport (ERROR ,
4457
+ (errcode (ERRCODE_FEATURE_NOT_SUPPORTED ),
4458
+ errmsg ("cannot convert infinity to %s" , "bigint" )));
4459
+ }
4451
4460
}
4452
4461
4453
- /* Convert to variable format and thence to int8 */
4462
+ /* Convert to variable format, then convert to int8 */
4454
4463
init_var_from_num (num , & x );
4455
4464
4456
4465
if (!numericvar_to_int64 (& x , & result ))
4457
- ereport (ERROR ,
4458
- (errcode (ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE ),
4459
- errmsg ("bigint out of range" )));
4466
+ {
4467
+ if (have_error )
4468
+ {
4469
+ * have_error = true;
4470
+ return 0 ;
4471
+ }
4472
+ else
4473
+ {
4474
+ ereport (ERROR ,
4475
+ (errcode (ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE ),
4476
+ errmsg ("bigint out of range" )));
4477
+ }
4478
+ }
4479
+
4480
+ return result ;
4481
+ }
4482
+
4483
+ Datum
4484
+ numeric_int8 (PG_FUNCTION_ARGS )
4485
+ {
4486
+ Numeric num = PG_GETARG_NUMERIC (0 );
4460
4487
4461
- PG_RETURN_INT64 (result );
4488
+ PG_RETURN_INT64 (numeric_int8_opt_error ( num , NULL ) );
4462
4489
}
4463
4490
4464
4491
0 commit comments