postgres_fdw: Remove redundancy in postgresAcquireSampleRowsFunc().
authorEtsuro Fujita
Wed, 3 Jul 2019 08:51:00 +0000 (17:51 +0900)
committerEtsuro Fujita
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)