@@ -89,28 +89,38 @@ pub fn generate_periodic_normal_series(
89
89
90
90
// Returns days in month
91
91
extension_sql ! (
92
- "\n \
93
- CREATE FUNCTION toolkit_experimental.days_in_month(date timestamptz) RETURNS int AS $$\n \
94
- SELECT CAST(EXTRACT('day' FROM ($1 + interval '1 month' - $1)) as INTEGER)\n \
95
- $$ LANGUAGE SQL STRICT IMMUTABLE PARALLEL SAFE;\n \
92
+ "
93
+ CREATE FUNCTION days_in_month(date timestamptz) RETURNS int
94
+ SET search_path TO pg_catalog,pg_temp
95
+ AS $$
96
+ SELECT CAST(EXTRACT('day' FROM ($1 + interval '1 month' - $1)) as INTEGER)
97
+ $$ LANGUAGE SQL STRICT IMMUTABLE PARALLEL SAFE;
96
98
" ,
97
99
name = "days_in_month" ,
98
100
) ;
99
101
100
102
// Normalizes metric based on reference date and days
101
- extension_sql ! ( "\n \
102
- CREATE FUNCTION toolkit_experimental.month_normalize(metric float8, reference_date timestamptz, days float8 DEFAULT 365.25/12) RETURNS float8 AS $$\n \
103
- SELECT metric * days / toolkit_experimental.days_in_month(reference_date)\n \
104
- $$ LANGUAGE SQL STRICT IMMUTABLE PARALLEL SAFE;\n \
105
- ", name="month_normalize" , ) ;
103
+ extension_sql ! (
104
+ "
105
+ CREATE FUNCTION month_normalize(metric float8, reference_date timestamptz, days float8 DEFAULT 365.25/12) RETURNS float8
106
+ SET search_path TO pg_catalog,pg_temp
107
+ AS $$
108
+ SELECT metric * days / CAST(EXTRACT('day' FROM (reference_date + interval '1 month' - reference_date)) as INTEGER)
109
+ $$ LANGUAGE SQL STRICT IMMUTABLE PARALLEL SAFE;
110
+ " ,
111
+ name="month_normalize" ,
112
+ ) ;
106
113
107
114
// Convert a timestamp to a double precision unix epoch
108
- extension_sql ! ( "\n \
109
- CREATE FUNCTION toolkit_experimental.to_epoch(timestamptz) RETURNS DOUBLE PRECISION LANGUAGE SQL IMMUTABLE PARALLEL SAFE AS $$\n \
110
- SELECT EXTRACT(EPOCH FROM $1);\n \
111
- $$;\n \
115
+ extension_sql ! (
116
+ "
117
+ CREATE FUNCTION to_epoch(timestamptz) RETURNS DOUBLE PRECISION LANGUAGE SQL IMMUTABLE PARALLEL SAFE
118
+ SET search_path TO pg_catalog,pg_temp
119
+ AS $$
120
+ SELECT EXTRACT(EPOCH FROM $1);
121
+ $$;
112
122
" ,
113
- name= "to_epoch" ,
123
+ name = "to_epoch" ,
114
124
) ;
115
125
116
126
#[ cfg( any( test, feature = "pg_test" ) ) ]
@@ -124,7 +134,7 @@ mod tests {
124
134
Spi :: connect ( |mut client| {
125
135
let test_val = client
126
136
. update (
127
- "SELECT toolkit_experimental. to_epoch('2021-01-01 00:00:00+03'::timestamptz)" ,
137
+ "SELECT to_epoch('2021-01-01 00:00:00+03'::timestamptz)" ,
128
138
None ,
129
139
None ,
130
140
)
@@ -135,9 +145,18 @@ mod tests {
135
145
. unwrap ( ) ;
136
146
assert ! ( ( test_val - 1609448400f64 ) . abs( ) < f64 :: EPSILON ) ;
137
147
148
+ let test_val = client
149
+ . update ( "SELECT to_epoch('epoch'::timestamptz)" , None , None )
150
+ . unwrap ( )
151
+ . first ( )
152
+ . get_one :: < f64 > ( )
153
+ . unwrap ( )
154
+ . unwrap ( ) ;
155
+ assert ! ( ( test_val - 0f64 ) . abs( ) < f64 :: EPSILON ) ;
156
+
138
157
let test_val = client
139
158
. update (
140
- "SELECT toolkit_experimental. to_epoch('epoch'::timestamptz)" ,
159
+ "SELECT to_epoch('epoch'::timestamptz - interval '42 seconds' )" ,
141
160
None ,
142
161
None ,
143
162
)
@@ -146,40 +165,84 @@ mod tests {
146
165
. get_one :: < f64 > ( )
147
166
. unwrap ( )
148
167
. unwrap ( ) ;
149
- assert ! ( ( test_val - 0f64 ) . abs( ) < f64 :: EPSILON ) ;
150
-
151
- let test_val = client
152
- . update ( "SELECT toolkit_experimental.to_epoch('epoch'::timestamptz - interval '42 seconds')" , None , None )
153
- . unwrap ( ) . first ( )
154
- . get_one :: < f64 > ( ) . unwrap ( ) . unwrap ( ) ;
155
168
assert ! ( ( test_val - -42f64 ) . abs( ) < f64 :: EPSILON ) ;
156
169
} ) ;
157
170
}
158
171
159
172
#[ pg_test]
160
173
fn test_days_in_month ( ) {
161
174
Spi :: connect ( |mut client| {
162
- let test_val = client. update ( "SELECT toolkit_experimental.days_in_month('2021-01-01 00:00:00+03'::timestamptz)" , None , None , ) . unwrap ( ) . first ( ) . get_one :: < i64 > ( ) . unwrap ( ) . unwrap ( ) ;
175
+ let test_val = client
176
+ . update (
177
+ "SELECT days_in_month('2021-01-01 00:00:00+03'::timestamptz)" ,
178
+ None ,
179
+ None ,
180
+ )
181
+ . unwrap ( )
182
+ . first ( )
183
+ . get_one :: < i64 > ( )
184
+ . unwrap ( )
185
+ . unwrap ( ) ;
163
186
assert_eq ! ( test_val, 31 ) ;
164
187
} ) ;
165
188
166
189
Spi :: connect ( |mut client| {
167
- let test_val = client. update ( "SELECT toolkit_experimental.days_in_month('2020-02-03 00:00:00+03'::timestamptz)" , None , None , ) . unwrap ( ) . first ( ) . get_one :: < i64 > ( ) . unwrap ( ) . unwrap ( ) ;
190
+ let test_val = client
191
+ . update (
192
+ "SELECT days_in_month('2020-02-03 00:00:00+03'::timestamptz)" ,
193
+ None ,
194
+ None ,
195
+ )
196
+ . unwrap ( )
197
+ . first ( )
198
+ . get_one :: < i64 > ( )
199
+ . unwrap ( )
200
+ . unwrap ( ) ;
168
201
assert_eq ! ( test_val, 29 ) ;
169
202
} ) ;
170
203
}
171
204
#[ pg_test]
172
205
fn test_monthly_normalize ( ) {
173
206
Spi :: connect ( |mut client| {
174
- let test_val = client. update ( "SELECT toolkit_experimental.month_normalize(1000,'2021-01-01 00:00:00+03'::timestamptz)" , None , None , ) . unwrap ( ) . first ( ) . get_one :: < f64 > ( ) . unwrap ( ) . unwrap ( ) ;
207
+ let test_val = client
208
+ . update (
209
+ "SELECT month_normalize(1000,'2021-01-01 00:00:00+03'::timestamptz)" ,
210
+ None ,
211
+ None ,
212
+ )
213
+ . unwrap ( )
214
+ . first ( )
215
+ . get_one :: < f64 > ( )
216
+ . unwrap ( )
217
+ . unwrap ( ) ;
175
218
assert_eq ! ( test_val, 981.8548387096774f64 ) ;
176
219
} ) ;
177
220
Spi :: connect ( |mut client| {
178
- let test_val = client. update ( "SELECT toolkit_experimental.month_normalize(1000,'2021-01-01 00:00:00+03'::timestamptz,30.5)" , None , None , ) . unwrap ( ) . first ( ) . get_one :: < f64 > ( ) . unwrap ( ) . unwrap ( ) ;
221
+ let test_val = client
222
+ . update (
223
+ "SELECT month_normalize(1000,'2021-01-01 00:00:00+03'::timestamptz,30.5)" ,
224
+ None ,
225
+ None ,
226
+ )
227
+ . unwrap ( )
228
+ . first ( )
229
+ . get_one :: < f64 > ( )
230
+ . unwrap ( )
231
+ . unwrap ( ) ;
179
232
assert_eq ! ( test_val, 983.8709677419355f64 ) ;
180
233
} ) ;
181
234
Spi :: connect ( |mut client| {
182
- let test_val = client. update ( "SELECT toolkit_experimental.month_normalize(1000,'2021-01-01 00:00:00+03'::timestamptz,30)" , None , None , ) . unwrap ( ) . first ( ) . get_one :: < f64 > ( ) . unwrap ( ) . unwrap ( ) ;
235
+ let test_val = client
236
+ . update (
237
+ "SELECT month_normalize(1000,'2021-01-01 00:00:00+03'::timestamptz,30)" ,
238
+ None ,
239
+ None ,
240
+ )
241
+ . unwrap ( )
242
+ . first ( )
243
+ . get_one :: < f64 > ( )
244
+ . unwrap ( )
245
+ . unwrap ( ) ;
183
246
assert_eq ! ( test_val, 967.741935483871f64 ) ;
184
247
} ) ;
185
248
}
0 commit comments