@@ -59,35 +59,42 @@ int duckdb_read_stat_bind_handle_variable(int index, readstat_variable_t *variab
5959 logical_type = duckdb_create_logical_type (DUCKDB_TYPE_FLOAT );
6060 break ;
6161 case READSTAT_TYPE_DOUBLE :
62- if (
63- // SAS
64- !strcmp (format , "WEEKDATE" ) || !strcmp (format , "MMDDYY" ) || !strcmp (format , "DDMMYY" ) || !strcmp (format , "YYMMDD" ) || !strcmp (format , "DATE" ) || !strcmp (format , "DATE9" ) || !strcmp (format , "YYMMDD10" ) || !strcmp (format , "DDMMYYB" ) || !strcmp (format , "DDMMYYB10" ) || !strcmp (format , "DDMMYYC" ) || !strcmp (format , "DDMMYYC10" ) || !strcmp (format , "DDMMYYD" ) || !strcmp (format , "DDMMYYD10" ) || !strcmp (format , "DDMMYYN6" ) || !strcmp (format , "DDMMYYN8" ) || !strcmp (format , "DDMMYYP" ) || !strcmp (format , "DDMMYYP10" ) || !strcmp (format , "DDMMYYS" ) || !strcmp (format , "DDMMYYS10" ) || !strcmp (format , "MMDDYYB" ) || !strcmp (format , "MMDDYYB10" ) || !strcmp (format , "MMDDYYC" ) || !strcmp (format , "MMDDYYC10" ) || !strcmp (format , "MMDDYYD" ) || !strcmp (format , "MMDDYYD10" ) || !strcmp (format , "MMDDYYN6" ) || !strcmp (format , "MMDDYYN8" ) || !strcmp (format , "MMDDYYP" ) || !strcmp (format , "MMDDYYP10" ) || !strcmp (format , "MMDDYYS" ) || !strcmp (format , "MMDDYYS10" ) || !strcmp (format , "WEEKDATX" ) || !strcmp (format , "DTDATE" ) || !strcmp (format , "IS8601DA" ) || !strcmp (format , "E8601DA" ) || !strcmp (format , "B8601DA" ) || !strcmp (format , "YYMMDDB" ) || !strcmp (format , "YYMMDDD" ) || !strcmp (format , "YYMMDDN" ) || !strcmp (format , "YYMMDDP" ) || !strcmp (format , "YYMMDDS" )
65- // SPSS without duplicates from SAS
66- || !strcmp (format , "DATE8" ) || !strcmp (format , "DATE11" ) || !strcmp (format , "DATE12" ) || !strcmp (format , "ADATE" ) || !strcmp (format , "ADATE8" ) || !strcmp (format , "ADATE10" ) || !strcmp (format , "EDATE" ) || !strcmp (format , "EDATE8" ) || !strcmp (format , "EDATE10" ) || !strcmp (format , "JDATE" ) || !strcmp (format , "JDATE5" ) || !strcmp (format , "JDATE7" ) || !strcmp (format , "SDATE" ) || !strcmp (format , "SDATE8" ) || !strcmp (format , "SDATE10" )
67- // Stata
68- || !strcmp (format , "%td" ) || !strcmp (format , "%d" ) || !strcmp (format , "%tdD_m_Y" ) || !strcmp (format , "%tdCCYY-NN-DD" ))
62+ if (format != NULL )
6963 {
70- logical_type = duckdb_create_logical_type (DUCKDB_TYPE_DATE );
71- }
72- else if (
73- // SAS
74- !strcmp (format , "DATETIME" ) || !strcmp (format , "DATETIME18" ) || !strcmp (format , "DATETIME19" ) || !strcmp (format , "DATETIME20" ) || !strcmp (format , "DATETIME21" ) || !strcmp (format , "DATETIME22" ) || !strcmp (format , "E8601DT" ) || !strcmp (format , "DATEAMPM" ) || !strcmp (format , "MDYAMPM" ) || !strcmp (format , "IS8601DT" ) || !strcmp (format , "B8601DT" ) || !strcmp (format , "B8601DN" )
75- // SPSS without duplicates from SAS
76- || !strcmp (format , "DATETIME8" ) || !strcmp (format , "DATETIME17" ) || !strcmp (format , "DATETIME23.2" ) || !strcmp (format , "YMDHMS16" ) || !strcmp (format , "YMDHMS19" ) || !strcmp (format , "YMDHMS19.2" ) || !strcmp (format , "YMDHMS20" )
77- // Stata
78- || !strcmp (format , "%tC" ) || !strcmp (format , "%tc" ))
79- {
80- logical_type = duckdb_create_logical_type (DUCKDB_TYPE_TIMESTAMP );
81- }
82- else if (
83- // SAS
84- !strcmp (format , "TIME" ) || !strcmp (format , "HHMM" ) || !strcmp (format , "TIME20.3" ) || !strcmp (format , "TIME20" ) || !strcmp (format , "TIME5" ) || !strcmp (format , "TOD" ) || !strcmp (format , "TIMEAMPM" ) || !strcmp (format , "IS8601TM" ) || !strcmp (format , "E8601TM" ) || !strcmp (format , "B8601TM" )
85- // SPSS without duplicates from SAS
86- || !strcmp (format , "DTIME" ) || !strcmp (format , "TIME8" ) || !strcmp (format , "TIME5" ) || !strcmp (format , "TIME11.2" )
87- // Stata
88- || !strcmp (format , "%tcHH:MM:SS" ) || !strcmp (format , "%tcHH:MM" ))
89- {
90- logical_type = duckdb_create_logical_type (DUCKDB_TYPE_TIME );
64+ if (
65+ // SAS
66+ !strcmp (format , "WEEKDATE" ) || !strcmp (format , "MMDDYY" ) || !strcmp (format , "DDMMYY" ) || !strcmp (format , "YYMMDD" ) || !strcmp (format , "DATE" ) || !strcmp (format , "DATE9" ) || !strcmp (format , "YYMMDD10" ) || !strcmp (format , "DDMMYYB" ) || !strcmp (format , "DDMMYYB10" ) || !strcmp (format , "DDMMYYC" ) || !strcmp (format , "DDMMYYC10" ) || !strcmp (format , "DDMMYYD" ) || !strcmp (format , "DDMMYYD10" ) || !strcmp (format , "DDMMYYN6" ) || !strcmp (format , "DDMMYYN8" ) || !strcmp (format , "DDMMYYP" ) || !strcmp (format , "DDMMYYP10" ) || !strcmp (format , "DDMMYYS" ) || !strcmp (format , "DDMMYYS10" ) || !strcmp (format , "MMDDYYB" ) || !strcmp (format , "MMDDYYB10" ) || !strcmp (format , "MMDDYYC" ) || !strcmp (format , "MMDDYYC10" ) || !strcmp (format , "MMDDYYD" ) || !strcmp (format , "MMDDYYD10" ) || !strcmp (format , "MMDDYYN6" ) || !strcmp (format , "MMDDYYN8" ) || !strcmp (format , "MMDDYYP" ) || !strcmp (format , "MMDDYYP10" ) || !strcmp (format , "MMDDYYS" ) || !strcmp (format , "MMDDYYS10" ) || !strcmp (format , "WEEKDATX" ) || !strcmp (format , "DTDATE" ) || !strcmp (format , "IS8601DA" ) || !strcmp (format , "E8601DA" ) || !strcmp (format , "B8601DA" ) || !strcmp (format , "YYMMDDB" ) || !strcmp (format , "YYMMDDD" ) || !strcmp (format , "YYMMDDN" ) || !strcmp (format , "YYMMDDP" ) || !strcmp (format , "YYMMDDS" )
67+ // SPSS without duplicates from SAS
68+ || !strcmp (format , "DATE8" ) || !strcmp (format , "DATE11" ) || !strcmp (format , "DATE12" ) || !strcmp (format , "ADATE" ) || !strcmp (format , "ADATE8" ) || !strcmp (format , "ADATE10" ) || !strcmp (format , "EDATE" ) || !strcmp (format , "EDATE8" ) || !strcmp (format , "EDATE10" ) || !strcmp (format , "JDATE" ) || !strcmp (format , "JDATE5" ) || !strcmp (format , "JDATE7" ) || !strcmp (format , "SDATE" ) || !strcmp (format , "SDATE8" ) || !strcmp (format , "SDATE10" )
69+ // Stata
70+ || !strcmp (format , "%td" ) || !strcmp (format , "%d" ) || !strcmp (format , "%tdD_m_Y" ) || !strcmp (format , "%tdCCYY-NN-DD" ))
71+ {
72+ logical_type = duckdb_create_logical_type (DUCKDB_TYPE_DATE );
73+ }
74+ else if (
75+ // SAS
76+ !strcmp (format , "DATETIME" ) || !strcmp (format , "DATETIME18" ) || !strcmp (format , "DATETIME19" ) || !strcmp (format , "DATETIME20" ) || !strcmp (format , "DATETIME21" ) || !strcmp (format , "DATETIME22" ) || !strcmp (format , "E8601DT" ) || !strcmp (format , "DATEAMPM" ) || !strcmp (format , "MDYAMPM" ) || !strcmp (format , "IS8601DT" ) || !strcmp (format , "B8601DT" ) || !strcmp (format , "B8601DN" )
77+ // SPSS without duplicates from SAS
78+ || !strcmp (format , "DATETIME8" ) || !strcmp (format , "DATETIME17" ) || !strcmp (format , "DATETIME23.2" ) || !strcmp (format , "YMDHMS16" ) || !strcmp (format , "YMDHMS19" ) || !strcmp (format , "YMDHMS19.2" ) || !strcmp (format , "YMDHMS20" )
79+ // Stata
80+ || !strcmp (format , "%tC" ) || !strcmp (format , "%tc" ))
81+ {
82+ logical_type = duckdb_create_logical_type (DUCKDB_TYPE_TIMESTAMP );
83+ }
84+ else if (
85+ // SAS
86+ !strcmp (format , "TIME" ) || !strcmp (format , "HHMM" ) || !strcmp (format , "TIME20.3" ) || !strcmp (format , "TIME20" ) || !strcmp (format , "TIME5" ) || !strcmp (format , "TOD" ) || !strcmp (format , "TIMEAMPM" ) || !strcmp (format , "IS8601TM" ) || !strcmp (format , "E8601TM" ) || !strcmp (format , "B8601TM" )
87+ // SPSS without duplicates from SAS
88+ || !strcmp (format , "DTIME" ) || !strcmp (format , "TIME8" ) || !strcmp (format , "TIME5" ) || !strcmp (format , "TIME11.2" )
89+ // Stata
90+ || !strcmp (format , "%tcHH:MM:SS" ) || !strcmp (format , "%tcHH:MM" ))
91+ {
92+ logical_type = duckdb_create_logical_type (DUCKDB_TYPE_TIME );
93+ }
94+ else
95+ {
96+ logical_type = duckdb_create_logical_type (DUCKDB_TYPE_DOUBLE );
97+ }
9198 }
9299 else
93100 {
@@ -375,41 +382,50 @@ int duckdb_read_stat_handle_value(int obs_index, readstat_variable_t *variable,
375382 case READSTAT_TYPE_DOUBLE :
376383 {
377384 double double_value = readstat_double_value (value );
378- if (
379- // SAS
380- !strcmp (format , "WEEKDATE" ) || !strcmp (format , "MMDDYY" ) || !strcmp (format , "DDMMYY" ) || !strcmp (format , "YYMMDD" ) || !strcmp (format , "DATE" ) || !strcmp (format , "DATE9" ) || !strcmp (format , "YYMMDD10" ) || !strcmp (format , "DDMMYYB" ) || !strcmp (format , "DDMMYYB10" ) || !strcmp (format , "DDMMYYC" ) || !strcmp (format , "DDMMYYC10" ) || !strcmp (format , "DDMMYYD" ) || !strcmp (format , "DDMMYYD10" ) || !strcmp (format , "DDMMYYN6" ) || !strcmp (format , "DDMMYYN8" ) || !strcmp (format , "DDMMYYP" ) || !strcmp (format , "DDMMYYP10" ) || !strcmp (format , "DDMMYYS" ) || !strcmp (format , "DDMMYYS10" ) || !strcmp (format , "MMDDYYB" ) || !strcmp (format , "MMDDYYB10" ) || !strcmp (format , "MMDDYYC" ) || !strcmp (format , "MMDDYYC10" ) || !strcmp (format , "MMDDYYD" ) || !strcmp (format , "MMDDYYD10" ) || !strcmp (format , "MMDDYYN6" ) || !strcmp (format , "MMDDYYN8" ) || !strcmp (format , "MMDDYYP" ) || !strcmp (format , "MMDDYYP10" ) || !strcmp (format , "MMDDYYS" ) || !strcmp (format , "MMDDYYS10" ) || !strcmp (format , "WEEKDATX" ) || !strcmp (format , "DTDATE" ) || !strcmp (format , "IS8601DA" ) || !strcmp (format , "E8601DA" ) || !strcmp (format , "B8601DA" ) || !strcmp (format , "YYMMDDB" ) || !strcmp (format , "YYMMDDD" ) || !strcmp (format , "YYMMDDN" ) || !strcmp (format , "YYMMDDP" ) || !strcmp (format , "YYMMDDS" )
381- // SPSS without duplicates from SAS
382- || !strcmp (format , "DATE8" ) || !strcmp (format , "DATE11" ) || !strcmp (format , "DATE12" ) || !strcmp (format , "ADATE" ) || !strcmp (format , "ADATE8" ) || !strcmp (format , "ADATE10" ) || !strcmp (format , "EDATE" ) || !strcmp (format , "EDATE8" ) || !strcmp (format , "EDATE10" ) || !strcmp (format , "JDATE" ) || !strcmp (format , "JDATE5" ) || !strcmp (format , "JDATE7" ) || !strcmp (format , "SDATE" ) || !strcmp (format , "SDATE8" ) || !strcmp (format , "SDATE10" )
383- // Stata
384- || !strcmp (format , "%td" ) || !strcmp (format , "%d" ) || !strcmp (format , "%tdD_m_Y" ) || !strcmp (format , "%tdCCYY-NN-DD" ))
385- {
386- duckdb_date converted = duckdb_read_stat_to_date (double_value , bind_data -> file_format );
387- duckdb_date * output_value_timestamp = (duckdb_date * )duckdb_vector_get_data (vector );
388- output_value_timestamp [obs_index ] = converted ;
389- }
390- else if (
391- // SAS
392- !strcmp (format , "DATETIME" ) || !strcmp (format , "DATETIME18" ) || !strcmp (format , "DATETIME19" ) || !strcmp (format , "DATETIME20" ) || !strcmp (format , "DATETIME21" ) || !strcmp (format , "DATETIME22" ) || !strcmp (format , "E8601DT" ) || !strcmp (format , "DATEAMPM" ) || !strcmp (format , "MDYAMPM" ) || !strcmp (format , "IS8601DT" ) || !strcmp (format , "B8601DT" ) || !strcmp (format , "B8601DN" )
393- // SPSS without duplicates from SAS
394- || !strcmp (format , "DATETIME8" ) || !strcmp (format , "DATETIME17" ) || !strcmp (format , "DATETIME23.2" ) || !strcmp (format , "YMDHMS16" ) || !strcmp (format , "YMDHMS19" ) || !strcmp (format , "YMDHMS19.2" ) || !strcmp (format , "YMDHMS20" )
395- // Stata
396- || !strcmp (format , "%tC" ) || !strcmp (format , "%tc" ))
397- {
398- duckdb_timestamp converted = duckdb_read_stat_to_timestamp (double_value , bind_data -> file_format );
399- duckdb_timestamp * output_value_timestamp = (duckdb_timestamp * )duckdb_vector_get_data (vector );
400- output_value_timestamp [obs_index ] = converted ;
401- }
402- else if (
403- // SAS
404- !strcmp (format , "TIME" ) || !strcmp (format , "HHMM" ) || !strcmp (format , "TIME20.3" ) || !strcmp (format , "TIME20" ) || !strcmp (format , "TIME5" ) || !strcmp (format , "TOD" ) || !strcmp (format , "TIMEAMPM" ) || !strcmp (format , "IS8601TM" ) || !strcmp (format , "E8601TM" ) || !strcmp (format , "B8601TM" )
405- // SPSS without duplicates from SAS
406- || !strcmp (format , "DTIME" ) || !strcmp (format , "TIME8" ) || !strcmp (format , "TIME5" ) || !strcmp (format , "TIME11.2" )
407- // Stata
408- || !strcmp (format , "%tcHH:MM:SS" ) || !strcmp (format , "%tcHH:MM" ))
385+
386+ if (format != NULL )
409387 {
410- duckdb_time converted = duckdb_read_stat_to_time (double_value , bind_data -> file_format );
411- duckdb_time * output_value_timestamp = (duckdb_time * )duckdb_vector_get_data (vector );
412- output_value_timestamp [obs_index ] = converted ;
388+ if (
389+ // SAS
390+ !strcmp (format , "WEEKDATE" ) || !strcmp (format , "MMDDYY" ) || !strcmp (format , "DDMMYY" ) || !strcmp (format , "YYMMDD" ) || !strcmp (format , "DATE" ) || !strcmp (format , "DATE9" ) || !strcmp (format , "YYMMDD10" ) || !strcmp (format , "DDMMYYB" ) || !strcmp (format , "DDMMYYB10" ) || !strcmp (format , "DDMMYYC" ) || !strcmp (format , "DDMMYYC10" ) || !strcmp (format , "DDMMYYD" ) || !strcmp (format , "DDMMYYD10" ) || !strcmp (format , "DDMMYYN6" ) || !strcmp (format , "DDMMYYN8" ) || !strcmp (format , "DDMMYYP" ) || !strcmp (format , "DDMMYYP10" ) || !strcmp (format , "DDMMYYS" ) || !strcmp (format , "DDMMYYS10" ) || !strcmp (format , "MMDDYYB" ) || !strcmp (format , "MMDDYYB10" ) || !strcmp (format , "MMDDYYC" ) || !strcmp (format , "MMDDYYC10" ) || !strcmp (format , "MMDDYYD" ) || !strcmp (format , "MMDDYYD10" ) || !strcmp (format , "MMDDYYN6" ) || !strcmp (format , "MMDDYYN8" ) || !strcmp (format , "MMDDYYP" ) || !strcmp (format , "MMDDYYP10" ) || !strcmp (format , "MMDDYYS" ) || !strcmp (format , "MMDDYYS10" ) || !strcmp (format , "WEEKDATX" ) || !strcmp (format , "DTDATE" ) || !strcmp (format , "IS8601DA" ) || !strcmp (format , "E8601DA" ) || !strcmp (format , "B8601DA" ) || !strcmp (format , "YYMMDDB" ) || !strcmp (format , "YYMMDDD" ) || !strcmp (format , "YYMMDDN" ) || !strcmp (format , "YYMMDDP" ) || !strcmp (format , "YYMMDDS" )
391+ // SPSS without duplicates from SAS
392+ || !strcmp (format , "DATE8" ) || !strcmp (format , "DATE11" ) || !strcmp (format , "DATE12" ) || !strcmp (format , "ADATE" ) || !strcmp (format , "ADATE8" ) || !strcmp (format , "ADATE10" ) || !strcmp (format , "EDATE" ) || !strcmp (format , "EDATE8" ) || !strcmp (format , "EDATE10" ) || !strcmp (format , "JDATE" ) || !strcmp (format , "JDATE5" ) || !strcmp (format , "JDATE7" ) || !strcmp (format , "SDATE" ) || !strcmp (format , "SDATE8" ) || !strcmp (format , "SDATE10" )
393+ // Stata
394+ || !strcmp (format , "%td" ) || !strcmp (format , "%d" ) || !strcmp (format , "%tdD_m_Y" ) || !strcmp (format , "%tdCCYY-NN-DD" ))
395+ {
396+ duckdb_date converted = duckdb_read_stat_to_date (double_value , bind_data -> file_format );
397+ duckdb_date * output_value_timestamp = (duckdb_date * )duckdb_vector_get_data (vector );
398+ output_value_timestamp [obs_index ] = converted ;
399+ }
400+ else if (
401+ // SAS
402+ !strcmp (format , "DATETIME" ) || !strcmp (format , "DATETIME18" ) || !strcmp (format , "DATETIME19" ) || !strcmp (format , "DATETIME20" ) || !strcmp (format , "DATETIME21" ) || !strcmp (format , "DATETIME22" ) || !strcmp (format , "E8601DT" ) || !strcmp (format , "DATEAMPM" ) || !strcmp (format , "MDYAMPM" ) || !strcmp (format , "IS8601DT" ) || !strcmp (format , "B8601DT" ) || !strcmp (format , "B8601DN" )
403+ // SPSS without duplicates from SAS
404+ || !strcmp (format , "DATETIME8" ) || !strcmp (format , "DATETIME17" ) || !strcmp (format , "DATETIME23.2" ) || !strcmp (format , "YMDHMS16" ) || !strcmp (format , "YMDHMS19" ) || !strcmp (format , "YMDHMS19.2" ) || !strcmp (format , "YMDHMS20" )
405+ // Stata
406+ || !strcmp (format , "%tC" ) || !strcmp (format , "%tc" ))
407+ {
408+ duckdb_timestamp converted = duckdb_read_stat_to_timestamp (double_value , bind_data -> file_format );
409+ duckdb_timestamp * output_value_timestamp = (duckdb_timestamp * )duckdb_vector_get_data (vector );
410+ output_value_timestamp [obs_index ] = converted ;
411+ }
412+ else if (
413+ // SAS
414+ !strcmp (format , "TIME" ) || !strcmp (format , "HHMM" ) || !strcmp (format , "TIME20.3" ) || !strcmp (format , "TIME20" ) || !strcmp (format , "TIME5" ) || !strcmp (format , "TOD" ) || !strcmp (format , "TIMEAMPM" ) || !strcmp (format , "IS8601TM" ) || !strcmp (format , "E8601TM" ) || !strcmp (format , "B8601TM" )
415+ // SPSS without duplicates from SAS
416+ || !strcmp (format , "DTIME" ) || !strcmp (format , "TIME8" ) || !strcmp (format , "TIME5" ) || !strcmp (format , "TIME11.2" )
417+ // Stata
418+ || !strcmp (format , "%tcHH:MM:SS" ) || !strcmp (format , "%tcHH:MM" ))
419+ {
420+ duckdb_time converted = duckdb_read_stat_to_time (double_value , bind_data -> file_format );
421+ duckdb_time * output_value_timestamp = (duckdb_time * )duckdb_vector_get_data (vector );
422+ output_value_timestamp [obs_index ] = converted ;
423+ }
424+ else
425+ {
426+ double * output_value = (double * )duckdb_vector_get_data (vector );
427+ output_value [obs_index ] = double_value ;
428+ }
413429 }
414430 else
415431 {
0 commit comments