Skip to content

Commit 40b05bd

Browse files
authored
Implement CREATE / DROP FUNCTION (#401)
* sql/ast: Add test for pg_temp schema * sql/ast: Implement CREATE / DROP FUNCTION
1 parent 9f84662 commit 40b05bd

File tree

6 files changed

+505
-188
lines changed

6 files changed

+505
-188
lines changed

internal/postgresql/catalog_test.go

+130-138
Original file line numberDiff line numberDiff line change
@@ -279,15 +279,13 @@ func TestUpdate(t *testing.T) {
279279
`,
280280
nil,
281281
},
282-
/*
283-
{
284-
`
285-
DROP FUNCTION IF EXISTS bar(text);
286-
DROP FUNCTION IF EXISTS bar(text) CASCADE;
287-
`,
288-
pg.NewCatalog(),
289-
},
290-
*/
282+
{
283+
`
284+
DROP FUNCTION IF EXISTS bar;
285+
DROP FUNCTION IF EXISTS bar();
286+
`,
287+
nil,
288+
},
291289
{
292290
`
293291
CREATE TABLE venues (id SERIAL PRIMARY KEY);
@@ -309,160 +307,154 @@ func TestUpdate(t *testing.T) {
309307
},
310308
},
311309
},
312-
/*
313-
{ // first argument has no name
314-
`
315-
CREATE FUNCTION foo(TEXT) RETURNS bool AS $$ SELECT true $$ LANGUAGE sql;
316-
`,
317-
pg.Catalog{
318-
Schemas: map[string]pg.Schema{
319-
"public": {
320-
Funcs: map[string][]pg.Function{
321-
"foo": []pg.Function{
322-
{
323-
Name: "foo",
324-
Arguments: []pg.Argument{
325-
{
326-
Name: "",
327-
DataType: "text",
328-
},
329-
},
330-
ReturnType: "bool",
331-
},
332-
},
310+
{
311+
`
312+
CREATE FUNCTION foo(TEXT) RETURNS bool AS $$ SELECT true $$ LANGUAGE sql;
313+
`,
314+
&catalog.Schema{
315+
Name: "public",
316+
Funcs: []*catalog.Function{
317+
{
318+
Name: "foo",
319+
Args: []*catalog.Argument{
320+
{
321+
Type: &ast.TypeName{Name: "text"},
333322
},
334323
},
324+
ReturnType: &ast.TypeName{Name: "bool"},
335325
},
336326
},
337327
},
338-
{ // same name, different arity
339-
`
340-
CREATE FUNCTION foo(bar TEXT) RETURNS bool AS $$ SELECT true $$ LANGUAGE sql;
341-
CREATE FUNCTION foo(bar TEXT, baz TEXT) RETURNS TEXT AS $$ SELECT "baz" $$ LANGUAGE sql;
342-
`,
343-
pg.Catalog{
344-
Schemas: map[string]pg.Schema{
345-
"public": {
346-
Funcs: map[string][]pg.Function{
347-
"foo": []pg.Function{
348-
{
349-
Name: "foo",
350-
Arguments: []pg.Argument{
351-
{
352-
Name: "bar",
353-
DataType: "text",
354-
},
355-
},
356-
ReturnType: "bool",
357-
},
358-
{
359-
Name: "foo",
360-
Arguments: []pg.Argument{
361-
{
362-
Name: "bar",
363-
DataType: "text",
364-
},
365-
{
366-
Name: "baz",
367-
DataType: "text",
368-
},
369-
},
370-
ReturnType: "text",
371-
},
372-
},
328+
},
329+
{
330+
`
331+
CREATE FUNCTION foo(bar TEXT) RETURNS bool AS $$ SELECT true $$ LANGUAGE sql;
332+
CREATE FUNCTION foo(bar TEXT, baz TEXT) RETURNS TEXT AS $$ SELECT "baz" $$ LANGUAGE sql;
333+
`,
334+
&catalog.Schema{
335+
Name: "public",
336+
Funcs: []*catalog.Function{
337+
{
338+
Name: "foo",
339+
Args: []*catalog.Argument{
340+
{
341+
Name: "bar",
342+
Type: &ast.TypeName{Name: "text"},
373343
},
374344
},
345+
ReturnType: &ast.TypeName{Name: "bool"},
346+
},
347+
{
348+
Name: "foo",
349+
Args: []*catalog.Argument{
350+
{
351+
Name: "bar",
352+
Type: &ast.TypeName{Name: "text"},
353+
},
354+
{
355+
Name: "baz",
356+
Type: &ast.TypeName{Name: "text"},
357+
},
358+
},
359+
ReturnType: &ast.TypeName{Name: "text"},
375360
},
376361
},
377362
},
378-
{ // same name and arity, different arg types
379-
`
380-
CREATE FUNCTION foo(bar TEXT) RETURNS bool AS $$ SELECT true $$ LANGUAGE sql;
381-
CREATE FUNCTION foo(bar INTEGER) RETURNS TEXT AS $$ SELECT "baz" $$ LANGUAGE sql;
382-
`,
383-
pg.Catalog{
384-
Schemas: map[string]pg.Schema{
385-
"public": {
386-
Funcs: map[string][]pg.Function{
387-
"foo": []pg.Function{
388-
{
389-
Name: "foo",
390-
Arguments: []pg.Argument{
391-
{
392-
Name: "bar",
393-
DataType: "text",
394-
},
395-
},
396-
ReturnType: "bool",
397-
},
398-
{
399-
Name: "foo",
400-
Arguments: []pg.Argument{
401-
{
402-
Name: "bar",
403-
DataType: "pg_catalog.int4",
404-
},
405-
},
406-
ReturnType: "text",
407-
},
408-
},
363+
},
364+
{
365+
`
366+
CREATE FUNCTION foo(bar TEXT) RETURNS bool AS $$ SELECT true $$ LANGUAGE sql;
367+
CREATE FUNCTION foo(bar INTEGER) RETURNS TEXT AS $$ SELECT "baz" $$ LANGUAGE sql;
368+
`,
369+
&catalog.Schema{
370+
Name: "public",
371+
Funcs: []*catalog.Function{
372+
{
373+
Name: "foo",
374+
Args: []*catalog.Argument{
375+
{
376+
Name: "bar",
377+
Type: &ast.TypeName{Name: "text"},
378+
},
379+
},
380+
ReturnType: &ast.TypeName{Name: "bool"},
381+
},
382+
{
383+
Name: "foo",
384+
Args: []*catalog.Argument{
385+
{
386+
Name: "bar",
387+
Type: &ast.TypeName{Schema: "pg_catalog", Name: "int4"},
409388
},
410389
},
390+
ReturnType: &ast.TypeName{Name: "text"},
411391
},
412392
},
413393
},
414-
{
415-
`
416-
CREATE FUNCTION foo(bar TEXT, baz TEXT="baz") RETURNS bool AS $$ SELECT true $$ LANGUAGE sql;
417-
`,
418-
pg.Catalog{
419-
Schemas: map[string]pg.Schema{
420-
"public": {
421-
Funcs: map[string][]pg.Function{
422-
"foo": []pg.Function{
423-
{
424-
Name: "foo",
425-
Arguments: []pg.Argument{
426-
{
427-
Name: "bar",
428-
DataType: "text",
429-
},
430-
{
431-
Name: "baz",
432-
DataType: "text",
433-
HasDefault: true,
434-
},
435-
},
436-
ReturnType: "bool",
437-
},
438-
},
394+
},
395+
{
396+
`
397+
CREATE FUNCTION foo(bar TEXT, baz TEXT="baz") RETURNS bool AS $$ SELECT true $$ LANGUAGE sql;
398+
`,
399+
&catalog.Schema{
400+
Name: "public",
401+
Funcs: []*catalog.Function{
402+
{
403+
Name: "foo",
404+
Args: []*catalog.Argument{
405+
{
406+
Name: "bar",
407+
Type: &ast.TypeName{Name: "text"},
408+
},
409+
{
410+
Name: "baz",
411+
Type: &ast.TypeName{Name: "text"},
412+
HasDefault: true,
439413
},
440414
},
415+
ReturnType: &ast.TypeName{Name: "bool"},
441416
},
442417
},
443418
},
444-
{
445-
`
446-
CREATE TABLE pg_temp.migrate (val INT);
447-
INSERT INTO pg_temp.migrate (val) SELECT val FROM old;
448-
INSERT INTO new (val) SELECT val FROM pg_temp.migrate;
449-
`,
450-
pg.Catalog{
451-
Schemas: map[string]pg.Schema{
452-
"pg_temp": {
453-
Tables: map[string]pg.Table{
454-
"migrate": pg.Table{
455-
Name: "migrate",
456-
Columns: []pg.Column{
457-
{Name: "val", DataType: "pg_catalog.int4", NotNull: false, Table: pg.FQN{Schema: "pg_temp", Rel: "migrate"}},
458-
},
459-
},
419+
},
420+
{
421+
`
422+
CREATE FUNCTION foo(bar text) RETURNS bool AS $$ SELECT true $$ LANGUAGE sql;
423+
DROP FUNCTION foo(text);
424+
`,
425+
nil,
426+
},
427+
{
428+
`
429+
CREATE FUNCTION foo(bar text) RETURNS bool AS $$ SELECT true $$ LANGUAGE sql;
430+
DROP FUNCTION foo;
431+
`,
432+
nil,
433+
},
434+
// CREATE FUNCTION foo(bar text) RETURNS bool AS $$ SELECT true $$ LANGUAGE sql;
435+
// CREATE FUNCTION foo() RETURNS bool AS $$ SELECT true $$ LANGUAGE sql;
436+
// DROP FUNCTION foo -- FAIL
437+
{
438+
`
439+
CREATE TABLE pg_temp.migrate (val SERIAL);
440+
INSERT INTO pg_temp.migrate (val) SELECT val FROM old;
441+
INSERT INTO new (val) SELECT val FROM pg_temp.migrate;
442+
`,
443+
&catalog.Schema{
444+
Name: "pg_temp",
445+
Tables: []*catalog.Table{
446+
{
447+
Rel: &ast.TableName{Schema: "pg_temp", Name: "migrate"},
448+
Columns: []*catalog.Column{
449+
{
450+
Name: "val",
451+
Type: ast.TypeName{Name: "serial"},
460452
},
461453
},
462454
},
463455
},
464456
},
465-
*/
457+
},
466458
{
467459
`
468460
CREATE SCHEMA foo;

0 commit comments

Comments
 (0)