Amazon Redshift ОШИБКА СОЗДАНИЯ ФУНКЦИИ: 42601: синтаксическая ошибка, равная или близкая к «по умолчанию» - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь создать функцию в Redshift через Aginity (v4.9.1.2686), и я получаю следующую ошибку:

ОШИБКА: 42601: синтаксическая ошибка в "или по умолчанию"

Код функции:

CREATE OR REPLACE FUNCTION search_columns (
    searchfield text,
    searchtables name[] default '{}',
    searchschema name[] default '{}')
RETURNS table(schemaname text, tablename text, columnname text, rowctid text)
AS $$
begin
    FOR schemaname, tablename, columnname IN
        SELECT c.table_schema, c.table_name, c.column_name
        FROM information_schema.columns c
        JOIN information_schema.tables t ON (t.table_name = c.table_name AND t.table_schema = c.table_schema)
        WHERE (c.table_name=ANY(searchtables) OR searchtables='{}')
        AND (c.table_schema=ANY(searchschema) OR searchschema='{}')
        AND t.table_type='BASE TABLE'
    LOOP
        EXECUTE format('SELECT ctid FROM %I.%I WHERE cast(%I as text)=%L', schemaname, tablename, columnname, searchfield)
        INTO rowctid;
    IF rowctid IS NOT NULL 
        THEN RETURN NEXT;
    END IF;
    END LOOP;
END;
$$ language plpgsql;

РЕДАКТИРОВАТЬ

Попытался удалить значения по умолчанию и получить другую ошибку:

ОШИБКА: 42601: синтаксическая ошибка в или рядом с "таблицей"

CREATE OR REPLACE FUNCTION search_columns (
    searchfield text,
    searchtables name[] ,
    searchschema name[] )
RETURNS table(schemaname text, tablename text, columnname text, rowctid text)
AS $$
begin
    FOR schemaname, tablename, columnname IN
        SELECT c.table_schema, c.table_name, c.column_name
        FROM information_schema.columns c
        JOIN information_schema.tables t ON (t.table_name = c.table_name AND t.table_schema = c.table_schema)
        WHERE (c.table_name=ANY(searchtables) OR searchtables='{}')
        AND (c.table_schema=ANY(searchschema) OR searchschema='{}')
        AND t.table_type = 'BASE TABLE'
    LOOP
        EXECUTE format('SELECT ctid FROM %I.%I WHERE cast(%I as text)=%L', schemaname, tablename, columnname, searchfield)
        INTO rowctid;
    IF rowctid IS NOT NULL 
        THEN RETURN NEXT;
    END IF;
    END LOOP;
END;
$$ language plpgsql;
...