public inbox for [email protected]
help / color / mirror / Atom feed[PATCH v14 3/8] Row pattern recognition patch (rewriter).
3+ messages / 3 participants
[nested] [flat]
* [PATCH v14 3/8] Row pattern recognition patch (rewriter).
@ 2024-02-28 13:59 Tatsuo Ishii <[email protected]>
0 siblings, 0 replies; 3+ messages in thread
From: Tatsuo Ishii @ 2024-02-28 13:59 UTC (permalink / raw)
---
src/backend/utils/adt/ruleutils.c | 103 ++++++++++++++++++++++++++++++
1 file changed, 103 insertions(+)
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index a928a8c55d..5ea5a60975 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -427,6 +427,10 @@ static void get_rule_groupingset(GroupingSet *gset, List *targetlist,
bool omit_parens, deparse_context *context);
static void get_rule_orderby(List *orderList, List *targetList,
bool force_colno, deparse_context *context);
+static void get_rule_pattern(List *patternVariable, List *patternRegexp,
+ bool force_colno, deparse_context *context);
+static void get_rule_define(List *defineClause, List *patternVariables,
+ bool force_colno, deparse_context *context);
static void get_rule_windowclause(Query *query, deparse_context *context);
static void get_rule_windowspec(WindowClause *wc, List *targetList,
deparse_context *context);
@@ -6459,6 +6463,67 @@ get_rule_orderby(List *orderList, List *targetList,
}
}
+/*
+ * Display a PATTERN clause.
+ */
+static void
+get_rule_pattern(List *patternVariable, List *patternRegexp,
+ bool force_colno, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ const char *sep;
+ ListCell *lc_var,
+ *lc_reg = list_head(patternRegexp);
+
+ sep = "";
+ appendStringInfoChar(buf, '(');
+ foreach(lc_var, patternVariable)
+ {
+ char *variable = strVal((String *) lfirst(lc_var));
+ char *regexp = NULL;
+
+ if (lc_reg != NULL)
+ {
+ regexp = strVal((String *) lfirst(lc_reg));
+
+ lc_reg = lnext(patternRegexp, lc_reg);
+ }
+
+ appendStringInfo(buf, "%s%s", sep, variable);
+ if (regexp !=NULL)
+ appendStringInfoString(buf, regexp);
+
+ sep = " ";
+ }
+ appendStringInfoChar(buf, ')');
+}
+
+/*
+ * Display a DEFINE clause.
+ */
+static void
+get_rule_define(List *defineClause, List *patternVariables,
+ bool force_colno, deparse_context *context)
+{
+ StringInfo buf = context->buf;
+ const char *sep;
+ ListCell *lc_var,
+ *lc_def;
+
+ sep = " ";
+ Assert(list_length(patternVariables) == list_length(defineClause));
+
+ forboth(lc_var, patternVariables, lc_def, defineClause)
+ {
+ char *varName = strVal(lfirst(lc_var));
+ TargetEntry *te = (TargetEntry *) lfirst(lc_def);
+
+ appendStringInfo(buf, "%s%s AS ", sep, varName);
+ get_rule_expr((Node *) te->expr, context, false);
+ sep = ",\n ";
+ }
+}
+
/*
* Display a WINDOW clause.
*
@@ -6596,6 +6661,44 @@ get_rule_windowspec(WindowClause *wc, List *targetList,
appendStringInfoString(buf, "EXCLUDE GROUP ");
else if (wc->frameOptions & FRAMEOPTION_EXCLUDE_TIES)
appendStringInfoString(buf, "EXCLUDE TIES ");
+ /* RPR */
+ if (wc->rpSkipTo == ST_NEXT_ROW)
+ appendStringInfoString(buf,
+ "\n AFTER MATCH SKIP TO NEXT ROW ");
+ else if (wc->rpSkipTo == ST_PAST_LAST_ROW)
+ appendStringInfoString(buf,
+ "\n AFTER MATCH SKIP PAST LAST ROW ");
+ else if (wc->rpSkipTo == ST_FIRST_VARIABLE)
+ appendStringInfo(buf,
+ "\n AFTER MATCH SKIP TO FIRST %s ",
+ wc->rpSkipVariable);
+ else if (wc->rpSkipTo == ST_LAST_VARIABLE)
+ appendStringInfo(buf,
+ "\n AFTER MATCH SKIP TO LAST %s ",
+ wc->rpSkipVariable);
+ else if (wc->rpSkipTo == ST_VARIABLE)
+ appendStringInfo(buf,
+ "\n AFTER MATCH SKIP TO %s ",
+ wc->rpSkipVariable);
+
+ if (wc->initial)
+ appendStringInfoString(buf, "\n INITIAL");
+
+ if (wc->patternVariable)
+ {
+ appendStringInfoString(buf, "\n PATTERN ");
+ get_rule_pattern(wc->patternVariable, wc->patternRegexp,
+ false, context);
+ }
+
+ if (wc->defineClause)
+ {
+ appendStringInfoString(buf, "\n DEFINE\n");
+ get_rule_define(wc->defineClause, wc->patternVariable,
+ false, context);
+ appendStringInfoChar(buf, ' ');
+ }
+
/* we will now have a trailing space; remove it */
buf->len--;
}
--
2.25.1
----Next_Part(Thu_Feb_29_09_19_54_2024_640)--
Content-Type: Text/X-Patch; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="v14-0004-Row-pattern-recognition-patch-planner.patch"
^ permalink raw reply [nested|flat] 3+ messages in thread
* Last removed wal segment file
@ 2024-12-23 03:52 mahendrakar s <[email protected]>
2024-12-23 05:16 ` Re: Last removed wal segment file Michael Paquier <[email protected]>
0 siblings, 1 reply; 3+ messages in thread
From: mahendrakar s @ 2024-12-23 03:52 UTC (permalink / raw)
To: PostgreSQL Hackers <[email protected]>
Hi Hackers,
Is there any psql utility function that returns the last removed wal
segment file?
I see there is a method: XLogGetLastRemovedSegno in xlog.c.
Would be happy to add a new psql function around it (similar to:
pg_walfile_name, pg_last_wal_replay_lsn, etc other utility functions
we have).
Thanks,
Mahendrakar.
^ permalink raw reply [nested|flat] 3+ messages in thread
* Re: Last removed wal segment file
2024-12-23 03:52 Last removed wal segment file mahendrakar s <[email protected]>
@ 2024-12-23 05:16 ` Michael Paquier <[email protected]>
0 siblings, 0 replies; 3+ messages in thread
From: Michael Paquier @ 2024-12-23 05:16 UTC (permalink / raw)
To: mahendrakar s <[email protected]>; +Cc: PostgreSQL Hackers <[email protected]>
On Mon, Dec 23, 2024 at 09:22:06AM +0530, mahendrakar s wrote:
> Is there any psql utility function that returns the last removed wal
> segment file?
> I see there is a method: XLogGetLastRemovedSegno in xlog.c.
> Would be happy to add a new psql function around it (similar to:
> pg_walfile_name, pg_last_wal_replay_lsn, etc other utility functions
> we have).
What's your use-case for it? I have to admit that finding out this
information can be a bit annoying as it requires checking the state of
archiving and the replication slots from which you would get a LSN
(not a segment name). Of course, one can use pg_ls_waldir() these
days and it would also work based on timeline number and even partial
segments which are not removed by the checkpointer. That's more
expensive than looking at a single counter in shmem.
If you wrap a SQL function around that, the segment number would not
be enough to guess which segment is removed: the timeline of the file
removed should also be added. Hence XLogCtlData should be extended
with a kind of lastRemovedSegTLI or equivalent to be able to rebuild
the file name from the data in shared memory. Note that
UpdateLastRemovedPtr() extracts the timeline number, does not store
it.
Also, note that UpdateLastRemovedPtr() has a small race condition when
it comes to monitoring: it is called before the file is physically
removed in RemoveOldXlogFiles(). It would not really matter much in
practice, I guess..
--
Michael
Attachments:
[application/pgp-signature] signature.asc (833B, ../../[email protected]/2-signature.asc)
download
^ permalink raw reply [nested|flat] 3+ messages in thread
end of thread, other threads:[~2024-12-23 05:16 UTC | newest]
Thread overview: 3+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2024-02-28 13:59 [PATCH v14 3/8] Row pattern recognition patch (rewriter). Tatsuo Ishii <[email protected]>
2024-12-23 03:52 Last removed wal segment file mahendrakar s <[email protected]>
2024-12-23 05:16 ` Re: Last removed wal segment file Michael Paquier <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox