File: test_complex_macro.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 (330 lines) | stat: -rw-r--r-- 7,344 bytes parent folder | download | duplicates (3)
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
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
# name: test/sql/catalog/function/test_complex_macro.test
# description: Test Complex Macro
# group: [function]

statement ok
PRAGMA enable_verification

statement ok
CREATE TABLE integers (a INT)

statement ok
INSERT INTO integers VALUES (1)

# cte and subquery
statement ok
CREATE MACRO cte_sq(a,b) AS (WITH cte AS (SELECT a * 2 AS c) SELECT cte.c + sq.d FROM cte, (SELECT b * 3 AS d) AS sq)

query T
SELECT cte_sq(3,4)
----
18

statement ok
CREATE MACRO nested_cte(needle, haystack) AS needle IN (
    SELECT i FROM (
        WITH ints AS (
            SELECT CAST(UNNEST(string_split(haystack,',')) AS INT) AS i
        )
        SELECT i FROM ints
    ) AS sq
)

query T
SELECT nested_cte(2, '2,2,2,2')
----
1

statement ok
CREATE MACRO IFELSE(a,b,c) AS CASE WHEN a THEN b ELSE c END

query T
SELECT IFELSE(1, IFELSE(1,'a','b'), 'c')
----
a

query T
SELECT IFELSE(1, IFELSE(0,'a','b'), 'c')
----
b

query T
SELECT IFELSE(0, IFELSE(1,'a','b'), 'c')
----
c

query T
SELECT IFELSE(1, IFELSE(1,a,'b'), 'c') FROM integers
----
1

statement error
SELECT IFELSE(1,IFELSE(1,b,1),a) FROM integers
----

statement ok
CREATE MACRO f1(x) AS (SELECT MIN(a) + x FROM integers)

query I
select f1(42) from integers;
----
43

# macro in GROUP BY
statement ok
CREATE MACRO mod_two(k) AS k%2

query II
SELECT mod_two(a), SUM(a) FROM integers GROUP BY mod_two(a)
----
1	1

# more nested stuff
statement ok
CREATE MACRO add_mac(a, b) AS a + b

statement ok
CREATE MACRO double_add(a, b, c) AS add_mac(add_mac(a, b), c)

query T
SELECT double_add(1, 2, 3)
----
6

statement ok
CREATE MACRO triple_add1(a, b, c, d) AS add_mac(add_mac(a, b), add_mac(c, d))

query T
SELECT triple_add1(1, 2, 3, 4)
----
10

statement ok
CREATE MACRO triple_add2(a, b, c, d) as add_mac(add_mac(add_mac(a, b), c), d)

query T
SELECT triple_add2(1, 2, 3, 4)
----
10

# subquery within macro parameters
statement ok
INSERT INTO integers VALUES (41)

query T
SELECT add((SELECT MIN(a) FROM integers), (SELECT MAX(a) FROM integers))
----
42

# macros within a correlated subquery
query T
SELECT (SELECT MAX(add(i1.a, a)) FROM integers) FROM integers i1
----
42
82

# parameter expression
statement error
CREATE MACRO prep(x) AS ?+1
----

# prepared statements
statement ok
CREATE MACRO add_one(a) AS a + 1

statement ok
PREPARE v1 AS SELECT add_one(?::INTEGER)

query T
EXECUTE v1(1)
----
2

statement ok
CREATE MACRO my_square(a) AS a * a

statement ok
PREPARE v2 AS SELECT my_square(?::INTEGER)

query T
EXECUTE v2(3)
----
9

# test FTS extension use case
statement ok
CREATE TABLE documents(id VARCHAR, body VARCHAR)

statement ok
INSERT INTO documents VALUES ('doc1', ' QUÁCK+QUÁCK+QUÁCK'), ('doc2', ' BÁRK+BÁRK+BÁRK+BÁRK'), ('doc3', ' MÉOW+MÉOW+MÉOW+MÉOW+MÉOW')

statement ok
CREATE SCHEMA fts_main_documents

statement ok
CREATE TABLE fts_main_documents.docs AS (
    SELECT
        row_number() OVER () AS docid,
        id AS name
    FROM
        main.documents
)

statement ok
CREATE TABLE fts_main_documents.terms AS (
    SELECT
        term,
        docid,
        row_number() OVER (PARTITION BY docid) AS pos
    FROM (
        SELECT
            unnest(string_split_regex(regexp_replace(lower(strip_accents(body)), '[^a-z]', ' ', 'g'), '\s+')) AS term,
            row_number() OVER () AS docid
        FROM main.documents
    ) AS sq
    WHERE
        term != ''
)

statement ok
ALTER TABLE fts_main_documents.docs ADD len INT

statement ok
UPDATE fts_main_documents.docs d
SET len = (
    SELECT count(term)
    FROM fts_main_documents.terms t
    WHERE t.docid = d.docid
)

