@@ -68,6 +68,7 @@ void CArrowTableIterator::convertIfNeeded(ArrowSchema* columnSchema,
6868 case SnowflakeType::Type::DATE:
6969 case SnowflakeType::Type::REAL:
7070 case SnowflakeType::Type::TEXT:
71+ case SnowflakeType::Type::INTERVAL_YEAR_MONTH:
7172 case SnowflakeType::Type::VARIANT:
7273 case SnowflakeType::Type::VECTOR: {
7374 // Do not need to convert
@@ -174,6 +175,24 @@ void CArrowTableIterator::convertIfNeeded(ArrowSchema* columnSchema,
174175 break ;
175176 }
176177
178+ case SnowflakeType::Type::INTERVAL_DAY_TIME: {
179+ int scale = 9 ;
180+ if (metadata != nullptr ) {
181+ struct ArrowStringView scaleString = ArrowCharView (nullptr );
182+ returnCode = ArrowMetadataGetValue (metadata, ArrowCharView (" scale" ),
183+ &scaleString);
184+ SF_CHECK_ARROW_RC (returnCode,
185+ " [Snowflake Exception] error getting 'scale' "
186+ " from Arrow metadata, error code: %d" ,
187+ returnCode);
188+ scale =
189+ std::stoi (std::string (scaleString.data , scaleString.size_bytes ));
190+ }
191+ convertIntervalDayTimeColumn_nanoarrow (&columnSchemaView, columnArray,
192+ scale);
193+ break ;
194+ }
195+
177196 case SnowflakeType::Type::TIME: {
178197 int scale = 9 ;
179198 if (metadata != nullptr ) {
@@ -503,6 +522,76 @@ void CArrowTableIterator::
503522 ArrowArrayMove (newArray, columnArray->array );
504523}
505524
525+ void CArrowTableIterator::convertIntervalDayTimeColumn_nanoarrow (
526+ ArrowSchemaView* field, ArrowArrayView* columnArray, const int scale) {
527+ int returnCode = 0 ;
528+ nanoarrow::UniqueSchema newUniqueField;
529+ nanoarrow::UniqueArray newUniqueArray;
530+ ArrowSchema* newSchema = newUniqueField.get ();
531+ ArrowArray* newArray = newUniqueArray.get ();
532+ ArrowError error;
533+
534+ // create new schema
535+ ArrowSchemaInit (newSchema);
536+ newSchema->flags &=
537+ (field->schema ->flags & ARROW_FLAG_NULLABLE); // map to nullable()
538+
539+ returnCode = ArrowSchemaSetTypeDateTime (newSchema, NANOARROW_TYPE_DURATION,
540+ NANOARROW_TIME_UNIT_NANO, NULL );
541+ SF_CHECK_ARROW_RC (returnCode,
542+ " [Snowflake Exception] error setting arrow schema type "
543+ " DateTime, error code: %d" ,
544+ returnCode);
545+
546+ returnCode = ArrowSchemaSetName (newSchema, field->schema ->name );
547+ SF_CHECK_ARROW_RC (
548+ returnCode,
549+ " [Snowflake Exception] error setting schema name, error code: %d" ,
550+ returnCode);
551+
552+ returnCode = ArrowArrayInitFromSchema (newArray, newSchema, &error);
553+ SF_CHECK_ARROW_RC (returnCode,
554+ " [Snowflake Exception] error initializing ArrowArrayView "
555+ " from schema : %s, error code: %d" ,
556+ ArrowErrorMessage (&error), returnCode);
557+
558+ returnCode = ArrowArrayStartAppending (newArray);
559+ SF_CHECK_ARROW_RC (
560+ returnCode,
561+ " [Snowflake Exception] error appending arrow array, error code: %d" ,
562+ returnCode);
563+
564+ for (int64_t rowIdx = 0 ; rowIdx < columnArray->array ->length ; rowIdx++) {
565+ if (ArrowArrayViewIsNull (columnArray, rowIdx)) {
566+ returnCode = ArrowArrayAppendNull (newArray, 1 );
567+ SF_CHECK_ARROW_RC (returnCode,
568+ " [Snowflake Exception] error appending null to arrow "
569+ " array, error code: %d" ,
570+ returnCode);
571+ } else {
572+ ArrowDecimal arrowDecimal;
573+ ArrowDecimalInit (&arrowDecimal, 128 , 38 , 0 );
574+ ArrowArrayViewGetDecimalUnsafe (columnArray, rowIdx, &arrowDecimal);
575+ auto originalVal = ArrowDecimalGetIntUnsafe (&arrowDecimal);
576+ returnCode = ArrowArrayAppendInt (newArray, originalVal);
577+ SF_CHECK_ARROW_RC (returnCode,
578+ " [Snowflake Exception] error appending int to arrow "
579+ " array, error code: %d" ,
580+ returnCode);
581+ }
582+ }
583+
584+ returnCode = ArrowArrayFinishBuildingDefault (newArray, &error);
585+ SF_CHECK_ARROW_RC (returnCode,
586+ " [Snowflake Exception] error finishing building arrow "
587+ " array: %s, error code: %d" ,
588+ ArrowErrorMessage (&error), returnCode);
589+ field->schema ->release (field->schema );
590+ ArrowSchemaMove (newSchema, field->schema );
591+ columnArray->array ->release (columnArray->array );
592+ ArrowArrayMove (newArray, columnArray->array );
593+ }
594+
506595void CArrowTableIterator::convertTimeColumn_nanoarrow (
507596 ArrowSchemaView* field, ArrowArrayView* columnArray, const int scale) {
508597 int returnCode = 0 ;
0 commit comments