1#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
5pub struct PlanOptions {
6 pub string_policy: StringPolicy,
8 pub binary_policy: BinaryPolicy,
10 pub timezone_policy: TimezonePolicy,
12 pub nanosecond_policy: NanosecondPolicy,
14 pub uint64_policy: UInt64Policy,
16 pub decimal_policy: DecimalPolicy,
18 pub decimal256_policy: Decimal256Policy,
20 pub float_policy: FloatPolicy,
22 pub date64_policy: Date64Policy,
24}
25
26#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
28pub enum StringPolicy {
29 #[default]
31 NVarCharMax,
32 NVarChar(usize),
34 ObservedNVarChar,
36}
37
38#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
40pub enum BinaryPolicy {
41 #[default]
43 VarBinaryMax,
44 VarBinary(usize),
46 ObservedVarBinary,
48}
49
50#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
52pub enum TimezonePolicy {
53 #[default]
55 Reject,
56 DateTimeOffset,
58 NormalizeUtcDateTime2,
60}
61
62#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
64pub enum NanosecondPolicy {
65 #[default]
67 RejectNon100ns,
68 RoundTo100ns,
70 TruncateTo100ns,
72}
73
74#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
76pub enum UInt64Policy {
77 #[default]
79 Reject,
80 Decimal20_0,
82 CheckedBigInt,
84}
85
86#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
88pub enum DecimalPolicy {
89 #[default]
91 RejectNegativeScale,
92 NormalizeNegativeScale,
94}
95
96#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
98pub enum Decimal256Policy {
99 #[default]
101 CheckedDowncast,
102 Reject,
104}
105
106#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
108pub enum FloatPolicy {
109 #[default]
111 RejectNonFinite,
112}
113
114#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
116pub enum Date64Policy {
117 #[default]
119 RejectNonMidnight,
120 TimestampDateTime2,
122}
123
124#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
126pub enum SchemaCheck {
127 #[default]
129 Strict,
130}
131
132#[cfg(test)]
133mod tests {
134 use super::{
135 BinaryPolicy, Date64Policy, Decimal256Policy, DecimalPolicy, FloatPolicy, NanosecondPolicy,
136 PlanOptions, SchemaCheck, StringPolicy, TimezonePolicy, UInt64Policy,
137 };
138
139 #[test]
140 fn defaults_match_v0_1_policy_decisions() {
141 let options = PlanOptions::default();
142
143 assert_eq!(options.string_policy, StringPolicy::NVarCharMax);
144 assert_eq!(options.binary_policy, BinaryPolicy::VarBinaryMax);
145 assert_eq!(options.timezone_policy, TimezonePolicy::Reject);
146 assert_eq!(options.nanosecond_policy, NanosecondPolicy::RejectNon100ns);
147 assert_eq!(options.uint64_policy, UInt64Policy::Reject);
148 assert_eq!(options.decimal_policy, DecimalPolicy::RejectNegativeScale);
149 assert_eq!(options.decimal256_policy, Decimal256Policy::CheckedDowncast);
150 assert_eq!(options.float_policy, FloatPolicy::RejectNonFinite);
151 assert_eq!(options.date64_policy, Date64Policy::RejectNonMidnight);
152 }
153
154 #[test]
155 fn individual_policy_defaults_match_plan_options() {
156 assert_eq!(StringPolicy::default(), StringPolicy::NVarCharMax);
157 assert_eq!(BinaryPolicy::default(), BinaryPolicy::VarBinaryMax);
158 assert_eq!(TimezonePolicy::default(), TimezonePolicy::Reject);
159 assert_eq!(
160 NanosecondPolicy::default(),
161 NanosecondPolicy::RejectNon100ns
162 );
163 assert_eq!(UInt64Policy::default(), UInt64Policy::Reject);
164 assert_eq!(DecimalPolicy::default(), DecimalPolicy::RejectNegativeScale);
165 assert_eq!(
166 Decimal256Policy::default(),
167 Decimal256Policy::CheckedDowncast
168 );
169 assert_eq!(FloatPolicy::default(), FloatPolicy::RejectNonFinite);
170 assert_eq!(Date64Policy::default(), Date64Policy::RejectNonMidnight);
171 assert_eq!(SchemaCheck::default(), SchemaCheck::Strict);
172 }
173
174 #[test]
175 fn supports_explicit_non_default_policy_overrides() {
176 let options = PlanOptions {
177 string_policy: StringPolicy::NVarChar(128),
178 binary_policy: BinaryPolicy::VarBinary(256),
179 timezone_policy: TimezonePolicy::DateTimeOffset,
180 nanosecond_policy: NanosecondPolicy::RoundTo100ns,
181 uint64_policy: UInt64Policy::Decimal20_0,
182 decimal_policy: DecimalPolicy::NormalizeNegativeScale,
183 decimal256_policy: Decimal256Policy::Reject,
184 float_policy: FloatPolicy::RejectNonFinite,
185 date64_policy: Date64Policy::TimestampDateTime2,
186 };
187
188 assert_eq!(options.string_policy, StringPolicy::NVarChar(128));
189 assert_eq!(options.binary_policy, BinaryPolicy::VarBinary(256));
190 assert_eq!(options.timezone_policy, TimezonePolicy::DateTimeOffset);
191 assert_eq!(options.nanosecond_policy, NanosecondPolicy::RoundTo100ns);
192 assert_eq!(options.uint64_policy, UInt64Policy::Decimal20_0);
193 assert_eq!(
194 options.decimal_policy,
195 DecimalPolicy::NormalizeNegativeScale
196 );
197 assert_eq!(options.decimal256_policy, Decimal256Policy::Reject);
198 assert_eq!(options.float_policy, FloatPolicy::RejectNonFinite);
199 assert_eq!(options.date64_policy, Date64Policy::TimestampDateTime2);
200 }
201}