Skip to content

Commit e576837

Browse files
committed
SNOW-2346552: added more coverage
1 parent af972cf commit e576837

2 files changed

Lines changed: 303 additions & 3 deletions

File tree

src/snowflake/snowpark/dataframe.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5326,11 +5326,19 @@ def format_day_time_interval(total_seconds_float: float) -> str:
53265326
return f"{sign}{total_minutes}"
53275327
else: # TO SECOND
53285328
if remaining_secs == int(remaining_secs):
5329-
return f"{sign}{total_minutes:02d}:{int(remaining_secs):02d}"
5329+
minutes_str = (
5330+
f"{total_minutes:02d}"
5331+
if total_minutes < 10
5332+
else f"{total_minutes}"
5333+
)
5334+
return f"{sign}{minutes_str}:{int(remaining_secs):02d}"
53305335
else:
5331-
return (
5332-
f"{sign}{total_minutes:02d}:{remaining_secs:06.3f}"
5336+
minutes_str = (
5337+
f"{total_minutes:02d}"
5338+
if total_minutes < 10
5339+
else f"{total_minutes}"
53335340
)
5341+
return f"{sign}{minutes_str}:{remaining_secs:06.3f}"
53345342
else:
53355343
# Fallback to basic format
53365344
if seconds == int(seconds):

tests/integ/test_dataframe.py

Lines changed: 292 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2708,6 +2708,298 @@ def test_show_interval_formatting(session):
27082708
"""
27092709
)
27102710

2711+
# Year-month intervals with dash format
2712+
df = session.sql("SELECT INTERVAL '1-6' YEAR TO MONTH as year_to_month")
2713+
assert df._show_string_spark(truncate=False) == dedent(
2714+
"""\
2715+
+----------------------------+
2716+
|"YEAR_TO_MONTH" |
2717+
+----------------------------+
2718+
|INTERVAL '1-6' YEAR TO MONTH|
2719+
+----------------------------+
2720+
"""
2721+
)
2722+
2723+
# Negative year-month intervals
2724+
df = session.sql("SELECT INTERVAL '-2-3' YEAR TO MONTH as negative_year_month")
2725+
assert df._show_string_spark(truncate=False) == dedent(
2726+
"""\
2727+
+-----------------------------+
2728+
|"NEGATIVE_YEAR_MONTH" |
2729+
+-----------------------------+
2730+
|INTERVAL '-2-3' YEAR TO MONTH|
2731+
+-----------------------------+
2732+
"""
2733+
)
2734+
2735+
# Single year intervals (not YEAR TO MONTH)
2736+
df = session.sql("SELECT INTERVAL '5' YEAR as single_year")
2737+
assert df._show_string_spark(truncate=False) == dedent(
2738+
"""\
2739+
+-----------------+
2740+
|"SINGLE_YEAR" |
2741+
+-----------------+
2742+
|INTERVAL '5' YEAR|
2743+
+-----------------+
2744+
"""
2745+
)
2746+
2747+
# Single month intervals (not YEAR TO MONTH)
2748+
df = session.sql("SELECT INTERVAL '8' MONTH as single_month")
2749+
assert df._show_string_spark(truncate=False) == dedent(
2750+
"""\
2751+
+------------------+
2752+
|"SINGLE_MONTH" |
2753+
+------------------+
2754+
|INTERVAL '8' MONTH|
2755+
+------------------+
2756+
"""
2757+
)
2758+
2759+
# Zero year-month intervals
2760+
df = session.sql("SELECT INTERVAL '0-0' YEAR TO MONTH as zero_year_month")
2761+
assert df._show_string_spark(truncate=False) == dedent(
2762+
"""\
2763+
+----------------------------+
2764+
|"ZERO_YEAR_MONTH" |
2765+
+----------------------------+
2766+
|INTERVAL '0-0' YEAR TO MONTH|
2767+
+----------------------------+
2768+
"""
2769+
)
2770+
2771+
# Very large day intervals
2772+
df = session.sql("SELECT INTERVAL '999' DAY as large_day")
2773+
assert df._show_string_spark(truncate=False) == dedent(
2774+
"""\
2775+
+------------------+
2776+
|"LARGE_DAY" |
2777+
+------------------+
2778+
|INTERVAL '999' DAY|
2779+
+------------------+
2780+
"""
2781+
)
2782+
2783+
# Minute to second with large minutes
2784+
df = session.sql(
2785+
"SELECT INTERVAL '150:30' MINUTE TO SECOND as large_minute_to_second"
2786+
)
2787+
assert df._show_string_spark(truncate=False) == dedent(
2788+
"""\
2789+
+----------------------------------+
2790+
|"LARGE_MINUTE_TO_SECOND" |
2791+
+----------------------------------+
2792+
|INTERVAL '150:30' MINUTE TO SECOND|
2793+
+----------------------------------+
2794+
"""
2795+
)
2796+
2797+
# Day to second with fractional seconds
2798+
df = session.sql(
2799+
"SELECT INTERVAL '5 10:20:30.123' DAY TO SECOND as day_to_second_frac"
2800+
)
2801+
assert df._show_string_spark(truncate=False) == dedent(
2802+
"""\
2803+
+---------------------------------------+
2804+
|"DAY_TO_SECOND_FRAC" |
2805+
+---------------------------------------+
2806+
|INTERVAL '5 10:20:30.123' DAY TO SECOND|
2807+
+---------------------------------------+
2808+
"""
2809+
)
2810+
2811+
# Hour to second with zero padding in multi-field
2812+
df = session.sql("SELECT INTERVAL '05:00:00' HOUR TO SECOND as hour_zero_padded")
2813+
assert df._show_string_spark(truncate=False) == dedent(
2814+
"""\
2815+
+----------------------------------+
2816+
|"HOUR_ZERO_PADDED" |
2817+
+----------------------------------+
2818+
|INTERVAL '05:00:00' HOUR TO SECOND|
2819+
+----------------------------------+
2820+
"""
2821+
)
2822+
2823+
# Negative day-time intervals
2824+
df = session.sql("SELECT INTERVAL '-3 05:30:45' DAY TO SECOND as negative_complex")
2825+
assert df._show_string_spark(truncate=False) == dedent(
2826+
"""\
2827+
+------------------------------------+
2828+
|"NEGATIVE_COMPLEX" |
2829+
+------------------------------------+
2830+
|INTERVAL '-3 05:30:45' DAY TO SECOND|
2831+
+------------------------------------+
2832+
"""
2833+
)
2834+
2835+
# Additional edge cases for complete coverage based on actual Snowflake output
2836+
2837+
# Year-month compound intervals
2838+
df = session.sql("SELECT INTERVAL '1-6' YEAR TO MONTH as year_to_month")
2839+
assert df._show_string_spark(truncate=False) == dedent(
2840+
"""\
2841+
+----------------------------+
2842+
|"YEAR_TO_MONTH" |
2843+
+----------------------------+
2844+
|INTERVAL '1-6' YEAR TO MONTH|
2845+
+----------------------------+
2846+
"""
2847+
)
2848+
2849+
df = session.sql("SELECT INTERVAL '-2-3' YEAR TO MONTH as negative_year_month")
2850+
assert df._show_string_spark(truncate=False) == dedent(
2851+
"""\
2852+
+-----------------------------+
2853+
|"NEGATIVE_YEAR_MONTH" |
2854+
+-----------------------------+
2855+
|INTERVAL '-2-3' YEAR TO MONTH|
2856+
+-----------------------------+
2857+
"""
2858+
)
2859+
2860+
# Single field intervals
2861+
df = session.sql("SELECT INTERVAL '5' YEAR as single_year")
2862+
assert df._show_string_spark(truncate=False) == dedent(
2863+
"""\
2864+
+-----------------+
2865+
|"SINGLE_YEAR" |
2866+
+-----------------+
2867+
|INTERVAL '5' YEAR|
2868+
+-----------------+
2869+
"""
2870+
)
2871+
2872+
df = session.sql("SELECT INTERVAL '8' MONTH as single_month")
2873+
assert df._show_string_spark(truncate=False) == dedent(
2874+
"""\
2875+
+------------------+
2876+
|"SINGLE_MONTH" |
2877+
+------------------+
2878+
|INTERVAL '8' MONTH|
2879+
+------------------+
2880+
"""
2881+
)
2882+
2883+
df = session.sql("SELECT INTERVAL '0-0' YEAR TO MONTH as zero_year_month")
2884+
assert df._show_string_spark(truncate=False) == dedent(
2885+
"""\
2886+
+----------------------------+
2887+
|"ZERO_YEAR_MONTH" |
2888+
+----------------------------+
2889+
|INTERVAL '0-0' YEAR TO MONTH|
2890+
+----------------------------+
2891+
"""
2892+
)
2893+
2894+
# Large day interval
2895+
df = session.sql("SELECT INTERVAL '999' DAY as large_day")
2896+
assert df._show_string_spark(truncate=False) == dedent(
2897+
"""\
2898+
+------------------+
2899+
|"LARGE_DAY" |
2900+
+------------------+
2901+
|INTERVAL '999' DAY|
2902+
+------------------+
2903+
"""
2904+
)
2905+
2906+
# Large minute to second interval (tests the bug we just fixed)
2907+
df = session.sql(
2908+
"SELECT INTERVAL '150:30' MINUTE TO SECOND as large_minute_to_second"
2909+
)
2910+
assert df._show_string_spark(truncate=False) == dedent(
2911+
"""\
2912+
+----------------------------------+
2913+
|"LARGE_MINUTE_TO_SECOND" |
2914+
+----------------------------------+
2915+
|INTERVAL '150:30' MINUTE TO SECOND|
2916+
+----------------------------------+
2917+
"""
2918+
)
2919+
2920+
# Day to second with fractional seconds
2921+
df = session.sql(
2922+
"SELECT INTERVAL '5 10:20:30.123' DAY TO SECOND as day_to_second_frac"
2923+
)
2924+
assert df._show_string_spark(truncate=False) == dedent(
2925+
"""\
2926+
+---------------------------------------+
2927+
|"DAY_TO_SECOND_FRAC" |
2928+
+---------------------------------------+
2929+
|INTERVAL '5 10:20:30.123' DAY TO SECOND|
2930+
+---------------------------------------+
2931+
"""
2932+
)
2933+
2934+
# Hour to second with zero padding
2935+
df = session.sql("SELECT INTERVAL '05:00:00' HOUR TO SECOND as hour_zero_padded")
2936+
assert df._show_string_spark(truncate=False) == dedent(
2937+
"""\
2938+
+----------------------------------+
2939+
|"HOUR_ZERO_PADDED" |
2940+
+----------------------------------+
2941+
|INTERVAL '05:00:00' HOUR TO SECOND|
2942+
+----------------------------------+
2943+
"""
2944+
)
2945+
2946+
# Negative complex interval
2947+
df = session.sql("SELECT INTERVAL '-3 05:30:45' DAY TO SECOND as negative_complex")
2948+
assert df._show_string_spark(truncate=False) == dedent(
2949+
"""\
2950+
+------------------------------------+
2951+
|"NEGATIVE_COMPLEX" |
2952+
+------------------------------------+
2953+
|INTERVAL '-3 05:30:45' DAY TO SECOND|
2954+
+------------------------------------+
2955+
"""
2956+
)
2957+
2958+
# Positive prefix intervals
2959+
df = session.sql("SELECT INTERVAL '+2-5' YEAR TO MONTH as positive_year_month")
2960+
assert df._show_string_spark(truncate=False) == dedent(
2961+
"""\
2962+
+----------------------------+
2963+
|"POSITIVE_YEAR_MONTH" |
2964+
+----------------------------+
2965+
|INTERVAL '2-5' YEAR TO MONTH|
2966+
+----------------------------+
2967+
"""
2968+
)
2969+
2970+
df = session.sql("SELECT INTERVAL '+3' YEAR as positive_year")
2971+
assert df._show_string_spark(truncate=False) == dedent(
2972+
"""\
2973+
+-----------------+
2974+
|"POSITIVE_YEAR" |
2975+
+-----------------+
2976+
|INTERVAL '3' YEAR|
2977+
+-----------------+
2978+
"""
2979+
)
2980+
2981+
df = session.sql("SELECT INTERVAL '+15' MONTH as positive_month")
2982+
assert df._show_string_spark(truncate=False) == dedent(
2983+
"""\
2984+
+-------------------+
2985+
|"POSITIVE_MONTH" |
2986+
+-------------------+
2987+
|INTERVAL '15' MONTH|
2988+
+-------------------+
2989+
"""
2990+
)
2991+
2992+
df = session.sql("SELECT INTERVAL '-5' YEAR as negative_single_year")
2993+
assert df._show_string_spark(truncate=False) == dedent(
2994+
"""\
2995+
+----------------------+
2996+
|"NEGATIVE_SINGLE_YEAR"|
2997+
+----------------------+
2998+
|INTERVAL '-5' YEAR |
2999+
+----------------------+
3000+
"""
3001+
)
3002+
27113003

27123004
@pytest.mark.parametrize("data", [[0, 1, 2, 3], ["", "a"], [False, True], [None]])
27133005
def test_create_dataframe_with_single_value(session, data):

0 commit comments

Comments
 (0)