static Object deserializeScalarValue(Common.TypedValue protoElement) { // ByteString is a single case where TypedValue is representing the data differently // (in its "local" form) than Frame does. We need to unwrap the Base64 encoding. if (Common.Rep.BYTE_STRING == protoElement.getType()) { // Protobuf is sending native bytes (not b64) across the wire. B64 bytes is only for // TypedValue's benefit return protoElement.getBytesValue().toByteArray(); } // Again, let TypedValue deserialize things for us. return TypedValue.fromProto(protoElement).value; }
static Object deserializeScalarValue(Common.TypedValue protoElement) { // ByteString is a single case where TypedValue is representing the data differently // (in its "local" form) than Frame does. We need to unwrap the Base64 encoding. if (Common.Rep.BYTE_STRING == protoElement.getType()) { // Protobuf is sending native bytes (not b64) across the wire. B64 bytes is only for // TypedValue's benefit return protoElement.getBytesValue().toByteArray(); } // Again, let TypedValue deserialize things for us. return TypedValue.fromProto(protoElement).value; }
@Override ExecuteRequest deserialize(Message genericMsg) { final Requests.ExecuteRequest msg = ProtobufService.castProtobufMessage(genericMsg, Requests.ExecuteRequest.class); final Descriptor desc = msg.getDescriptorForType(); Meta.StatementHandle statemetnHandle = null; if (ProtobufService.hasField(msg, desc, Requests.ExecuteRequest.STATEMENTHANDLE_FIELD_NUMBER)) { statemetnHandle = Meta.StatementHandle.fromProto(msg.getStatementHandle()); } List<TypedValue> values = null; if (msg.getHasParameterValues()) { values = new ArrayList<>(msg.getParameterValuesCount()); for (Common.TypedValue valueProto : msg.getParameterValuesList()) { values.add(TypedValue.fromProto(valueProto)); } } return new ExecuteRequest(statemetnHandle, values, msg.getMaxRowCount()); }
private void serializeAndEqualityCheck(TypedValue value) { TypedValue copy = TypedValue.fromProto(value.toProto()); assertEquals(value.type, copy.type); assertEquals(value.value, copy.value); }
for (Common.TypedValue protoElement : protoList) { TypedValue listElement = TypedValue.fromProto(protoElement);
private void serializeAndEqualityCheck(TypedValue value) { TypedValue copy = TypedValue.fromProto(value.toProto()); assertEquals(value.type, copy.type); assertEquals(value.value, copy.value); }
private void serializeAndEqualityCheck(TypedValue value) { TypedValue copy = TypedValue.fromProto(value.toProto()); assertEquals(value.type, copy.type); assertEquals(value.value, copy.value); }
for (Common.TypedValue protoElement : protoList) { TypedValue listElement = TypedValue.fromProto(protoElement);
@Override ExecuteRequest deserialize(Message genericMsg) { final Requests.ExecuteRequest msg = ProtobufService.castProtobufMessage(genericMsg, Requests.ExecuteRequest.class); Meta.StatementHandle statementHandle = null; if (msg.hasField(STATEMENT_HANDLE_DESCRIPTOR)) { statementHandle = Meta.StatementHandle.fromProto(msg.getStatementHandle()); } List<TypedValue> values = null; if (msg.getHasParameterValues()) { values = new ArrayList<>(msg.getParameterValuesCount()); for (Common.TypedValue valueProto : msg.getParameterValuesList()) { if (TypedValue.PROTO_IMPLICIT_NULL.equals(valueProto)) { values.add(null); } else { values.add(TypedValue.fromProto(valueProto)); } } } // Default int value int maxFrameSize = 0; if (msg.hasField(FIRST_FRAME_MAX_SIZE_DESCRIPTOR)) { maxFrameSize = msg.getFirstFrameMaxSize(); } else if (msg.hasField(DEPRECATED_FIRST_FRAME_MAX_SIZE_DESCRIPTOR)) { // Truncate the long as an int maxFrameSize = (int) msg.getDeprecatedFirstFrameMaxSize(); } return new ExecuteRequest(statementHandle, values, maxFrameSize); }
@Override ExecuteRequest deserialize(Message genericMsg) { final Requests.ExecuteRequest msg = ProtobufService.castProtobufMessage(genericMsg, Requests.ExecuteRequest.class); Meta.StatementHandle statementHandle = null; if (msg.hasField(STATEMENT_HANDLE_DESCRIPTOR)) { statementHandle = Meta.StatementHandle.fromProto(msg.getStatementHandle()); } List<TypedValue> values = null; if (msg.getHasParameterValues()) { values = new ArrayList<>(msg.getParameterValuesCount()); for (Common.TypedValue valueProto : msg.getParameterValuesList()) { if (TypedValue.PROTO_IMPLICIT_NULL.equals(valueProto)) { values.add(null); } else { values.add(TypedValue.fromProto(valueProto)); } } } // Default int value int maxFrameSize = 0; if (msg.hasField(FIRST_FRAME_MAX_SIZE_DESCRIPTOR)) { maxFrameSize = msg.getFirstFrameMaxSize(); } else if (msg.hasField(DEPRECATED_FIRST_FRAME_MAX_SIZE_DESCRIPTOR)) { // Truncate the long as an int maxFrameSize = (int) msg.getDeprecatedFirstFrameMaxSize(); } return new ExecuteRequest(statementHandle, values, maxFrameSize); }
@Test public void testLegacyDecimalParsing() { final BigDecimal decimal = new BigDecimal("123451234512345"); final Calendar calendar = DateTimeUtils.calendar(); // CALCITE-1103 Decimals were (incorrectly) getting serialized as normal "numbers" which // caused them to use the numberValue field. TypedValue should still be able to handle // values like this (but large values will be truncated and return bad values). Common.TypedValue oldProtoStyle = Common.TypedValue.newBuilder().setType(Common.Rep.NUMBER) .setNumberValue(decimal.longValue()).build(); TypedValue fromProtoTv = TypedValue.fromProto(oldProtoStyle); Object o = fromProtoTv.toJdbc(calendar); assertEquals(decimal, o); }
@Test public void testLegacyDecimalParsing() { final BigDecimal decimal = new BigDecimal("123451234512345"); final Calendar calendar = DateTimeUtils.calendar(); // CALCITE-1103 Decimals were (incorrectly) getting serialized as normal "numbers" which // caused them to use the numberValue field. TypedValue should still be able to handle // values like this (but large values will be truncated and return bad values). Common.TypedValue oldProtoStyle = Common.TypedValue.newBuilder().setType(Common.Rep.NUMBER) .setNumberValue(decimal.longValue()).build(); TypedValue fromProtoTv = TypedValue.fromProto(oldProtoStyle); Object o = fromProtoTv.toJdbc(calendar); assertEquals(decimal, o); }
@Test public void testLegacyBase64StringEncodingForBytes() { // CALCITE-1103 CALCITE-1209 We observed that binary data was being // serialized as base-64 encoded strings instead of the native binary // data type in protobufs. We need to still handle older clients sending // data in this form. final byte[] bytes = "asdf".getBytes(UTF_8); final String base64Str = Base64.encodeBytes(bytes); Common.TypedValue.Builder builder = Common.TypedValue.newBuilder(); builder.setStringValue(base64Str); builder.setType(Common.Rep.BYTE_STRING); Common.TypedValue protoTv = builder.build(); TypedValue tv = TypedValue.fromProto(protoTv); assertEquals(Rep.BYTE_STRING, tv.type); assertEquals(base64Str, tv.value); }
@Test public void testLegacyBase64StringEncodingForBytes() { // CALCITE-1103 CALCITE-1209 We observed that binary data was being // serialized as base-64 encoded strings instead of the native binary // data type in protobufs. We need to still handle older clients sending // data in this form. final byte[] bytes = "asdf".getBytes(UTF_8); final String base64Str = Base64.encodeBytes(bytes); Common.TypedValue.Builder builder = Common.TypedValue.newBuilder(); builder.setStringValue(base64Str); builder.setType(Common.Rep.BYTE_STRING); Common.TypedValue protoTv = builder.build(); TypedValue tv = TypedValue.fromProto(protoTv); assertEquals(Rep.BYTE_STRING, tv.type); assertEquals(base64Str, tv.value); }
@Test public void testArrays() { List<Object> serialObj = Arrays.<Object>asList(1, 2, 3, 4); ArrayImpl.Factory factory = new ArrayFactoryImpl(Unsafe.localCalendar().getTimeZone()); ScalarType scalarType = ColumnMetaData.scalar(Types.INTEGER, "INTEGER", Rep.INTEGER); Array a1 = factory.createArray(scalarType, serialObj); TypedValue tv1 = TypedValue.ofJdbc(Rep.ARRAY, a1, Unsafe.localCalendar()); Object jdbcObj = tv1.toJdbc(Unsafe.localCalendar()); assertTrue("The JDBC object is an " + jdbcObj.getClass(), jdbcObj instanceof Array); Object localObj = tv1.toLocal(); assertTrue("The local object is an " + localObj.getClass(), localObj instanceof List); Common.TypedValue protoTv1 = tv1.toProto(); assertEquals(serialObj.size(), protoTv1.getArrayValueCount()); TypedValue tv1Copy = TypedValue.fromProto(protoTv1); Object jdbcObjCopy = tv1Copy.toJdbc(Unsafe.localCalendar()); assertTrue("The JDBC object is an " + jdbcObjCopy.getClass(), jdbcObjCopy instanceof Array); Object localObjCopy = tv1Copy.toLocal(); assertTrue("The local object is an " + localObjCopy.getClass(), localObjCopy instanceof List); } }
@Test public void testArrays() { List<Object> serialObj = Arrays.<Object>asList(1, 2, 3, 4); ArrayImpl.Factory factory = new ArrayFactoryImpl(Unsafe.localCalendar().getTimeZone()); ScalarType scalarType = ColumnMetaData.scalar(Types.INTEGER, "INTEGER", Rep.INTEGER); Array a1 = factory.createArray(scalarType, serialObj); TypedValue tv1 = TypedValue.ofJdbc(Rep.ARRAY, a1, Unsafe.localCalendar()); Object jdbcObj = tv1.toJdbc(Unsafe.localCalendar()); assertTrue("The JDBC object is an " + jdbcObj.getClass(), jdbcObj instanceof Array); Object localObj = tv1.toLocal(); assertTrue("The local object is an " + localObj.getClass(), localObj instanceof List); Common.TypedValue protoTv1 = tv1.toProto(); assertEquals(serialObj.size(), protoTv1.getArrayValueCount()); TypedValue tv1Copy = TypedValue.fromProto(protoTv1); Object jdbcObjCopy = tv1Copy.toJdbc(Unsafe.localCalendar()); assertTrue("The JDBC object is an " + jdbcObjCopy.getClass(), jdbcObjCopy instanceof Array); Object localObjCopy = tv1Copy.toLocal(); assertTrue("The local object is an " + localObjCopy.getClass(), localObjCopy instanceof List); } }