File: test_function_chaining_alias.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 (140 lines) | stat: -rw-r--r-- 3,421 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
# name: test/sql/binder/test_function_chaining_alias.test
# description: Test referencing an alias or a function chaining alias
# group: [binder]

statement ok
PRAGMA enable_verification

query II
SELECT 'test' || ' more testing' AS added, added.substr(5) AS my_substr
----
test more testing	 more testing

statement ok
CREATE TABLE varchars(v VARCHAR);

statement ok
INSERT INTO varchars VALUES ('>>%Test<<'), ('%FUNCTION%'), ('Chaining')

query I
SELECT v.lower() FROM varchars
----
>>%test<<
%function%
chaining

# Use only_alphabet before it is defined.

statement error
SELECT
	v.trim('><') AS trim_inequality,
	only_alphabet.lower() AS lower,
	trim_inequality.replace('%', '') AS only_alphabet,
FROM varchars
----
<REGEX>:Binder Error.*column cannot be referenced before it is defined.*

query III
SELECT
	v.trim('><') AS trim_inequality,
	trim_inequality.replace('%', '') AS only_alphabet,
	only_alphabet.lower() AS lower
FROM varchars
----
%Test	Test	test
%FUNCTION%	FUNCTION	function
Chaining	Chaining	chaining

# Test a column with a table name.

query III
SELECT
	varchars.v.trim('><') AS trim_inequality,
	trim_inequality.replace('%', '') AS only_alphabet,
	only_alphabet.lower() AS lower
FROM varchars
----
%Test	Test	test
%FUNCTION%	FUNCTION	function
Chaining	Chaining	chaining

statement ok
DELETE FROM varchars

statement ok
INSERT INTO varchars VALUES ('Test Function Chaining Alias');

query III
SELECT
	v.split(' ')::VARCHAR strings,
	strings.lower() lower,
	lower.upper() upper
FROM varchars
----
[Test, Function, Chaining, Alias]	[test, function, chaining, alias]	[TEST, FUNCTION, CHAINING, ALIAS]

query IIII
SELECT
	v.split(' ') strings,
	strings.apply(lambda x: x.lower()).filter(lambda x: x[1] == 't') lower,
	strings.apply(lambda x: x.upper()).filter(lambda x: x[1] == 'T') upper,
	lower + upper AS mix_case_srings
FROM varchars
----
[Test, Function, Chaining, Alias]	[test]	[TEST]	[test, TEST]

# Test prepared statements.

statement ok
PREPARE v1 AS 
SELECT
	(?.split(' ')::VARCHAR).lower() lstrings,
	(?.split(' ')::VARCHAR).upper() ustrings,
	list_concat(lstrings::VARCHAR[], ustrings::VARCHAR[]) AS mix_case_srings

query III
EXECUTE v1('Hello World', 'test function chaining')
----
[hello, world]	[TEST, FUNCTION, CHAINING]	[hello, world, TEST, FUNCTION, CHAINING]

statement ok
INSERT INTO varchars VALUES ('Another longggggg String');

# Use an alias in a WHERE clause.

query IIII
SELECT
	v.split(' ') strings,
	strings.apply(lambda x: x.lower()).filter(lambda x: x[1] == 't' OR x[1] == 'a') lower,
	strings.apply(lambda x: x.upper()).filter(lambda x: x[1] == 'T' OR x[1] == 'A') upper,
	lower + upper AS mix_case_srings
FROM varchars
WHERE mix_case_srings[1] = 'test'
----
[Test, Function, Chaining, Alias]	[test, alias]	[TEST, ALIAS]	[test, alias, TEST, ALIAS]

query IIII
SELECT
	v.split(' ') strings,
	strings.apply(lambda x: x.lower()).filter(lambda x: x[1] == 't' OR x[1] == 'a') lower,
	strings.apply(lambda x: x.upper()).filter(lambda x: x[1] == 'T' OR x[1] == 'A') upper,
	lower + upper AS mix_case_srings
FROM varchars
WHERE mix_case_srings[1] = 'another'
----
[Another, longggggg, String]	[another]	[ANOTHER]	[another, ANOTHER]

# CTE with function chaining alias.

query II
WITH test AS (
    SELECT 'woot' AS my_column
)
FROM test
SELECT
	my_column.substr(2) AS partial_woot,
	partial_woot.substr(2) AS more_partially_woot
WHERE
    more_partially_woot = 'ot';
----
oot	ot