This is an automated email from the ASF dual-hosted git repository.

maxyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git


The following commit(s) were added to refs/heads/main by this push:
     new f7a5b7aa230 Allow ON COORDINATOR for ext file:// protocol
f7a5b7aa230 is described below

commit f7a5b7aa230fce5852a190d9803fb063a1c7dd97
Author: Maxim Smyatkin <[email protected]>
AuthorDate: Sat Sep 6 14:38:52 2025 +0300

    Allow ON COORDINATOR for ext file:// protocol
    
    This commit allows `CREATE EXTERNAL TABLE ... LOCATION('file://...') ON
    COORDINATOR`. Before this we could only access files on segments with
    file-based exttables.
    The syntax was already there but was not implemented.
    Added new test case and modified the existing one for ON COORDINATOR
    syntax.
---
 .../src/test/regress/input/external_table.source   | 14 +++++++++++-
 .../src/test/regress/output/external_table.source  | 26 ++++++++++++++++++++--
 .../regress/output/external_table_optimizer.source | 26 ++++++++++++++++++++--
 src/backend/access/external/external.c             |  9 +++++++-
 src/test/regress/input/external_table.source       | 14 +++++++++++-
 src/test/regress/output/external_table.source      | 26 ++++++++++++++++++++--
 .../regress/output/external_table_optimizer.source | 26 ++++++++++++++++++++--
 7 files changed, 130 insertions(+), 11 deletions(-)

diff --git a/contrib/pax_storage/src/test/regress/input/external_table.source 
b/contrib/pax_storage/src/test/regress/input/external_table.source
index ea018e581bf..e4d57c1ae83 100644
--- a/contrib/pax_storage/src/test/regress/input/external_table.source
+++ b/contrib/pax_storage/src/test/regress/input/external_table.source
@@ -1365,10 +1365,22 @@ SELECT COUNT(*) FROM 
gp_read_error_log('exttab_heap_join_1');
 \! rm @abs_srcdir@/data/tableless.csv
 
 -- start_ignore
+DROP EXTERNAL TABLE IF EXISTS ext_nation_on_coordinator;
 DROP EXTERNAL TABLE IF EXISTS exttab_with_on_coordinator;
 -- end_ignore
 
--- Create external table with on clause
+-- Create external table on coordinator
+-- good, should fetch data from coordinator
+CREATE EXTERNAL TABLE ext_nation_on_coordinator ( N_NATIONKEY  INTEGER ,
+                            N_NAME       CHAR(25) ,
+                            N_REGIONKEY  INTEGER ,
+                            N_COMMENT    VARCHAR(152))
+location ('file://@hostname@@abs_srcdir@/data/nation.tbl' ) ON COORDINATOR
+FORMAT 'text' (delimiter '|');
+SELECT gp_segment_id, * FROM ext_nation_on_coordinator ORDER BY N_NATIONKEY 
DESC LIMIT 5;
+DROP EXTERNAL TABLE IF EXISTS ext_nation_on_coordinator;
+
+-- bad, should error
 CREATE EXTERNAL TABLE exttab_with_on_coordinator( i int, j text )
 LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') ON 
COORDINATOR FORMAT 'TEXT' (DELIMITER '|');
 
diff --git a/contrib/pax_storage/src/test/regress/output/external_table.source 
b/contrib/pax_storage/src/test/regress/output/external_table.source
index 19791a992c3..53c72200f01 100644
--- a/contrib/pax_storage/src/test/regress/output/external_table.source
+++ b/contrib/pax_storage/src/test/regress/output/external_table.source
@@ -2601,14 +2601,36 @@ SELECT COUNT(*) FROM 
gp_read_error_log('exttab_heap_join_1');
 
 \! rm @abs_srcdir@/data/tableless.csv
 -- start_ignore
