5353/** Arrow result set implementation */
5454public class SFArrowResultSet extends SFBaseResultSet implements DataConversionContext {
5555 private static final SFLogger logger = SFLoggerFactory .getLogger (SFArrowResultSet .class );
56- private static final ObjectMapper OBJECT_MAPPER = ObjectMapperFactory .getObjectMapper ();
5756
5857 /** iterator over current arrow result chunk */
5958 private ArrowChunkIterator currentChunkIterator ;
@@ -113,6 +112,8 @@ public class SFArrowResultSet extends SFBaseResultSet implements DataConversionC
113112
114113 @ SnowflakeJdbcInternalApi protected Converters converters ;
115114
115+ private final ObjectMapper objectMapper ;
116+
116117 /**
117118 * Constructor takes a result from the API response that we get from executing a SQL statement.
118119 *
@@ -212,6 +213,7 @@ public SFArrowResultSet(
212213 this .treatNTZAsUTC = resultSetSerializable .getTreatNTZAsUTC ();
213214 this .formatDateWithTimezone = resultSetSerializable .getFormatDateWithTimeZone ();
214215 this .useSessionTimezone = resultSetSerializable .getUseSessionTimezone ();
216+ objectMapper = ObjectMapperFactory .getObjectMapperForSession (session );
215217
216218 // sort result set if needed
217219 String rowsetBase64 = resultSetSerializable .getFirstChunkStringData ();
@@ -595,7 +597,7 @@ private StructObjectWrapper getObjectRepresentation(int columnIndex, boolean wit
595597 JsonSqlInput jsonSqlInput = createJsonSqlInput (columnIndex , obj );
596598 return new StructObjectWrapper (jsonSqlInput .getText (), jsonSqlInput );
597599 } else if (type == Types .ARRAY ) {
598- SfSqlArray sfArray = getJsonArray ((String ) obj , columnIndex );
600+ SfSqlArray sfArray = getJsonArray ((String ) obj , columnIndex , objectMapper );
599601 return new StructObjectWrapper (sfArray .getText (), sfArray );
600602 } else {
601603 throw new SFException (queryId , ErrorCode .INVALID_STRUCT_DATA );
@@ -637,7 +639,7 @@ private JsonSqlInput createJsonSqlInput(int columnIndex, Object obj) throws SFEx
637639 return null ;
638640 }
639641 String text = (String ) obj ;
640- JsonNode jsonNode = OBJECT_MAPPER .readTree (text );
642+ JsonNode jsonNode = objectMapper .readTree (text );
641643 return new JsonSqlInput (
642644 text ,
643645 jsonNode ,
@@ -660,7 +662,7 @@ public Array getArray(int columnIndex) throws SFException {
660662 return null ;
661663 }
662664 if (converter instanceof VarCharConverter ) {
663- return getJsonArray ((String ) obj , columnIndex );
665+ return getJsonArray ((String ) obj , columnIndex , objectMapper );
664666 } else if (converter instanceof ArrayConverter || converter instanceof VectorTypeConverter ) {
665667 String jsonString = converter .toString (index );
666668 return getArrowArray (jsonString , (List <Object >) obj , columnIndex );
@@ -686,109 +688,96 @@ private SfSqlArray getArrowArray(String text, List<Object> elements, int columnI
686688
687689 switch (columnType ) {
688690 case Types .INTEGER :
689- return new SfSqlArray (
691+ return getSfSqlArray (
690692 text ,
691693 columnSubType ,
692694 mapAndConvert (elements , converters .integerConverter (columnType ))
693- .toArray (Integer []::new ),
694- session );
695+ .toArray (Integer []::new ));
695696 case Types .SMALLINT :
696- return new SfSqlArray (
697+ return getSfSqlArray (
697698 text ,
698699 columnSubType ,
699700 mapAndConvert (elements , converters .smallIntConverter (columnType ))
700- .toArray (Short []::new ),
701- session );
701+ .toArray (Short []::new ));
702702 case Types .TINYINT :
703- return new SfSqlArray (
703+ return getSfSqlArray (
704704 text ,
705705 columnSubType ,
706- mapAndConvert (elements , converters .tinyIntConverter (columnType )). toArray ( Byte []:: new ),
707- session );
706+ mapAndConvert (elements , converters .tinyIntConverter (columnType ))
707+ . toArray ( Byte []:: new ) );
708708 case Types .BIGINT :
709- return new SfSqlArray (
709+ return getSfSqlArray (
710710 text ,
711711 columnSubType ,
712- mapAndConvert (elements , converters .bigIntConverter (columnType )).toArray (Long []::new ),
713- session );
712+ mapAndConvert (elements , converters .bigIntConverter (columnType )).toArray (Long []::new ));
714713 case Types .DECIMAL :
715714 case Types .NUMERIC :
716- return new SfSqlArray (
715+ return getSfSqlArray (
717716 text ,
718717 columnSubType ,
719718 mapAndConvert (elements , converters .bigDecimalConverter (columnType ))
720- .toArray (BigDecimal []::new ),
721- session );
719+ .toArray (BigDecimal []::new ));
722720 case Types .CHAR :
723721 case Types .VARCHAR :
724722 case Types .LONGNVARCHAR :
725- return new SfSqlArray (
723+ return getSfSqlArray (
726724 text ,
727725 columnSubType ,
728726 mapAndConvert (elements , converters .varcharConverter (columnType , columnSubType , scale ))
729- .toArray (String []::new ),
730- session );
727+ .toArray (String []::new ));
731728 case Types .BINARY :
732- return new SfSqlArray (
729+ return getSfSqlArray (
733730 text ,
734731 columnSubType ,
735732 mapAndConvert (elements , converters .bytesConverter (columnType , scale ))
736- .toArray (Byte [][]::new ),
737- session );
733+ .toArray (Byte [][]::new ));
738734 case Types .FLOAT :
739735 case Types .REAL :
740- return new SfSqlArray (
736+ return getSfSqlArray (
741737 text ,
742738 columnSubType ,
743- mapAndConvert (elements , converters .floatConverter (columnType )).toArray (Float []::new ),
744- session );
739+ mapAndConvert (elements , converters .floatConverter (columnType )).toArray (Float []::new ));
745740 case Types .DOUBLE :
746- return new SfSqlArray (
741+ return getSfSqlArray (
747742 text ,
748743 columnSubType ,
749744 mapAndConvert (elements , converters .doubleConverter (columnType ))
750- .toArray (Double []::new ),
751- session );
745+ .toArray (Double []::new ));
752746 case Types .DATE :
753- return new SfSqlArray (
747+ return getSfSqlArray (
754748 text ,
755749 columnSubType ,
756750 mapAndConvert (elements , converters .dateFromIntConverter (sessionTimeZone ))
757- .toArray (Date []::new ),
758- session );
751+ .toArray (Date []::new ));
759752 case Types .TIME :
760- return new SfSqlArray (
753+ return getSfSqlArray (
761754 text ,
762755 columnSubType ,
763- mapAndConvert (elements , converters .timeFromIntConverter (scale )).toArray (Time []::new ),
764- session );
756+ mapAndConvert (elements , converters .timeFromIntConverter (scale )).toArray (Time []::new ));
765757 case Types .TIMESTAMP :
766- return new SfSqlArray (
758+ return getSfSqlArray (
767759 text ,
768760 columnSubType ,
769761 mapAndConvert (
770762 elements ,
771763 converters .timestampFromStructConverter (
772764 columnType , columnSubType , sessionTimeZone , scale ))
773- .toArray (Timestamp []::new ),
774- session );
765+ .toArray (Timestamp []::new ));
775766 case Types .BOOLEAN :
776- return new SfSqlArray (
767+ return getSfSqlArray (
777768 text ,
778769 columnSubType ,
779770 mapAndConvert (elements , converters .booleanConverter (columnType ))
780- .toArray (Boolean []::new ),
781- session );
771+ .toArray (Boolean []::new ));
782772 case Types .STRUCT :
783- return new SfSqlArray (
784- text , columnSubType , mapAndConvert (elements , e -> e ).toArray (Map []::new ), session );
773+ return getSfSqlArray (
774+ text , columnSubType , mapAndConvert (elements , e -> e ).toArray (Map []::new ));
785775 case Types .ARRAY :
786- return new SfSqlArray (
776+ return getSfSqlArray (
787777 text ,
788778 columnSubType ,
789779 mapAndConvert (elements , e -> ((List ) e ).stream ().toArray (Map []::new ))
790- .toArray (Map [][]::new ),
791- session );
780+ .toArray (Map [][]::new ));
792781 default :
793782 throw new SFException (
794783 queryId ,
@@ -800,6 +789,10 @@ private SfSqlArray getArrowArray(String text, List<Object> elements, int columnI
800789 }
801790 }
802791
792+ private SfSqlArray getSfSqlArray (String text , int columnSubType , Object [] array ) {
793+ return new SfSqlArray (text , columnSubType , array , session , objectMapper );
794+ }
795+
803796 private <T > Stream <T > mapAndConvert (List <Object > elements , Converter <T > converter ) {
804797 return elements .stream ()
805798 .map (
0 commit comments