Named Operators - Mailing list pgsql-hackers
From | Gurjeet Singh |
---|---|
Subject | Named Operators |
Date | |
Msg-id | CABwTF4VVuacLV+coERacdDxUXg5tDMHZxvgH5+ek0UZvoq386g@mail.gmail.com Whole thread Raw |
Responses |
Re: Named Operators
Re: Named Operators |
List | pgsql-hackers |
Technically correct name of this feature would be Readable Names for Operators, or Pronounceable Names for Operators. But I'd like to call it Named Operators. With this patch in place, the users can name the operators as :some_pronounceable_name: instead of having to choose from the special characters like #^&@. For example, users will be able to create and use operators like: select expr1 :distance: expr2, expr3 :contains_all: expr4, expr5 :contains_any: expr6 expr7 :contains_exactly_two_of: expr8 from mytable; instead of being forced to use these: select expr1 <#> expr2, expr3 ?& expr4, expr5 ?| expr6 expr7 ??!! expr8 -- ¯\_(ツ)_/¯ from mytable; I think Named Operators will significantly improve the readability of queries. After a little trial-an-error, it was easy to develop the scan.l rules to implement this feature, without flex barfing. The hard part has been convincing myself that this is a safe implementation, even though there are no regressions in `make check`. I am unsure of this implementation's compatibility with the SQL Spec, and I'm not able to envision problems with its interaction with some current or potential feature of Postgres. So I'd really appreciate feedback from someone who is conversant with the SQL Spec. If the colon character being used as a delimiter poses a challenge, other good candidates for the delimiter seem to be one of ~^` Although I haven't tested any of these to see if they cause a regression. The colon character is be preferable for the delimiter, since it is already used in the typecast :: operator. I tried to strip the delimiters/colons from the name right in the scanner, primarily because that would allow the identifier part of the name to be as long as NAMEDATALEN-1, just like other identifiers Postgres allows. Added benefit of stripping delimiters was that the rest of the code, and catalogs/storage won't have to see the delimiters. But stripping the delimiters made the code brittle; some places in code now had to be taught different handling depending on whether the operator name was coming from the user command, or from the catalogs. I had to special-case code in pg_dump, as well. To share code with frontends like pg_dump, I had to place code in src/common/. I was still not able to address some obvious bugs. By retaining the delimiters : in the name, the code became much simpler; pg_dump support came for free! The bugs became a non-issue. To see how much code and complexity was reduced, one can see this commit [1]. The downside of retaining the delimiters is that the identifier part of the name can be no more than NAMEDATALEN-3 in length. Because of the minimal changes to the scanner rules, and no changes in the grammar, I don't think there's any impact on precedence and associativity rules of the operators. I'd be happy to learn otherwise. Here's a rudimentary test case to demonstrate the feature: create operator :add_point: (function = box_add, leftarg = box, rightarg = point); create table test(a box); insert into test values('((0,0),(1,1))'), ('((0,0),(2,1))'); select a as original, a :add_point: '(1,1)' as modified from test; drop operator :add_point:(box, point); Feedback will be much appreciated! [1]: Commit: Don't strip the delimiters https://github.com/gurjeet/postgres/commit/62d11a578e5325c32109bb2a55a624d0d89d4b7e [2]: Git branch named_operators https://github.com/gurjeet/postgres/tree/named_operators Best regards, Gurjeet http://Gurje.et
Attachment
pgsql-hackers by date: