Thread
-
Re: Row pattern recognition
Tatsuo Ishii <ishii@postgresql.org> — 2025-11-19T06:51:02Z
> On 18/11/2025 06:03, Chao Li wrote: >> 1 - 0001 - kwlist.h >> ``` >> +PG_KEYWORD("define", DEFINE, RESERVED_KEYWORD, BARE_LABEL) >> ``` >> >> Why do we add “define” as a reserved keyword? From the SQL example >> you put in 0006: >> ``` >> <programlisting> >> SELECT company, tdate, price, >> first_value(price) OVER w, >> max(price) OVER w, >> count(price) OVER w >> FROM stock >> WINDOW w AS ( >> PARTITION BY company >> ORDER BY tdate >> ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING >> AFTER MATCH SKIP PAST LAST ROW >> INITIAL >> PATTERN (LOWPRICE UP+ DOWN+) >> DEFINE >> LOWPRICE AS price <= 100, >> UP AS price > PREV(price), >> DOWN AS price < PREV(price) >> ); >> </programlisting> >> ``` >> >> PARTITION is at the same level as DEFINE, but it’s not defined as a >> reserved keyword: >> ``` >> PG_KEYWORD("partition", PARTITION, UNRESERVED_KEYWORD, BARE_LABEL) >> ``` >> >> Even in this patch,”initial”,”past”, “pattern” and “seek” are >> defined as unreserved, why? >> >> So I just want to clarify. > > > Because of position. Without making DEFINE a reserved keyword, how do > you know that it isn't another variable in the PATTERN clause? I think we don't need to worry about this because PATTERN_P is in the $nonassoc list in the patch, which gives PATTERN different precedence from DEFINE. @@ -888,6 +896,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %nonassoc UNBOUNDED NESTED /* ideally would have same precedence as IDENT */ %nonassoc IDENT PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP SET KEYS OBJECT_P SCALAR VALUE_P WITH WITHOUT PATH + AFTER INITIAL SEEK PATTERN_P And I think we could change DEFINE to an unreserved keyword. Attached is a patch to do that, on top of v35-0001. Best regards, -- Tatsuo Ishii SRA OSS K.K. English: http://www.sraoss.co.jp/index_en/ Japanese:http://www.sraoss.co.jp