@@ -3175,6 +3175,79 @@ numeric_float4(PG_FUNCTION_ARGS)
3175
3175
}
3176
3176
3177
3177
3178
+ bool
3179
+ numeric_get_small (Numeric value , uint32 * out )
3180
+ {
3181
+ NumericDigit * digits ;
3182
+ uint32 result ;
3183
+ int weight ,
3184
+ ndigits ,
3185
+ i ;
3186
+
3187
+ if (NUMERIC_SIGN (value ) == NUMERIC_NAN )
3188
+ return false;
3189
+
3190
+ if (NUMERIC_DSCALE (value ) != 0 )
3191
+ return false;
3192
+
3193
+ weight = NUMERIC_WEIGHT (value );
3194
+ if (weight > 2 )
3195
+ return false;
3196
+
3197
+ digits = NUMERIC_DIGITS (value );
3198
+ if (weight == 2 && digits [0 ] > 20 )
3199
+ return false;
3200
+
3201
+ ndigits = NUMERIC_NDIGITS (value );
3202
+ result = 0 ;
3203
+ for (i = 0 ; i <= weight ; i ++ )
3204
+ {
3205
+ result *= NBASE ;
3206
+ if (i < ndigits )
3207
+ result += digits [i ];
3208
+ }
3209
+
3210
+ if (NUMERIC_SIGN (value ) == NUMERIC_NEG )
3211
+ result = - result ;
3212
+
3213
+ * out = result ;
3214
+
3215
+ return true;
3216
+ }
3217
+
3218
+ Numeric
3219
+ small_to_numeric (uint32 value )
3220
+ {
3221
+ NumericDigit digits [3 ];
3222
+ Numeric result ;
3223
+ Size len ;
3224
+ int weight ;
3225
+ bool sign ;
3226
+
3227
+ sign = (int32 ) value < 0 ;
3228
+ if (sign )
3229
+ value = - value ;
3230
+
3231
+ digits [0 ] = (value / NBASE / NBASE ) % NBASE ;
3232
+ digits [1 ] = (value / NBASE ) % NBASE ;
3233
+ digits [2 ] = value % NBASE ;
3234
+
3235
+ weight = digits [0 ] ? 2 : digits [1 ] ? 1 : 0 ;
3236
+
3237
+ len = NUMERIC_HDRSZ_SHORT + (weight + 1 ) * sizeof (NumericDigit );
3238
+ result = (Numeric ) palloc (len );
3239
+ SET_VARSIZE (result , len );
3240
+ result -> choice .n_short .n_header =
3241
+ (sign ? NUMERIC_SHORT | NUMERIC_SHORT_SIGN_MASK : NUMERIC_SHORT ) |
3242
+ (weight & NUMERIC_SHORT_WEIGHT_MASK );
3243
+
3244
+ memcpy (NUMERIC_DIGITS (result ), digits + (2 - weight ),
3245
+ (weight + 1 ) * sizeof (NumericDigit ));
3246
+
3247
+ return result ;
3248
+ }
3249
+
3250
+
3178
3251
/* ----------------------------------------------------------------------
3179
3252
*
3180
3253
* Aggregate functions
0 commit comments