code: private static BigDecimal currentTokenAsJavaDecimal(JsonParser parser, int precision, int scale)
              throws IOException
      {
          BigDecimal result;
          switch (parser.getCurrentToken()) {
              case VALUE_NULL:
                  return null;
              case VALUE_STRING:
              case FIELD_NAME:
                  result = new BigDecimal(parser.getText());
                  result = result.setScale(scale, HALF_UP);
                  break;
              case VALUE_NUMBER_FLOAT:
              case VALUE_NUMBER_INT:
                  result = parser.getDecimalValue();
                  result = result.setScale(scale, HALF_UP);
                  break;
              case VALUE_TRUE:
                  result = BigDecimal.ONE.setScale(scale, HALF_UP);
                  break;
              case VALUE_FALSE:
                  result = BigDecimal.ZERO.setScale(scale, HALF_UP);
                  break;
              default:
                  throw new JsonCastException(format("Unexpected token when cast to DECIMAL(%s,%s): %s", precision, scale, parser.getText()));
          }
  
          if (result.precision() > precision) {
              // TODO: Should we use NUMERIC_VALUE_OUT_OF_RANGE instead?
              throw new PrestoException(INVALID_CAST_ARGUMENT, format("Cannot cast input json to DECIMAL(%s,%s)", precision, scale));
          }
          return result;
      }
docs: by calling the corresponding cast-to-decimal function, similar to other JSON cast function.