+DROP EXTERNAL TABLE IF EXISTS ext_nation_on_coordinator;
+NOTICE:  table "ext_nation_on_coordinator" does not exist, skipping
 DROP EXTERNAL TABLE IF EXISTS exttab_with_on_coordinator;
 NOTICE:  table "exttab_with_on_coordinator" does not exist, skipping
 -- end_ignore
--- Create external table with on clause
+-- Create external table on coordinator
+-- good, should fetch data from coordinator
+CREATE EXTERNAL TABLE ext_nation_on_coordinator ( N_NATIONKEY  INTEGER ,
+                            N_NAME       CHAR(25) ,
+                            N_REGIONKEY  INTEGER ,
+                            N_COMMENT    VARCHAR(152))
+location ('file://@hostname@@abs_srcdir@/data/nation.tbl' ) ON COORDINATOR
+FORMAT 'text' (delimiter '|');
+SELECT gp_segment_id, * FROM ext_nation_on_coordinator ORDER BY N_NATIONKEY 
DESC LIMIT 5;
+ gp_segment_id | n_nationkey |          n_name           | n_regionkey |       
                                            n_comment                           
                         
+---------------+-------------+---------------------------+-------------+----------------------------------------------------------------------------------------------------------------
+            -1 |          24 | UNITED STATES             |           1 | y 
final packages. slow foxes cajole quickly. quickly silent platelets breach 
ironic accounts. unusual pinto be
+            -1 |          23 | UNITED KINGDOM            |           3 | eans 
boost carefully special requests. accounts are. carefull
+            -1 |          22 | RUSSIA                    |           3 |  
requests against the platelets use never according to the quickly regular pint
+            -1 |          21 | VIETNAM                   |           2 | hely 
enticingly express accounts. even, final 
+            -1 |          20 | SAUDI ARABIA              |           4 | ts. 
silent requests haggle. closely express packages sleep across the blithely
+(5 rows)
+
+DROP EXTERNAL TABLE IF EXISTS ext_nation_on_coordinator;
+-- bad, should error
 CREATE EXTERNAL TABLE exttab_with_on_coordinator( i int, j text )
 LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') ON 
COORDINATOR FORMAT 'TEXT' (DELIMITER '|');
 SELECT * FROM exttab_with_on_coordinator;
-ERROR:  'ON COORDINATOR' is not supported by this protocol yet
+ERROR:  invalid input syntax for type integer: "error_0"
+CONTEXT:  External table exttab_with_on_coordinator, line 3 of 
file://@hostname@@abs_srcdir@/data/exttab_few_errors.data, column i
 DROP EXTERNAL TABLE IF EXISTS exttab_with_on_coordinator;
 -- start_ignore
 DROP EXTERNAL TABLE IF EXISTS exttab_with_option_empty;
diff --git 
a/contrib/pax_storage/src/test/regress/output/external_table_optimizer.source 
b/contrib/pax_storage/src/test/regress/output/external_table_optimizer.source
index 68523e63aae..6c4f884d292 100644
--- 
a/contrib/pax_storage/src/test/regress/output/external_table_optimizer.source
+++ 
b/contrib/pax_storage/src/test/regress/output/external_table_optimizer.source
@@ -2601,14 +2601,36 @@ SELECT COUNT(*) FROM 
gp_read_error_log('exttab_heap_join_1');
 
 \! rm @abs_srcdir@/data/tableless.csv
 -- start_ignore
+DROP EXTERNAL TABLE IF EXISTS ext_nation_on_coordinator;
+NOTICE:  table "ext_nation_on_coordinator" does not exist, skipping
 DROP EXTERNAL TABLE IF EXISTS exttab_with_on_coordinator;
 NOTICE:  table "exttab_with_on_coordinator" does not exist, skipping
 -- end_ignore
