2016-09-26 6 views
3

私は最近、PostgreSQLのJSONBタイプ用のカスタムマイナス演算子を作成することについてblog postと書いています。Postgresのカスタム演算子の優先順位は組み込みですか?

基本的には、オペレータは、このように作成されました:この演算子が作成された後

CREATE OPERATOR - (
    PROCEDURE = jsonb_minus, 
    LEFTARG = jsonb, 
    RIGHTARG = jsonb) 

しかし、コメンターとして正しくデフォルトJSONBは、指摘 - TEXTはもう機能していません。エラーでこのクエリ結果:invalid input syntax for type json

SELECT '{"a":1, "b":{"c":123, "d":"test"}}'::jsonb - 'a' 

結果。 2番目の引数をTEXTに明示的にキャストして機能させる必要があります。

は、カスタム演算子を削除した後、通常の動作が復元され、上記のクエリは、所望の結果を与える: {"b": {"c": 123, "d": "test"}}

なぜPostgresは明示的な型が指定されていない場合、デフォルトのテキストの上JSONBにキャストしようとするだろうか?これを避けることはできますか?

答えて

4

問題は、ドキュメントに記載されているoperator type resolution rulesのために演算子を定義するときに発生します。

-演算子の引数は、jsonb(左の引数)とunknown(右の引数)の型を持ちます。 PostgreSQLのタイプunknownは、string literalsに割り当てられたタイプです。カスタム演算子が定義されている場合

は今、オペレータのタイプの分解能は、ステップであなたのオペレータを選択する結果
  1. Check for an operator accepting exactly the input argument types. If one exists (there can be only one exact match in the set of operators considered), use it.

    a. If one argument of a binary operator invocation is of the unknown type, then assume it is the same type as the other argument for this check. Invocations involving two unknown inputs, or a unary operator with an unknown input, will never find a match at this step.

2.A:

、エラーになり 'a'jsonbにキャストされます unknown引数、あなた観察する。

+0

ああ、秒でそれを打ち負かす:-) もう1つ注目すべきは、カスタム演算子(いくつかの言語で使用されているのがわかります)の優先順位を変更できないことです。 https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-PRECEDENCE –

関連する問題