@@ -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