You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@arrow.apache.org by "avantgardnerio (via GitHub)" <gi...@apache.org> on 2023/02/01 16:25:39 UTC

[GitHub] [arrow] avantgardnerio commented on a diff in pull request #33961: GH-33475: [Java][FlightRPC] Send prepared statement parameters

avantgardnerio commented on code in PR #33961:
URL: https://github.com/apache/arrow/pull/33961#discussion_r1093455014


##########
java/flight/flight-sql-jdbc-driver/src/main/java/org/apache/arrow/driver/jdbc/ArrowFlightPreparedStatement.java:
##########
@@ -93,6 +104,99 @@ public synchronized void close() throws SQLException {
 
   @Override
   public FlightInfo executeFlightInfoQuery() throws SQLException {
+    BufferAllocator allocator = new RootAllocator(1024 * 1024);
+    List<FieldVector> fields = new ArrayList<>();
+    List<TypedValue> values = this.getParameterValues();
+    for(int i = 0; i < this.getParameterCount(); i++) {
+      AvaticaParameter param = this.getParameter(i + 1);
+      switch (param.parameterType) {
+        case java.sql.Types.TINYINT:
+        case java.sql.Types.SMALLINT:
+        case java.sql.Types.INTEGER:
+        case java.sql.Types.BIGINT:
+          IntVector intVec = new IntVector(param.name, allocator);
+          intVec.setSafe(0, (int)values.get(i).value);
+          intVec.setValueCount(1);
+          fields.add(intVec);
+          break;
+        case java.sql.Types.BIT:
+        case java.sql.Types.BOOLEAN:
+          BitVector bitVec = new BitVector(param.name, allocator);
+          bitVec.set(0, (int)values.get(i).value);
+          bitVec.setValueCount(1);
+          fields.add(bitVec);
+          break;
+        case java.sql.Types.FLOAT:
+          Float4Vector floatVec = new Float4Vector(param.name, allocator);
+          floatVec.set(0, (float)values.get(i).value);
+          floatVec.setValueCount(1);
+          fields.add(floatVec);
+          break;
+        case java.sql.Types.DOUBLE:
+          Float8Vector doubleVec = new Float8Vector(param.name, allocator);
+          doubleVec.set(0, (double)values.get(i).value);
+          doubleVec.setValueCount(1);
+          fields.add(doubleVec);
+          break;
+        case java.sql.Types.REAL:
+        case java.sql.Types.NUMERIC:
+        case java.sql.Types.DECIMAL:
+          DecimalVector decVec = new DecimalVector(param.name, allocator, param.precision, param.scale);
+          decVec.set(0, (BigDecimal) values.get(i).value);
+          decVec.setValueCount(1);
+          fields.add(decVec);
+          break;
+        case java.sql.Types.CHAR:
+        case java.sql.Types.VARCHAR:
+        case java.sql.Types.NCHAR:
+        case java.sql.Types.NVARCHAR:
+          VarCharVector strVec = new VarCharVector(param.name, allocator);
+          strVec.set(0, new Text((String) values.get(i).value));
+          strVec.setValueCount(1);
+          fields.add(strVec);
+          break;
+        case java.sql.Types.LONGVARCHAR:
+        case java.sql.Types.LONGNVARCHAR:
+          LargeVarCharVector textVec = new LargeVarCharVector(param.name, allocator);
+          textVec.set(0, new Text((String) values.get(i).value));
+          textVec.setValueCount(1);
+          fields.add(textVec);
+          break;
+        case java.sql.Types.DATE:
+        case java.sql.Types.TIME:
+        case java.sql.Types.TIMESTAMP:
+        case java.sql.Types.TIME_WITH_TIMEZONE:
+        case java.sql.Types.TIMESTAMP_WITH_TIMEZONE:
+          DateMilliVector timeVec = new DateMilliVector(param.name, allocator);
+          timeVec.set(0, (long)values.get(i).value);
+          timeVec.setValueCount(1);
+          fields.add(timeVec);
+          break;
+        case java.sql.Types.BINARY:
+        case java.sql.Types.VARBINARY:
+          VarBinaryVector binVec = new VarBinaryVector(param.name, allocator);
+          binVec.set(0, (byte[])values.get(i).value);
+          binVec.setValueCount(1);
+          fields.add(binVec);
+          break;
+        case java.sql.Types.BLOB:
+        case java.sql.Types.LONGVARBINARY:
+          LargeVarBinaryVector blobVec = new LargeVarBinaryVector(param.name, allocator);
+          blobVec.set(0, (byte[])values.get(i).value);
+          blobVec.setValueCount(1);
+          fields.add(blobVec);
+          break;
+        case java.sql.Types.NULL:
+          NullVector nullVec = new NullVector(param.name);
+          nullVec.setValueCount(1);
+          fields.add(nullVec);
+          break;
+        default:
+          throw new SQLException("Unknown type: " + param.typeName);
+      }
+    }
+    VectorSchemaRoot parameters = new VectorSchemaRoot(fields);
+    this.preparedStatement.setParameters(parameters);

Review Comment:
   Step #2 of this PR seems complete: now we can both:
   
   1. Get the schema from the server
   2. Set the parameter values to pass to the server



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org