标记“(”是无效错误,调用分配给包含 json 类型的自定义类型的函数
Token "(" is invalid error calling a function that assigns into a custom type containing a json type
我正在使用 Postgresql 解码 JWT。函数 test
是它实际功能的简化版本。此处它用于显示我也收到的错误消息。
CREATE TYPE parts AS (header json, payload json, valid boolean);
CREATE OR REPLACE FUNCTION verify(token text, secret text, algorithm text DEFAULT 'HS256')
RETURNS parts AS $$
SELECT
'{"alg": "HS256","typ": "JWT"}'::json AS header,
'{"id": 1, "exp": 1524683318}'::json AS payload,
TRUE AS valid;
$$ LANGUAGE sql;
CREATE OR REPLACE FUNCTION test(token text)
RETURNS parts AS $$
DECLARE
jwt_parts parts;
BEGIN
SELECT verify(test.token, 'secret')
INTO jwt_parts;
RETURN jwt_parts;
END
$$ LANGUAGE plpgsql;
在 运行 SELECT test('xx')
之后,这是我遇到的错误(在 Postgres v10.1 上):
ERROR: invalid input syntax for type json
DETAIL: Token "(" is invalid.
CONTEXT: JSON data, line 1: (...
PL/pgSQL function test(text) line 5 at SQL statement
我想 SELECT ... INTO
我的自定义 parts
类型。我尝试了很多改写的方法,但我怀疑这可以比我迄今为止尝试过的方法简单得多。
PS: 我正在使用的真正函数 test(token text)
更大,需要 plpgsql
语言。
PS2:只是为了确保当前给出的答案对访问此问题的人有意义。我问题的原始版本有一个这样的测试函数:
CREATE OR REPLACE FUNCTION test(token text)
RETURNS parts AS $$
DECLARE
jwt_parts parts;
BEGIN
SELECT ('{"alg": "HS256","typ": "JWT"}', '{"id": 1, "exp": 1524683318}', TRUE)
INTO jwt_parts;
RETURN jwt_parts;
END
$$ LANGUAGE plpgsql;
你不应该 select 一个元组,而是一个常规行(删除括号):
SELECT '{"alg": "HS256","typ": "JWT"}', '{"id": 1, "exp": 1524683318}', TRUE
圆括号使您 select 单列(行类型),而实际上您需要三列。例如:
select (1,2,3)
>>
row
--------
(1,2,3)
(1 row)
所以省略select
:
后面的括号
SELECT ('{"alg": "HS256","typ": "JWT"}', '{"id": 1, "exp": 1524683318}', TRUE)
^^^ ^^^
在回复您的评论时,您的新查询中的错误来自:
SELECT verify('xxx', 'yyy')
INTO jwt_parts;
这再次尝试将单列分配给三列类型。相反,您可以使用:
SELECT * FROM verify('xxx', 'yyy')
INTO jwt_parts;
我正在使用 Postgresql 解码 JWT。函数 test
是它实际功能的简化版本。此处它用于显示我也收到的错误消息。
CREATE TYPE parts AS (header json, payload json, valid boolean);
CREATE OR REPLACE FUNCTION verify(token text, secret text, algorithm text DEFAULT 'HS256')
RETURNS parts AS $$
SELECT
'{"alg": "HS256","typ": "JWT"}'::json AS header,
'{"id": 1, "exp": 1524683318}'::json AS payload,
TRUE AS valid;
$$ LANGUAGE sql;
CREATE OR REPLACE FUNCTION test(token text)
RETURNS parts AS $$
DECLARE
jwt_parts parts;
BEGIN
SELECT verify(test.token, 'secret')
INTO jwt_parts;
RETURN jwt_parts;
END
$$ LANGUAGE plpgsql;
在 运行 SELECT test('xx')
之后,这是我遇到的错误(在 Postgres v10.1 上):
ERROR: invalid input syntax for type json
DETAIL: Token "(" is invalid.
CONTEXT: JSON data, line 1: (...
PL/pgSQL function test(text) line 5 at SQL statement
我想 SELECT ... INTO
我的自定义 parts
类型。我尝试了很多改写的方法,但我怀疑这可以比我迄今为止尝试过的方法简单得多。
PS: 我正在使用的真正函数 test(token text)
更大,需要 plpgsql
语言。
PS2:只是为了确保当前给出的答案对访问此问题的人有意义。我问题的原始版本有一个这样的测试函数:
CREATE OR REPLACE FUNCTION test(token text)
RETURNS parts AS $$
DECLARE
jwt_parts parts;
BEGIN
SELECT ('{"alg": "HS256","typ": "JWT"}', '{"id": 1, "exp": 1524683318}', TRUE)
INTO jwt_parts;
RETURN jwt_parts;
END
$$ LANGUAGE plpgsql;
你不应该 select 一个元组,而是一个常规行(删除括号):
SELECT '{"alg": "HS256","typ": "JWT"}', '{"id": 1, "exp": 1524683318}', TRUE
圆括号使您 select 单列(行类型),而实际上您需要三列。例如:
select (1,2,3)
>>
row
--------
(1,2,3)
(1 row)
所以省略select
:
SELECT ('{"alg": "HS256","typ": "JWT"}', '{"id": 1, "exp": 1524683318}', TRUE)
^^^ ^^^
在回复您的评论时,您的新查询中的错误来自:
SELECT verify('xxx', 'yyy')
INTO jwt_parts;
这再次尝试将单列分配给三列类型。相反,您可以使用:
SELECT * FROM verify('xxx', 'yyy')
INTO jwt_parts;