Skip to content

Commit 3d35a80

Browse files
authored
Merge pull request #99 from jasonpanosso/jp/create_transform
2 parents 77a6bf0 + 6f80816 commit 3d35a80

File tree

5 files changed

+567
-0
lines changed

5 files changed

+567
-0
lines changed

crates/codegen/src/get_node_properties.rs

+24
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,30 @@ fn custom_handlers(node: &Node) -> TokenStream {
812812
panic!("Encountered multiple defined func_name elements in CreateConversionStmt");
813813
}
814814
},
815+
"CreateTransformStmt" => quote! {
816+
tokens.push(TokenProperty::from(Token::Create));
817+
if n.replace {
818+
tokens.push(TokenProperty::from(Token::Or));
819+
tokens.push(TokenProperty::from(Token::Replace));
820+
}
821+
tokens.push(TokenProperty::from(Token::Transform));
822+
if n.type_name.is_some() {
823+
tokens.push(TokenProperty::from(Token::For));
824+
}
825+
tokens.push(TokenProperty::from(Token::Language));
826+
if n.fromsql.is_some() {
827+
tokens.push(TokenProperty::from(Token::From));
828+
tokens.push(TokenProperty::from(Token::SqlP));
829+
tokens.push(TokenProperty::from(Token::With));
830+
tokens.push(TokenProperty::from(Token::Function));
831+
}
832+
if n.tosql.is_some() {
833+
tokens.push(TokenProperty::from(Token::To));
834+
tokens.push(TokenProperty::from(Token::SqlP));
835+
tokens.push(TokenProperty::from(Token::With));
836+
tokens.push(TokenProperty::from(Token::Function));
837+
}
838+
},
815839
_ => quote! {},
816840
}
817841
}

crates/parser/src/codegen.rs