--- Create external table with on clause
+-- Create external table on coordinator
+-- good, should fetch data from coordinator
+CREATE EXTERNAL TABLE ext_nation_on_coordinator ( N_NATIONKEY  INTEGER ,
+                            N_NAME       CHAR(25) ,
+                            N_REGIONKEY  INTEGER ,
+                            N_COMMENT    VARCHAR(152))
+location ('file://@hostname@@abs_srcdir@/data/nation.tbl' ) ON COORDINATOR
+FORMAT 'text' (delimiter '|');
+SELECT gp_segment_id, * FROM ext_nation_on_coordinator ORDER BY N_NATIONKEY 
DESC LIMIT 5;
+ gp_segment_id | n_nationkey |          n_name           | n_regionkey |       
                                            n_comment                           
                         
+---------------+-------------+---------------------------+-------------+----------------------------------------------------------------------------------------------------------------
+            -1 |          24 | UNITED STATES             |           1 | y 
final packages. slow foxes cajole quickly. quickly silent platelets breach 
ironic accounts. unusual pinto be
+            -1 |          23 | UNITED KINGDOM            |           3 | eans 
boost carefully special requests. accounts are. carefull
+            -1 |          22 | RUSSIA                    |           3 |  
requests against the platelets use never according to the quickly regular pint
+            -1 |          21 | VIETNAM                   |           2 | hely 
enticingly express accounts. even, final 
+            -1 |          20 | SAUDI ARABIA              |           4 | ts. 
silent requests haggle. closely express packages sleep across the blithely
+(5 rows)
+
+DROP EXTERNAL TABLE IF EXISTS ext_nation_on_coordinator;
+-- bad, should error
 CREATE EXTERNAL TABLE exttab_with_on_coordinator( i int, j text )
 LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') ON 
COORDINATOR FORMAT 'TEXT' (DELIMITER '|');
 SELECT * FROM exttab_with_on_coordinator;
-ERROR:  'ON COORDINATOR' is not supported by this protocol yet
+ERROR:  invalid input syntax for type integer: "error_0"
+CONTEXT:  External table exttab_with_on_coordinator, line 3 of 
file://@hostname@@abs_srcdir@/data/exttab_few_errors.data, column i
 DROP EXTERNAL TABLE IF EXISTS exttab_with_on_coordinator;
 -- start_ignore
 DROP EXTERNAL TABLE IF EXISTS exttab_with_option_empty;
diff --git a/src/backend/access/external/external.c 
b/src/backend/access/external/external.c
index 0905a576a6c..62cff75db53 100644
--- a/src/backend/access/external/external.c
+++ b/src/backend/access/external/external.c
@@ -443,7 +443,7 @@ create_external_scan_uri_list(ExtTableEntry *ext, bool 
*ismasteronly)
         * protocols only */
        on_clause = (char *) strVal(linitial(ext->execlocations));
        if ((strcmp(on_clause, "COORDINATOR_ONLY") == 0)
-               && using_location && (uri->protocol != URI_CUSTOM)) {
+               && using_location && (uri->protocol != URI_CUSTOM && 
uri->protocol != URI_FILE)) {
                ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION),
                                errmsg("\'ON COORDINATOR\' is not supported by 
this protocol yet")));
        }
@@ -524,6 +524,13 @@ create_external_scan_uri_list(ExtTableEntry *ext, bool 
*ismasteronly)
                        found_candidate = false;
                        found_match = false;
 