statement ok
CREATE TABLE fts_main_documents.dict AS
WITH distinct_terms AS (
    SELECT DISTINCT term, docid
    FROM fts_main_documents.terms
    ORDER BY docid
)
SELECT
    row_number() OVER () AS termid,
    term
FROM
    distinct_terms

statement ok
ALTER TABLE fts_main_documents.terms ADD termid INT

statement ok
UPDATE fts_main_documents.terms t
SET termid = (
    SELECT termid
    FROM fts_main_documents.dict d
    WHERE t.term = d.term
)

statement ok
ALTER TABLE fts_main_documents.terms DROP term

statement ok
ALTER TABLE fts_main_documents.dict ADD df INT

statement ok
UPDATE fts_main_documents.dict d
SET df = (
    SELECT count(distinct docid)
    FROM fts_main_documents.terms t
    WHERE d.termid = t.termid
    GROUP BY termid
)

query II
WITH ppterms AS (
    SELECT unnest(string_split_regex(regexp_replace(lower(strip_accents('QUÁCK BÁRK')), '[^a-z]', ' ', 'g'), '\s+')) AS term
), qtermids AS (
    SELECT termid
    FROM fts_main_documents.dict AS dict
    JOIN ppterms
    USING (term)
), qterms AS (
    SELECT termid,
           docid
    FROM fts_main_documents.terms AS terms
    WHERE termid IN (
        SELECT qtermids.termid FROM qtermids
    )
), subscores AS (
    SELECT docs.docid,
           len,
           term_tf.termid,
           tf,
           df,
           (log((3 - df + 0.5) / (df + 0.5))* ((tf * (1.2 + 1)/(tf + 1.2 * (1 - 0.75 + 0.75 * (len / 4)))))) AS subscore
    FROM (
        SELECT termid,
               docid,
               COUNT(*) AS tf
        FROM qterms
        GROUP BY docid,
                 termid
    ) AS term_tf
    JOIN (
        SELECT DISTINCT docid
        FROM qterms
    ) AS cdocs
    ON term_tf.docid = cdocs.docid
    JOIN fts_main_documents.docs AS docs
    ON term_tf.docid = docs.docid
    JOIN fts_main_documents.dict AS dict
    ON term_tf.termid = dict.termid
)
SELECT name,
       score
FROM (
    SELECT docid,
           sum(subscore) AS score
    FROM subscores
    GROUP BY docid
) AS scores
JOIN fts_main_documents.docs AS docs
ON scores.docid = docs.docid
ORDER BY score DESC
LIMIT 1000
----
doc2	0.37543634550460314
doc1	0.3683526408724408

statement ok
CREATE MACRO fts_match(docname, query_string) AS docname IN (
WITH ppterms AS (SELECT unnest(string_split_regex(regexp_replace(lower(strip_accents(query_string)), '[^a-z]', ' ', 'g'), '\s+')) AS term),
qtermids AS (SELECT termid FROM fts_main_documents.dict AS dict, ppterms WHERE dict.term = ppterms.term),
qterms AS (SELECT termid, docid FROM fts_main_documents.terms AS terms WHERE termid IN (SELECT qtermids.termid FROM qtermids)),
subscores AS (
SELECT docs.docid, len, term_tf.termid,
        tf, df, (log((3 - df + 0.5) / (df + 0.5))* ((tf * (1.2 + 1)/(tf + 1.2 * (1 - 0.75 + 0.75 * (len / 4)))))) AS subscore
FROM (SELECT termid, docid, COUNT(*) AS tf FROM qterms
    GROUP BY docid, termid) AS term_tf
    JOIN (SELECT docid FROM qterms
        GROUP BY docid) -- HAVING COUNT(DISTINCT termid) = 3)
        AS cdocs ON term_tf.docid = cdocs.docid
    JOIN fts_main_documents.docs AS docs ON term_tf.docid = docs.docid
    JOIN fts_main_documents.dict AS dict ON term_tf.termid = dict.termid)
SELECT name FROM (SELECT docid, sum(subscore) AS score
    FROM subscores GROUP BY docid) AS scores JOIN fts_main_documents.docs AS docs ON
    scores.docid = docs.docid ORDER BY score DESC LIMIT 1000)

query II
SELECT * FROM documents WHERE fts_match(id, 'QUÁCK BÁRK')
----
doc1	 QUÁCK+QUÁCK+QUÁCK
doc2	 BÁRK+BÁRK+BÁRK+BÁRK

# macro with window function
statement ok
CREATE MACRO mywindow(k,v) AS SUM(v) OVER (PARTITION BY k)

query II rowsort
WITH grouped AS (SELECT mod(range, 3) AS grp, range AS val FROM RANGE(500))
SELECT DISTINCT grp, mywindow(grp, val) FROM grouped ORDER BY grp
----
0	41583
1	41750
2	41417