@@ -69,7 +69,6 @@ void CArrowTableIterator::convertIfNeeded(ArrowSchema* columnSchema,
6969 case SnowflakeType::Type::REAL:
7070 case SnowflakeType::Type::TEXT:
7171 case SnowflakeType::Type::INTERVAL_YEAR_MONTH:
72- case SnowflakeType::Type::INTERVAL_DAY_TIME:
7372 case SnowflakeType::Type::VARIANT:
7473 case SnowflakeType::Type::VECTOR: {
7574 // Do not need to convert
@@ -176,6 +175,24 @@ void CArrowTableIterator::convertIfNeeded(ArrowSchema* columnSchema,
176175 break ;
177176 }
178177
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+
179196 case SnowflakeType::Type::TIME: {
180197 int scale = 9 ;
181198 if (metadata != nullptr ) {
@@ -505,6 +522,73 @@ void CArrowTableIterator::
505522 ArrowArrayMove (newArray, columnArray->array );
506523}
507524
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+ auto originalVal = ArrowArrayViewGetIntUnsafe (columnArray, rowIdx);
573+ returnCode = ArrowArrayAppendInt (newArray, originalVal);
574+ SF_CHECK_ARROW_RC (returnCode,
575+ " [Snowflake Exception] error appending int to arrow "
576+ " array, error code: %d" ,
577+ returnCode);
578+ }
579+ }
580+
581+ returnCode = ArrowArrayFinishBuildingDefault (newArray, &error);
582+ SF_CHECK_ARROW_RC (returnCode,
583+ " [Snowflake Exception] error finishing building arrow "
584+ " array: %s, error code: %d" ,
585+ ArrowErrorMessage (&error), returnCode);
586+ field->schema ->release (field->schema );
587+ ArrowSchemaMove (newSchema, field->schema );
588+ columnArray->array ->release (columnArray->array );
589+ ArrowArrayMove (newArray, columnArray->array );
590+ }
591+
508592void CArrowTableIterator::convertTimeColumn_nanoarrow (
509593 ArrowSchemaView* field, ArrowArrayView* columnArray, const int scale) {
510594 int returnCode = 0 ;
0 commit comments