+                       if ((strcmp(on_clause, "COORDINATOR_ONLY") == 0) && 
uri->protocol == URI_FILE)
+                       {
+                               found_match = true;
+                               segdb_file_map[0] = pstrdup(uri_str);
+                               *ismasteronly = true;
+                       }
+
                        /*
                         * look through our segment database list and try to 
find a
                         * database that can handle this uri.
diff --git a/src/test/regress/input/external_table.source 
b/src/test/regress/input/external_table.source
index 048da739097..a6c9871215e 100644
--- a/src/test/regress/input/external_table.source
+++ b/src/test/regress/input/external_table.source
@@ -1402,10 +1402,22 @@ SELECT COUNT(*) FROM 
gp_read_error_log('exttab_heap_join_1');
 \! rm @abs_srcdir@/data/tableless.csv
 
 -- start_ignore
+DROP EXTERNAL TABLE IF EXISTS ext_nation_on_coordinator;
 DROP EXTERNAL TABLE IF EXISTS exttab_with_on_coordinator;
 -- end_ignore
 
--- Create external table with on clause
+-- Create external table on coordinator
+-- good, should fetch data from coordinator
+CREATE EXTERNAL TABLE ext_nation_on_coordinator ( N_NATIONKEY  INTEGER ,
+                            N_NAME       CHAR(25) ,
+                            N_REGIONKEY  INTEGER ,
+                            N_COMMENT    VARCHAR(152))
+location ('file://@hostname@@abs_srcdir@/data/nation.tbl' ) ON COORDINATOR
+FORMAT 'text' (delimiter '|');
+SELECT gp_segment_id, * FROM ext_nation_on_coordinator ORDER BY N_NATIONKEY 
DESC LIMIT 5;
+DROP EXTERNAL TABLE IF EXISTS ext_nation_on_coordinator;
+
+-- bad, should error
 CREATE EXTERNAL TABLE exttab_with_on_coordinator( i int, j text )
 LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') ON 
COORDINATOR FORMAT 'TEXT' (DELIMITER '|');
 
diff --git a/src/test/regress/output/external_table.source 
b/src/test/regress/output/external_table.source
index c7c628e5c6b..014c50f55d3 100644
--- a/src/test/regress/output/external_table.source
+++ b/src/test/regress/output/external_table.source
@@ -2657,14 +2657,36 @@ SELECT COUNT(*) FROM 
gp_read_error_log('exttab_heap_join_1');
 
 \! rm @abs_srcdir@/data/tableless.csv
 -- start_ignore
+DROP EXTERNAL TABLE IF EXISTS ext_nation_on_coordinator;
+NOTICE:  table "ext_nation_on_coordinator" does not exist, skipping
 DROP EXTERNAL TABLE IF EXISTS exttab_with_on_coordinator;
 NOTICE:  table "exttab_with_on_coordinator" does not exist, skipping
 -- end_ignore
--- Create external table with on clause
+-- Create external table on coordinator
+-- good, should fetch data from coordinator
+CREATE EXTERNAL TABLE ext_nation_on_coordinator ( N_NATIONKEY  INTEGER ,
+                            N_NAME       CHAR(25) ,
+                            N_REGIONKEY  INTEGER ,
+                            N_COMMENT    VARCHAR(152))
+location ('file://@hostname@@abs_srcdir@/data/nation.tbl' ) ON COORDINATOR
+FORMAT 'text' (delimiter '|');
+SELECT gp_segment_id, * FROM ext_nation_on_coordinator ORDER BY N_NATIONKEY 
DESC LIMIT 5;
+ gp_segment_id | n_nationkey |          n_name           | n_regionkey |       
                                            n_comment                           
                         
+---------------+-------------+---------------------------+-------------+----------------------------------------------------------------------------------------------------------------
+            -1 |          24 | UNITED STATES             |           1 | y 
final packages. slow foxes cajole quickly. quickly silent platelets breach 
ironic accounts. unusual pinto be
+            -1 |          23 | UNITED KINGDOM            |           3 | eans 
boost carefully special requests. accounts are. carefull
+            -1 |          22 | RUSSIA                    |           3 |  
requests against the platelets use never according to the quickly regular pint
+            -1 |          21 | VIETNAM                   |           2 | hely 
enticingly express accounts. even, final 
+            -1 |          20 | SAUDI ARABIA              |           4 | ts. 
silent requests haggle. closely express packages sleep across the blithely
+(5 rows)
+
+DROP EXTERNAL TABLE IF EXISTS ext_nation_on_coordinator;
+-- bad, should error
 CREATE EXTERNAL TABLE exttab_with_on_coordinator( i int, j text )
 LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') ON 
COORDINATOR FORMAT 'TEXT' (DELIMITER '|');
 SELECT * FROM exttab_with_on_coordinator;
-ERROR:  'ON COORDINATOR' is not supported by this protocol yet
+ERROR:  invalid input syntax for type integer: "error_0"
+CONTEXT:  External table exttab_with_on_coordinator, line 3 of 
file://@hostname@@abs_srcdir@/data/exttab_few_errors.data, column i
 DROP EXTERNAL TABLE IF EXISTS exttab_with_on_coordinator;
 -- start_ignore
 DROP EXTERNAL TABLE IF EXISTS exttab_with_option_empty;
diff --git a/src/test/regress/output/external_table_optimizer.source 
b/src/test/regress/output/external_table_optimizer.source
index b5af22445d1..4e853662fb3 100644
--- a/src/test/regress/output/external_table_optimizer.source
+++ b/src/test/regress/output/external_table_optimizer.source
@@ -2657,14 +2657,36 @@ SELECT COUNT(*) FROM 
gp_read_error_log('exttab_heap_join_1');
 
 \! rm @abs_srcdir@/data/tableless.csv
 -- start_ignore
+DROP EXTERNAL TABLE IF EXISTS ext_nation_on_coordinator;
+NOTICE:  table "ext_nation_on_coordinator" does not exist, skipping
 DROP EXTERNAL TABLE IF EXISTS exttab_with_on_coordinator;
 NOTICE:  table "exttab_with_on_coordinator" does not exist, skipping
 -- end_ignore
--- Create external table with on clause
+-- Create external table on coordinator
+-- good, should fetch data from coordinator
+CREATE EXTERNAL TABLE ext_nation_on_coordinator ( N_NATIONKEY  INTEGER ,
+                            N_NAME       CHAR(25) ,
+                            N_REGIONKEY  INTEGER ,
+                            N_COMMENT    VARCHAR(152))
+location ('file://@hostname@@abs_srcdir@/data/nation.tbl' ) ON COORDINATOR
+FORMAT 'text' (delimiter '|');
+SELECT gp_segment_id, * FROM ext_nation_on_coordinator ORDER BY N_NATIONKEY 
DESC LIMIT 5;
+ gp_segment_id | n_nationkey |          n_name           | n_regionkey |       
                                            n_comment                           
                         
+---------------+-------------+---------------------------+-------------+----------------------------------------------------------------------------------------------------------------
+            -1 |          24 | UNITED STATES             |           1 | y 
final packages. slow foxes cajole quickly. quickly silent platelets breach 
ironic accounts. unusual pinto be
+            -1 |          23 | UNITED KINGDOM            |           3 | eans 
boost carefully special requests. accounts are. carefull
+            -1 |          22 | RUSSIA                    |           3 |  
requests against the platelets use never according to the quickly regular pint
+            -1 |          21 | VIETNAM                   |           2 | hely 
enticingly express accounts. even, final 
+            -1 |          20 | SAUDI ARABIA              |           4 | ts. 
silent requests haggle. closely express packages sleep across the blithely
+(5 rows)
+
+DROP EXTERNAL TABLE IF EXISTS ext_nation_on_coordinator;
+-- bad, should error
 CREATE EXTERNAL TABLE exttab_with_on_coordinator( i int, j text )
 LOCATION ('file://@hostname@@abs_srcdir@/data/exttab_few_errors.data') ON 
COORDINATOR FORMAT 'TEXT' (DELIMITER '|');
 SELECT * FROM exttab_with_on_coordinator;
-ERROR:  'ON COORDINATOR' is not supported by this protocol yet
+ERROR:  invalid input syntax for type integer: "error_0"
+CONTEXT:  External table exttab_with_on_coordinator, line 3 of 
file://@hostname@@abs_srcdir@/data/exttab_few_errors.data, column i
 DROP EXTERNAL TABLE IF EXISTS exttab_with_on_coordinator;
 -- start_ignore
 DROP EXTERNAL TABLE IF EXISTS exttab_with_option_empty;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to