On Tue, Jun 13, 2023 at 02:18:15AM +0000, 
fujii.y...@df.mitsubishielectric.co.jp wrote:
> Hi Mr.Momjian.
> 
> Thank you for advises.
> 
> > From: Bruce Momjian <br...@momjian.us>
> > Sent: Monday, June 12, 2023 10:38 PM
> > > I understand what the problem is. I will put a mechanism maintaining 
> > > compatibility into the patch.
> > > I believe there are three approaches.
> > > Approach 1-1 is preferable because it does not require additional options 
> > > for postgres_fdw.
> > > I will revise the patch according to Approach 1-1, unless otherwise 
> > > commented.
> > >
> > > Approach1:
> > > I ensure that postgres_fdw retrieves the version of each remote server
> > > and does not partial aggregate pushd down if the server version is less 
> > > than 17.
> > > There are two approaches to obtaining remote server versions.
> > > Approach1-1: postgres_fdw connects a remote server and use 
> > > PQserverVersion().
> > > Approach1-2: Adding a postgres_fdw option about a remote server version 
> > > (like "server_version").
> > >
> > > Approach2:
> > > Adding a postgres_fdw option for partial aggregate pushdown is enable
> > > or not (like enable_partial_aggregate_pushdown).
> > 
> > These are good questions.  Adding a postgres_fdw option called 
> > enable_partial_aggregate_pushdown helps make the
> > purpose of the option clear, but remote_version can be used for future 
> > breakage as well.
> > 
> > I think remote_version is the best idea, and in the documentation for the 
> > option, let's explicitly say it is useful to disable
> > partial aggregates pushdown on pre-PG 17 servers.  If we need to use the 
> > option for other cases, we can just update the
> > documentation.  When the option is blank, the default, everything is pushed 
> > down.
> > 
> > I see remote_version a logical addition to match our "extensions" option 
> > that controls what extension functions can be
> > pushed down.
> 
> Thank you for your perspective.
> So, of the approaches I have presented, you think that approach 1-2 is
> preferable and that the option name remote_server is preferable?
> Indeed, the option of a remote version may have other uses.
> However, this information can be obtained by connecting to a remote server, 
> I'm concerned that some people may find this option redundant.
> 
> Is the problem with approach 1-1 because the user cannot decide whether to 
> include the compatibility check in the decision to do partial aggregate 
> pushdown or not?
> # If Approach 1-1 is taken, the problem is that this feature cannot be used 
> for all bait-in aggregate functions
> # when the remote server is older than PG17.
> If so, Approache1-3 below seem more desirable.
> Would it be possible for us to hear your thoughts?
> 
> Approache1-3:We add a postgres_fdw option about a compatibility check for 
> partial aggregate pushdown
> (like "enable_aggpartialfunc_compatibility_check"). This option is false, the 
> default.
> When this option is true, postgres_fdw obtains the remote server version by 
> connecting the remote server and using PQserverVersion(). 
> And if the remote server version is older than PG17, then the partial 
> aggregate pushdown feature is enable for all buit-in aggregate functions.
> Otherwise the partial aggregate pushdown feature is disable for all buit-in 
> aggregate functions.

Apologies for the delay in my reply to this email.  I looked into the
existing code and I found three things:

1)  PQserverVersion() just pulls the conn->sversion value from the
existing connection because pqSaveParameterStatus() pulls the
server_version sent by the backend;  no need to issue SELECT version().

2)  postgres_fdw already has nine calls to GetConnection(), and only
opens a connection if it already doesn't have one.  Here is an example:

        /* Get the remote estimate */
        conn = GetConnection(fpinfo->user, false, NULL);
        get_remote_estimate(sql.data, conn, &rows, &width,
                            &startup_cost, &total_cost);
        ReleaseConnection(conn);

Therefore, it seems like it would be near-zero cost to just call conn =
GetConnection() and then PQserverVersion(conn), and ReleaseConnection().
You can then use the return value of PQserverVersion() to determine if
you can push down partial aggregates.

3)  Looking at postgresAcquireSampleRowsFunc(), I see this exact method
used:

    conn = GetConnection(user, false, NULL);

    /* We'll need server version, so fetch it now. */
    server_version_num = PQserverVersion(conn);

    ...

    if ((server_version_num < 95000) &&
        (method == ANALYZE_SAMPLE_SYSTEM ||
         method == ANALYZE_SAMPLE_BERNOULLI))
        ereport(ERROR,
                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                 errmsg("remote server does not support TABLESAMPLE feature")));

I am sorry if you already knew all this, but I didn't.

-- 
  Bruce Momjian  <br...@momjian.us>        https://momjian.us
  EDB                                      https://enterprisedb.com

  Only you can decide what is important to you.


Reply via email to