+28
Original file line numberDiff line numberDiff line change
@@ -317,4 +317,32 @@ mod tests {
317317
],
318318
)
319319
}
320+
321+
#[test]
322+
fn test_create_transform() {
323+
test_get_node_properties(
324+
"CREATE OR REPLACE TRANSFORM FOR hstore LANGUAGE plpython3u (
325+
FROM SQL WITH FUNCTION hstore_to_plpython(internal),
326+
TO SQL WITH FUNCTION plpython_to_hstore(internal)
327+
);",
328+
SyntaxKind::CreateTransformStmt,
329+
vec![
330+
TokenProperty::from(SyntaxKind::Create),
331+
TokenProperty::from(SyntaxKind::Or),
332+
TokenProperty::from(SyntaxKind::Replace),
333+
TokenProperty::from(SyntaxKind::Transform),
334+
TokenProperty::from(SyntaxKind::For),
335+
TokenProperty::from(SyntaxKind::Language),
336+
TokenProperty::from(SyntaxKind::From),
337+
TokenProperty::from(SyntaxKind::SqlP),
338+
TokenProperty::from(SyntaxKind::With),
339+
TokenProperty::from(SyntaxKind::Function),
340+
TokenProperty::from(SyntaxKind::To),
341+
TokenProperty::from(SyntaxKind::SqlP),
342+
TokenProperty::from(SyntaxKind::With),
343+
TokenProperty::from(SyntaxKind::Function),
344+
TokenProperty::from("plpython3u".to_string()),
345+
],
346+
)
347+
}
320348
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CREATE TRANSFORM FOR hstore LANGUAGE plpython3u (
2+
FROM SQL WITH FUNCTION hstore_to_plpython(internal),
3+
TO SQL WITH FUNCTION plpython_to_hstore(internal)
4+
);
5+
6+
CREATE OR REPLACE TRANSFORM FOR hstore LANGUAGE plpython3u (
7+
FROM SQL WITH FUNCTION hstore_to_plpython(internal),
8+
TO SQL WITH FUNCTION plpython_to_hstore(internal)
9+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
---
2+
source: crates/parser/tests/statement_parser_test.rs
3+
description: "CREATE TRANSFORM FOR hstore LANGUAGE plpython3u (\n FROM SQL WITH FUNCTION hstore_to_plpython(internal),\n TO SQL WITH FUNCTION plpython_to_hstore(internal)\n);"
4+
---
5+
Parse {
6+
cst: SourceFile@0..163
7+
CreateTransformStmt@0..163
8+
Create@0..6 "CREATE"
9+
Whitespace@6..7 " "
10+
Transform@7..16 "TRANSFORM"
11+
Whitespace@16..17 " "
12+
For@17..20 "FOR"
13+
Whitespace@20..21 " "
14+
TypeName@21..27
15+
Ident@21..27 "hstore"
16+
Whitespace@27..28 " "
17+
Language@28..36 "LANGUAGE"
18+
Whitespace@36..37 " "
19+
Ident@37..47 "plpython3u"
20+
Whitespace@47..48 " "
21+
Ascii40@48..49 "("
22+
Newline@49..50 "\n"
23+
Whitespace@50..54 " "
24+
From@54..58 "FROM"
25+
Whitespace@58..59 " "
26+
SqlP@59..62 "SQL"
27+
Whitespace@62..63 " "
28+
With@63..67 "WITH"
29+
Whitespace@67..68 " "
30+
Function@68..76 "FUNCTION"
31+
Whitespace@76..77 " "
32+
ObjectWithArgs@77..107
33+
Ident@77..95 "hstore_to_plpython"
34+
Ascii40@95..96 "("
35+
TypeName@96..104
36+
Ident@96..104 "internal"
37+
Ascii41@104..105 ")"
38+
Ascii44@105..106 ","
39+
Newline@106..107 "\n"
40+
Whitespace@107..111 " "
41+
To@111..113 "TO"
42+
Whitespace@113..114 " "
43+
SqlP@114..117 "SQL"
44+
Whitespace@117..118 " "
45+
With@118..122 "WITH"
46+
Whitespace@122..123 " "
47+
Function@123..131 "FUNCTION"
48+
Whitespace@131..132 " "
49+
ObjectWithArgs@132..163
50+
Ident@132..150 "plpython_to_hstore"
51+
Ascii40@150..151 "("
52+
TypeName@151..159
53+
Ident@151..159 "internal"
54+
Ascii41@159..160 ")"
55+
Newline@160..161 "\n"
56+
Ascii41@161..162 ")"
57+
Ascii59@162..163 ";"
58+
,
59+
errors: [],
60+
stmts: [
61+
RawStmt {
62+
stmt: CreateTransformStmt(
63+
CreateTransformStmt {
64+
replace: false,
65+
type_name: Some(
66+
TypeName {
67+
names: [
68+
Node {
69+
node: Some(
70+
String(
71+
String {
72+
sval: "hstore",
73+
},
74+
),
75+
),
76+
},
77+
],
78+
type_oid: 0,
79+
setof: false,
80+
pct_type: false,
81+
typmods: [],
82+
typemod: -1,
83+
array_bounds: [],
84+
location: 21,
85+
},
86+
),
87+
lang: "plpython3u",
88+
fromsql: Some(
89+
ObjectWithArgs {
90+
objname: [
91+
Node {
92+
node: Some(
93+
String(
94+
String {
95+
sval: "hstore_to_plpython",
96+
},
97+
),
98+
),
99+
},
100+
],
101+
objargs: [
102+
Node {
103+
node: Some(
104+
TypeName(
105+
TypeName {
106+
names: [
107+
Node {
108+
node: Some(
109+
String(
110+
String {
111+
sval: "internal",
112+
},
113+
),
114+
),
115+
},
116+
],
117+
type_oid: 0,
118+
setof: false,
119+
pct_type: false,
120+
typmods: [],
121+
typemod: -1,
122+
array_bounds: [],
123+
location: 96,
124+
},
125+
),
126+
),
127+
},
128+
],
129+
objfuncargs: [
130+
Node {
131+
node: Some(
132+
FunctionParameter(
133+
FunctionParameter {
134+
name: "",
135+
arg_type: Some(
136+
TypeName {
137+
names: [
138+
Node {
139+
node: Some(
140+
String(
141+
String {
142+
sval: "internal",
143+
},
144+
),
145+
),
146+
},
147+
],
148+
type_oid: 0,
149+
setof: false,
150+
pct_type: false,
151+
typmods: [],
152+
typemod: -1,
153+
array_bounds: [],
154+
location: 96,
155+
},
156+
),
157+
mode: FuncParamDefault,
158+
defexpr: None,
159+
},
160+
),
161+
),
162+
},
163+
],
164+
args_unspecified: false,
165+
},
166+
),
167+
tosql: Some(
168+
ObjectWithArgs {
169+
objname: [
170+
Node {
171+
node: Some(
172+
String(
173+
String {
174+
sval: "plpython_to_hstore",
175+
},
176+
),
177+
),
178+
},
179+
],
180+
objargs: [
181+
Node {
182+
node: Some(
183+
TypeName(
184+
TypeName {
185+
names: [
186+
Node {
187+
node: Some(
188+
String(
189+
String {
190+
sval: "internal",
191+
},
192+
),
193+
),
194+
},
195+
],
196+
type_oid: 0,
197+
setof: false,
198+
pct_type: false,
199+
typmods: [],
200+
typemod: -1,
201+
array_bounds: [],
202+
location: 151,
203+
},
204+
),
205+
),
206+
},
207+
],
208+
objfuncargs: [
209+
Node {
210+
node: Some(
211+
FunctionParameter(
212+
FunctionParameter {
213+
name: "",
214+
arg_type: Some(
215+
TypeName {
216+
names: [
217+
Node {
218+
node: Some(
219+
String(
220+
String {
221+
sval: "internal",
222+
},
223+
),
224+
),
225+
},
226+
],
227+
type_oid: 0,
228+
setof: false,
229+
pct_type: false,
230+
typmods: [],
231+
typemod: -1,
232+
array_bounds: [],
233+
location: 151,
234+
},
235+
),
236+
mode: FuncParamDefault,
237+
defexpr: None,
238+
},
239+
),
240+
),
241+
},
242+
],
243+
args_unspecified: false,
244+
},
245+
),
246+
},
247+
),
248+
range: 0..162,
249+
},
250+
],
251+
}

0 commit comments

Comments
 (0)