]> granicus.if.org Git - postgresql/commitdiff
postgres_fdw: Remove redundancy in postgresAcquireSampleRowsFunc().
authorEtsuro Fujita <efujita@postgresql.org>
Wed, 3 Jul 2019 08:51:00 +0000 (17:51 +0900)
committerEtsuro Fujita <efujita@postgresql.org>
Wed, 3 Jul 2019 08:51:00 +0000 (17:51 +0900)
Previously, in the loop in postgresAcquireSampleRowsFunc() to iterate
fetching rows from a given remote table, we redundantly 1) determined the
fetch size by parsing the table's server/table-level options and then 2)
constructed the fetch command; remove that redundancy.

Author: Etsuro Fujita
Reviewed-by: Julien Rouhaud
Discussion: https://postgr.es/m/CAPmGK17_urk9qkLV65_iYMFw64z5qhdfhY=tMVV6Jg4KNYx8+w@mail.gmail.com

contrib/postgres_fdw/postgres_fdw.c

index 1759b9e1b6d822b3809e719c4ca390910020ad2f..033aeb2556e188a5e4fa4c7f3d1933828d2fc579 100644 (file)
@@ -4490,20 +4490,51 @@ postgresAcquireSampleRowsFunc(Relation relation, int elevel,
        /* In what follows, do not risk leaking any PGresults. */
        PG_TRY();
        {
+               char            fetch_sql[64];
+               int                     fetch_size;
+               ListCell   *lc;
+
                res = pgfdw_exec_query(conn, sql.data);
                if (PQresultStatus(res) != PGRES_COMMAND_OK)
                        pgfdw_report_error(ERROR, res, conn, false, sql.data);
                PQclear(res);
                res = NULL;
 
+               /*
+                * Determine the fetch size.  The default is arbitrary, but shouldn't
+                * be enormous.
+                */
+               fetch_size = 100;
+               foreach(lc, server->options)
+               {
+                       DefElem    *def = (DefElem *) lfirst(lc);
+
+                       if (strcmp(def->defname, "fetch_size") == 0)
+                       {
+                               fetch_size = strtol(defGetString(def), NULL, 10);
+                               break;
+                       }
+               }
+               foreach(lc, table->options)
+               {
+                       DefElem    *def = (DefElem *) lfirst(lc);
+
+                       if (strcmp(def->defname, "fetch_size") == 0)
+                       {
+                               fetch_size = strtol(defGetString(def), NULL, 10);
+                               break;
+                       }
+               }
+
+               /* Construct command to fetch rows from remote. */
+               snprintf(fetch_sql, sizeof(fetch_sql), "FETCH %d FROM c%u",
+                                fetch_size, cursor_number);
+
                /* Retrieve and process rows a batch at a time. */
                for (;;)
                {
-                       char            fetch_sql[64];
-                       int                     fetch_size;
                        int                     numrows;
                        int                     i;
-                       ListCell   *lc;
 
                        /* Allow users to cancel long query */
                        CHECK_FOR_INTERRUPTS();
@@ -4514,33 +4545,7 @@ postgresAcquireSampleRowsFunc(Relation relation, int elevel,
                         * then just adjust rowstoskip and samplerows appropriately.
                         */
 
-                       /* The fetch size is arbitrary, but shouldn't be enormous. */
-                       fetch_size = 100;
-                       foreach(lc, server->options)
-                       {
-                               DefElem    *def = (DefElem *) lfirst(lc);
-
-                               if (strcmp(def->defname, "fetch_size") == 0)
-                               {
-                                       fetch_size = strtol(defGetString(def), NULL, 10);
-                                       break;
-                               }
-                       }
-                       foreach(lc, table->options)
-                       {
-                               DefElem    *def = (DefElem *) lfirst(lc);
-
-                               if (strcmp(def->defname, "fetch_size") == 0)
-                               {
-                                       fetch_size = strtol(defGetString(def), NULL, 10);
-                                       break;
-                               }
-                       }
-
                        /* Fetch some rows */
-                       snprintf(fetch_sql, sizeof(fetch_sql), "FETCH %d FROM c%u",
-                                        fetch_size, cursor_number);
-
                        res = pgfdw_exec_query(conn, fetch_sql);
                        /* On error, report the original query, not the FETCH. */
                        if (PQresultStatus(res) != PGRES_TUPLES_OK)