File: test_printf.test

package info (click to toggle)
duckdb 1.5.1-2
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 299,196 kB
  • sloc: cpp: 865,414; ansic: 57,292; python: 18,871; sql: 12,663; lisp: 11,751; yacc: 7,412; lex: 1,682; sh: 747; makefile: 558
file content (253 lines) | stat: -rw-r--r-- 4,896 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
# name: test/sql/function/string/test_printf.test
# description: Test printf
# group: [string]

statement ok
PRAGMA enable_verification

# printf without format specifiers
query TT
SELECT printf('hello'), printf(NULL)
----
hello	NULL

# format strings
query TT
SELECT printf('%s', 'hello'), printf('%s: %s', 'hello', 'world')
----
hello	hello: world

# format strings with NULL values
query TT
SELECT printf('%s', NULL), printf(NULL, 'hello', 'world')
----
NULL	NULL

# booleans
query T
SELECT printf('%d', TRUE)
----
1

# integers
query TT
SELECT printf('%d', 33), printf('%d + %d = %d', 3, 5, 3 + 5)
----
33	3 + 5 = 8

# maximum of ubigint
query I
SELECT printf('%d', 18446744073709551615::UBIGINT);
----
18446744073709551615

# integers with special formatting specifiers
query TTT
SELECT printf('%04d', 33), printf('%s %02d:%02d:%02d %s', 'time', 12, 3, 16, 'AM'), printf('%10d', 1992)
----
0033	time 12:03:16 AM	      1992

# different integer types
query T
SELECT printf('%hhd %hd %d %lld', 33::TINYINT, 12::SMALLINT, 40::INTEGER, 80::BIGINT)
----
33 12 40 80

# ...but really any of these can be used
query T
SELECT printf('%d %lld %hhd %hd', 33::TINYINT, 12::SMALLINT, 40::INTEGER, 80::BIGINT)
----
33 12 40 80

# exotic types
# dates, times and timestamps are strings
query T
SELECT printf('%s %s = %s', DATE '1992-01-01', TIME '12:01:00', TIMESTAMP '1992-01-01 12:01:00')
----
1992-01-01 12:01:00 = 1992-01-01 12:01:00

# blob
query T
SELECT printf('%s', BLOB '\x01\xa0')
----
\x01\xA0

# hugeint
query T
SELECT printf('%d', 120381902481294715712::HUGEINT)
----
120381902481294715712

query I
SELECT printf('%d', '-170141183460469231731687303715884105728'::HUGEINT)
----
-170141183460469231731687303715884105728

query I
SELECT printf('%d', '170141183460469231731687303715884105727'::HUGEINT)
----
170141183460469231731687303715884105727

# uhugeint
query T
SELECT printf('%d', 120381902481294715712::UHUGEINT)
----
120381902481294715712

query I
SELECT printf('%d', '340282366920938463463374607431768211455'::UHUGEINT)
----
340282366920938463463374607431768211455

query I
select printf('%x', 255::utinyint);
----
ff

query I
select printf('%x', 65535::usmallint);
----
ffff

query I
select printf('%x', 4294967295::uinteger);
----
ffffffff

query I
select printf('%x', 18446744073709551615::ubigint);
----
ffffffffffffffff

query I
select printf('%x', '340282366920938463463374607431768211455'::uhugeint);
----
ffffffffffffffffffffffffffffffff

# decimal
query T
SELECT printf('%.3f', '1.234'::DECIMAL)
----
1.234

# octal hex etc
query T
SELECT printf('%d %x %o %#x %#o', 100, 100, 100, 100, 100)
----
100 64 144 0x64 0144

query I
select printf('%b', '-170141183460469231731687303715884105728'::HUGEINT);
----
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

# ascii characters
query T
SELECT printf('%c', 65)
----
A

# width trick
query T
SELECT printf('%*d', 5, 10)
----
   10

# floating point numbers
query TT
SELECT printf('%.2f', 10.0::FLOAT), printf('%.4f', 0.5)
----
10.00	0.5000

# weird float stuff
query T
SELECT printf('floats: %4.2f %+.0e %E', 3.1416, 3.1416, 3.1416)
----
floats: 3.14 +3e+00 3.141600E+00

# incorrect number of parameters
# too few parameters
statement error
SELECT printf('%s')
----

statement error
SELECT printf('%s %s', 'hello')
----

# excess parameters are ignored
query T
SELECT printf('%s', 'hello', 'world')
----
hello

# incorrect types
statement error
SELECT printf('%s', 42)
----

statement error
SELECT printf('%d', 'hello')
----

# Test printf with vectors
statement ok
CREATE TABLE strings(idx INTEGER, fmt STRING, pint INTEGER, pstring STRING)

statement ok
INSERT INTO strings VALUES (1, '%d: %s', 10, 'hello')

statement ok
INSERT INTO strings VALUES (2, 'blabla %d blabla %s', 20, 'blabla')

statement ok
INSERT INTO strings VALUES (3, NULL, 30, 'abcde')

# printf without format specifiers: too few parameters
statement error
SELECT printf(fmt) FROM strings ORDER BY idx
----

query T
SELECT printf(CASE WHEN pint < 15 THEN NULL ELSE pint::VARCHAR END) FROM strings ORDER BY idx
----
NULL
20
30

# standard vectorized printf
query T
SELECT printf(fmt, pint, pstring) FROM strings ORDER BY idx
----
10: hello
blabla 20 blabla blabla
NULL

# printf with constants in format arguments
query T
SELECT printf(fmt, 10, pstring) FROM strings ORDER BY idx
----
10: hello
blabla 10 blabla blabla
NULL

# printf with constant format string
query T
SELECT printf('%s: %s', pstring, pstring) FROM strings ORDER BY idx
----
hello: hello
blabla: blabla
abcde: abcde

# printf with selection vector
query T
SELECT printf('%s: %s', pstring, pstring) FROM strings WHERE idx <> 2 ORDER BY idx
----
hello: hello
abcde: abcde

# cast integers correctly
query T
SELECT printf('%d %d %d %d', 100::tinyint, 1000::smallint, 1000::int, 1000::bigint);
----
100 1000 1000 1000