Thread

  1. 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 &lt;= 100,
    >>    UP AS price &gt; PREV(price),
    >>    DOWN AS price &lt; 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