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

alamb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/master by this push:
     new c14ade2b91 Upgrade protobuf definitions to flightsql 17.0 (#6133) 
(#6169)
c14ade2b91 is described below

commit c14ade2b917889a55d4b098b4a48b36ddb2c48c7
Author: Andrew Lamb <[email protected]>
AuthorDate: Thu Aug 1 07:05:10 2024 -0400

    Upgrade protobuf definitions to flightsql 17.0 (#6133) (#6169)
    
    * Update FlightSql.proto to version 17.0
    
    Adds new message CommandStatementIngest and removes `experimental` from
    other messages.
    
    * Regenerate flight sql protocol
    
    This upgrades the file to version 17.0 of the protobuf definition.
    
    Co-authored-by: Douglas Anderson <[email protected]>
---
 arrow-flight/src/sql/arrow.flight.protocol.sql.rs | 177 +++++++++++++++++++++-
 format/FlightSql.proto                            | 112 +++++++++-----
 2 files changed, 252 insertions(+), 37 deletions(-)

diff --git a/arrow-flight/src/sql/arrow.flight.protocol.sql.rs 
b/arrow-flight/src/sql/arrow.flight.protocol.sql.rs
index 5e6f198df7..3eeed6ff4b 100644
--- a/arrow-flight/src/sql/arrow.flight.protocol.sql.rs
+++ b/arrow-flight/src/sql/arrow.flight.protocol.sql.rs
@@ -798,9 +798,157 @@ pub struct CommandPreparedStatementUpdate {
     pub prepared_statement_handle: ::prost::bytes::Bytes,
 }
 ///
-/// Returned from the RPC call DoPut when a CommandStatementUpdate
-/// CommandPreparedStatementUpdate was in the request, containing
-/// results from the update.
+/// Represents a bulk ingestion request. Used in the command member of 
FlightDescriptor
+/// for the the RPC call DoPut to cause the server load the contents of the 
stream's
+/// FlightData into the target destination.
+#[allow(clippy::derive_partial_eq_without_eq)]
+#[derive(Clone, PartialEq, ::prost::Message)]
+pub struct CommandStatementIngest {
+    /// The behavior for handling the table definition.
+    #[prost(message, optional, tag = "1")]
+    pub table_definition_options: ::core::option::Option<
+        command_statement_ingest::TableDefinitionOptions,
+    >,
+    /// The table to load data into.
+    #[prost(string, tag = "2")]
+    pub table: ::prost::alloc::string::String,
+    /// The db_schema of the destination table to load data into. If unset, a 
backend-specific default may be used.
+    #[prost(string, optional, tag = "3")]
+    pub schema: ::core::option::Option<::prost::alloc::string::String>,
+    /// The catalog of the destination table to load data into. If unset, a 
backend-specific default may be used.
+    #[prost(string, optional, tag = "4")]
+    pub catalog: ::core::option::Option<::prost::alloc::string::String>,
+    ///
+    /// Store ingested data in a temporary table.
+    /// The effect of setting temporary is to place the table in a 
backend-defined namespace, and to drop the table at the end of the session.
+    /// The namespacing may make use of a backend-specific schema and/or 
catalog.
+    /// The server should return an error if an explicit choice of schema or 
catalog is incompatible with the server's namespacing decision.
+    #[prost(bool, tag = "5")]
+    pub temporary: bool,
+    /// Perform the ingestion as part of this transaction. If specified, 
results should not be committed in the event of an error/cancellation.
+    #[prost(bytes = "bytes", optional, tag = "6")]
+    pub transaction_id: ::core::option::Option<::prost::bytes::Bytes>,
+    /// Backend-specific options.
+    #[prost(map = "string, string", tag = "1000")]
+    pub options: ::std::collections::HashMap<
+        ::prost::alloc::string::String,
+        ::prost::alloc::string::String,
+    >,
+}
+/// Nested message and enum types in `CommandStatementIngest`.
+pub mod command_statement_ingest {
+    /// Options for table definition behavior
+    #[allow(clippy::derive_partial_eq_without_eq)]
+    #[derive(Clone, Copy, PartialEq, ::prost::Message)]
+    pub struct TableDefinitionOptions {
+        #[prost(
+            enumeration = "table_definition_options::TableNotExistOption",
+            tag = "1"
+        )]
+        pub if_not_exist: i32,
+        #[prost(enumeration = "table_definition_options::TableExistsOption", 
tag = "2")]
+        pub if_exists: i32,
+    }
+    /// Nested message and enum types in `TableDefinitionOptions`.
+    pub mod table_definition_options {
+        /// The action to take if the target table does not exist
+        #[derive(
+            Clone,
+            Copy,
+            Debug,
+            PartialEq,
+            Eq,
+            Hash,
+            PartialOrd,
+            Ord,
+            ::prost::Enumeration
+        )]
+        #[repr(i32)]
+        pub enum TableNotExistOption {
+            /// Do not use. Servers should error if this is specified by a 
client.
+            Unspecified = 0,
+            /// Create the table if it does not exist
+            Create = 1,
+            /// Fail if the table does not exist
+            Fail = 2,
+        }
+        impl TableNotExistOption {
+            /// String value of the enum field names used in the ProtoBuf 
definition.
+            ///
+            /// The values are not transformed in any way and thus are 
considered stable
+            /// (if the ProtoBuf definition does not change) and safe for 
programmatic use.
+            pub fn as_str_name(&self) -> &'static str {
+                match self {
+                    TableNotExistOption::Unspecified => {
+                        "TABLE_NOT_EXIST_OPTION_UNSPECIFIED"
+                    }
+                    TableNotExistOption::Create => 
"TABLE_NOT_EXIST_OPTION_CREATE",
+                    TableNotExistOption::Fail => "TABLE_NOT_EXIST_OPTION_FAIL",
+                }
+            }
+            /// Creates an enum from field names used in the ProtoBuf 
definition.
+            pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
+                match value {
+                    "TABLE_NOT_EXIST_OPTION_UNSPECIFIED" => 
Some(Self::Unspecified),
+                    "TABLE_NOT_EXIST_OPTION_CREATE" => Some(Self::Create),
+                    "TABLE_NOT_EXIST_OPTION_FAIL" => Some(Self::Fail),
+                    _ => None,
+                }
+            }
+        }
+        /// The action to take if the target table already exists
+        #[derive(
+            Clone,
+            Copy,
+            Debug,
+            PartialEq,
+            Eq,
+            Hash,
+            PartialOrd,
+            Ord,
+            ::prost::Enumeration
+        )]
+        #[repr(i32)]
+        pub enum TableExistsOption {
+            /// Do not use. Servers should error if this is specified by a 
client.
+            Unspecified = 0,
+            /// Fail if the table already exists
+            Fail = 1,
+            /// Append to the table if it already exists
+            Append = 2,
+            /// Drop and recreate the table if it already exists
+            Replace = 3,
+        }
+        impl TableExistsOption {
+            /// String value of the enum field names used in the ProtoBuf 
definition.
+            ///
+            /// The values are not transformed in any way and thus are 
considered stable
+            /// (if the ProtoBuf definition does not change) and safe for 
programmatic use.
+            pub fn as_str_name(&self) -> &'static str {
+                match self {
+                    TableExistsOption::Unspecified => 
"TABLE_EXISTS_OPTION_UNSPECIFIED",
+                    TableExistsOption::Fail => "TABLE_EXISTS_OPTION_FAIL",
+                    TableExistsOption::Append => "TABLE_EXISTS_OPTION_APPEND",
+                    TableExistsOption::Replace => 
"TABLE_EXISTS_OPTION_REPLACE",
+                }
+            }
+            /// Creates an enum from field names used in the ProtoBuf 
definition.
+            pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
+                match value {
+                    "TABLE_EXISTS_OPTION_UNSPECIFIED" => 
Some(Self::Unspecified),
+                    "TABLE_EXISTS_OPTION_FAIL" => Some(Self::Fail),
+                    "TABLE_EXISTS_OPTION_APPEND" => Some(Self::Append),
+                    "TABLE_EXISTS_OPTION_REPLACE" => Some(Self::Replace),
+                    _ => None,
+                }
+            }
+        }
+    }
+}
+///
+/// Returned from the RPC call DoPut when a CommandStatementUpdate,
+/// CommandPreparedStatementUpdate, or CommandStatementIngest was
+/// in the request, containing results from the update.
 #[allow(clippy::derive_partial_eq_without_eq)]
 #[derive(Clone, Copy, PartialEq, ::prost::Message)]
 pub struct DoPutUpdateResult {
@@ -972,6 +1120,19 @@ pub enum SqlInfo {
     /// query cancellation (the CancelQuery action).
     FlightSqlServerCancel = 9,
     ///
+    /// Retrieves a boolean value indicating whether the Flight SQL Server 
supports executing
+    /// bulk ingestion.
+    FlightSqlServerBulkIngestion = 10,
+    ///
+    /// Retrieves a boolean value indicating whether transactions are 
supported for bulk ingestion. If not, invoking
+    /// the method commit in the context of a bulk ingestion is a noop, and 
the isolation level is
+    /// 
`arrow.flight.protocol.sql.SqlTransactionIsolationLevel.TRANSACTION_NONE`.
+    ///
+    /// Returns:
+    /// - false: if bulk ingestion transactions are unsupported;
+    /// - true: if bulk ingestion transactions are supported.
+    FlightSqlServerIngestTransactionsSupported = 11,
+    ///
     /// Retrieves an int32 indicating the timeout (in milliseconds) for 
prepared statement handles.
     ///
     /// If 0, there is no timeout.  Servers should reset the timeout when the 
handle is used in a command.
@@ -1542,6 +1703,10 @@ impl SqlInfo {
             }
             SqlInfo::FlightSqlServerTransaction => 
"FLIGHT_SQL_SERVER_TRANSACTION",
             SqlInfo::FlightSqlServerCancel => "FLIGHT_SQL_SERVER_CANCEL",
+            SqlInfo::FlightSqlServerBulkIngestion => 
"FLIGHT_SQL_SERVER_BULK_INGESTION",
+            SqlInfo::FlightSqlServerIngestTransactionsSupported => {
+                "FLIGHT_SQL_SERVER_INGEST_TRANSACTIONS_SUPPORTED"
+            }
             SqlInfo::FlightSqlServerStatementTimeout => {
                 "FLIGHT_SQL_SERVER_STATEMENT_TIMEOUT"
             }
@@ -1674,6 +1839,12 @@ impl SqlInfo {
             }
             "FLIGHT_SQL_SERVER_TRANSACTION" => 
Some(Self::FlightSqlServerTransaction),
             "FLIGHT_SQL_SERVER_CANCEL" => Some(Self::FlightSqlServerCancel),
+            "FLIGHT_SQL_SERVER_BULK_INGESTION" => {
+                Some(Self::FlightSqlServerBulkIngestion)
+            }
+            "FLIGHT_SQL_SERVER_INGEST_TRANSACTIONS_SUPPORTED" => {
+                Some(Self::FlightSqlServerIngestTransactionsSupported)
+            }
             "FLIGHT_SQL_SERVER_STATEMENT_TIMEOUT" => {
                 Some(Self::FlightSqlServerStatementTimeout)
             }
diff --git a/format/FlightSql.proto b/format/FlightSql.proto
index 4fc68f2a5d..8f9e1c8d82 100644
--- a/format/FlightSql.proto
+++ b/format/FlightSql.proto
@@ -43,7 +43,6 @@
   * where there is one row per requested piece of metadata information.
   */
  message CommandGetSqlInfo {
-   option (experimental) = true;
  
    /*
     * Values are modelled after ODBC's SQLGetInfo() function. This information 
is intended to provide
@@ -135,6 +134,23 @@
     */
    FLIGHT_SQL_SERVER_CANCEL = 9;
  
+  /*
+   * Retrieves a boolean value indicating whether the Flight SQL Server 
supports executing
+   * bulk ingestion.
+   */
+   FLIGHT_SQL_SERVER_BULK_INGESTION = 10;
+
+  /*
+   * Retrieves a boolean value indicating whether transactions are supported 
for bulk ingestion. If not, invoking
+   * the method commit in the context of a bulk ingestion is a noop, and the 
isolation level is
+   * `arrow.flight.protocol.sql.SqlTransactionIsolationLevel.TRANSACTION_NONE`.
+   *
+   * Returns:
+   * - false: if bulk ingestion transactions are unsupported;
+   * - true: if bulk ingestion transactions are supported.
+   */
+   FLIGHT_SQL_SERVER_INGEST_TRANSACTIONS_SUPPORTED = 11;
+
    /*
     * Retrieves an int32 indicating the timeout (in milliseconds) for prepared 
statement handles.
     *
@@ -1114,7 +1130,6 @@
   * The returned data should be ordered by data_type and then by type_name.
   */
  message CommandGetXdbcTypeInfo {
-   option (experimental) = true;
  
    /*
     * Specifies the data type to search for the info.
@@ -1136,7 +1151,6 @@
   * The returned data should be ordered by catalog_name.
   */
  message CommandGetCatalogs {
-   option (experimental) = true;
  }
  
  /*
@@ -1154,7 +1168,6 @@
   * The returned data should be ordered by catalog_name, then db_schema_name.
   */
  message CommandGetDbSchemas {
-   option (experimental) = true;
  
    /*
     * Specifies the Catalog to search for the tables.
@@ -1202,7 +1215,6 @@
   * The returned data should be ordered by catalog_name, db_schema_name, 
table_name, then table_type, followed by table_schema if requested.
   */
  message CommandGetTables {
-   option (experimental) = true;
  
    /*
     * Specifies the Catalog to search for the tables.
@@ -1255,7 +1267,6 @@
   * The returned data should be ordered by table_type.
   */
  message CommandGetTableTypes {
-   option (experimental) = true;
  }
  
  /*
@@ -1276,7 +1287,6 @@
   * The returned data should be ordered by catalog_name, db_schema_name, 
table_name, key_name, then key_sequence.
   */
  message CommandGetPrimaryKeys {
-   option (experimental) = true;
  
    /*
     * Specifies the catalog to search for the table.
@@ -1331,7 +1341,6 @@
   * update_rule and delete_rule returns a byte that is equivalent to actions 
declared on UpdateDeleteRules enum.
   */
  message CommandGetExportedKeys {
-   option (experimental) = true;
  
    /*
     * Specifies the catalog to search for the foreign key table.
@@ -1382,7 +1391,6 @@
   *    - 4 = SET DEFAULT
   */
  message CommandGetImportedKeys {
-   option (experimental) = true;
  
    /*
     * Specifies the catalog to search for the primary key table.
@@ -1435,7 +1443,6 @@
   *    - 4 = SET DEFAULT
   */
  message CommandGetCrossReference {
-   option (experimental) = true;
  
    /**
     * The catalog name where the parent table is.
@@ -1482,7 +1489,6 @@
   * Request message for the "CreatePreparedStatement" action on a Flight SQL 
enabled backend.
   */
  message ActionCreatePreparedStatementRequest {
-   option (experimental) = true;
  
    // The valid SQL string to create a prepared statement for.
    string query = 1;
@@ -1495,7 +1501,6 @@
   * An embedded message describing a Substrait plan to execute.
   */
  message SubstraitPlan {
-   option (experimental) = true;
  
    // The serialized substrait.Plan to create a prepared statement for.
    // XXX(ARROW-16902): this is bytes instead of an embedded message
@@ -1512,7 +1517,6 @@
   * Request message for the "CreatePreparedSubstraitPlan" action on a Flight 
SQL enabled backend.
   */
  message ActionCreatePreparedSubstraitPlanRequest {
-   option (experimental) = true;
  
    // The serialized substrait.Plan to create a prepared statement for.
    SubstraitPlan plan = 1;
@@ -1531,7 +1535,6 @@
   * The result should be wrapped in a google.protobuf.Any message.
   */
  message ActionCreatePreparedStatementResult {
-   option (experimental) = true;
  
    // Opaque handle for the prepared statement on the server.
    bytes prepared_statement_handle = 1;
@@ -1553,7 +1556,6 @@
   * Closes server resources associated with the prepared statement handle.
   */
  message ActionClosePreparedStatementRequest {
-   option (experimental) = true;
  
    // Opaque handle for the prepared statement on the server.
    bytes prepared_statement_handle = 1;
@@ -1564,7 +1566,6 @@
   * Begins a transaction.
   */
  message ActionBeginTransactionRequest {
-   option (experimental) = true;
  }
  
  /*
@@ -1575,7 +1576,6 @@
   * FLIGHT_SQL_TRANSACTION_SUPPORT_SAVEPOINT.
   */
  message ActionBeginSavepointRequest {
-   option (experimental) = true;
  
    // The transaction to which a savepoint belongs.
    bytes transaction_id = 1;
@@ -1593,7 +1593,6 @@
   * The result should be wrapped in a google.protobuf.Any message.
   */
  message ActionBeginTransactionResult {
-   option (experimental) = true;
  
    // Opaque handle for the transaction on the server.
    bytes transaction_id = 1;
@@ -1609,7 +1608,6 @@
   * The result should be wrapped in a google.protobuf.Any message.
   */
  message ActionBeginSavepointResult {
-   option (experimental) = true;
  
    // Opaque handle for the savepoint on the server.
    bytes savepoint_id = 1;
@@ -1624,7 +1622,6 @@
   * invalidated, as are all associated savepoints.
   */
  message ActionEndTransactionRequest {
-   option (experimental) = true;
  
    enum EndTransaction {
      END_TRANSACTION_UNSPECIFIED = 0;
@@ -1650,7 +1647,6 @@
   * savepoints created after the current savepoint.
   */
  message ActionEndSavepointRequest {
-   option (experimental) = true;
  
    enum EndSavepoint {
      END_SAVEPOINT_UNSPECIFIED = 0;
@@ -1685,7 +1681,6 @@
   *  - GetFlightInfo: execute the query.
   */
  message CommandStatementQuery {
-   option (experimental) = true;
  
    // The SQL syntax.
    string query = 1;
@@ -1712,7 +1707,6 @@
   *  - DoPut: execute the query.
   */
  message CommandStatementSubstraitPlan {
-   option (experimental) = true;
  
    // A serialized substrait.Plan
    SubstraitPlan plan = 1;
@@ -1725,7 +1719,6 @@
   * This should be used only once and treated as an opaque value, that is, 
clients should not attempt to parse this.
   */
  message TicketStatementQuery {
-   option (experimental) = true;
  
    // Unique identifier for the instance of the statement to execute.
    bytes statement_handle = 1;
@@ -1753,7 +1746,6 @@
   *  - GetFlightInfo: execute the prepared statement instance.
   */
  message CommandPreparedStatementQuery {
-   option (experimental) = true;
  
    // Opaque handle for the prepared statement on the server.
    bytes prepared_statement_handle = 1;
@@ -1764,7 +1756,6 @@
   * for the RPC call DoPut to cause the server to execute the included SQL 
update.
   */
  message CommandStatementUpdate {
-   option (experimental) = true;
  
    // The SQL syntax.
    string query = 1;
@@ -1778,19 +1769,75 @@
   * prepared statement handle as an update.
   */
  message CommandPreparedStatementUpdate {
-   option (experimental) = true;
  
    // Opaque handle for the prepared statement on the server.
    bytes prepared_statement_handle = 1;
  }
  
  /*
-  * Returned from the RPC call DoPut when a CommandStatementUpdate
-  * CommandPreparedStatementUpdate was in the request, containing
-  * results from the update.
+ * Represents a bulk ingestion request. Used in the command member of 
FlightDescriptor
+ * for the the RPC call DoPut to cause the server load the contents of the 
stream's
+ * FlightData into the target destination.
+ */
+message CommandStatementIngest {
+
+  // Options for table definition behavior
+  message TableDefinitionOptions {
+    // The action to take if the target table does not exist
+    enum TableNotExistOption {
+      // Do not use. Servers should error if this is specified by a client.
+      TABLE_NOT_EXIST_OPTION_UNSPECIFIED = 0;
+      // Create the table if it does not exist
+      TABLE_NOT_EXIST_OPTION_CREATE = 1;
+      // Fail if the table does not exist
+      TABLE_NOT_EXIST_OPTION_FAIL = 2;
+    }
+    // The action to take if the target table already exists
+    enum TableExistsOption {
+      // Do not use. Servers should error if this is specified by a client.
+      TABLE_EXISTS_OPTION_UNSPECIFIED = 0;
+      // Fail if the table already exists
+      TABLE_EXISTS_OPTION_FAIL = 1;
+      // Append to the table if it already exists
+      TABLE_EXISTS_OPTION_APPEND = 2;
+      // Drop and recreate the table if it already exists
+      TABLE_EXISTS_OPTION_REPLACE = 3;
+    }
+
+    TableNotExistOption if_not_exist = 1;
+    TableExistsOption if_exists = 2;
+  }
+
+  // The behavior for handling the table definition.
+  TableDefinitionOptions table_definition_options = 1;
+  // The table to load data into.
+  string table = 2;
+  // The db_schema of the destination table to load data into. If unset, a 
backend-specific default may be used.
+  optional string schema = 3;
+  // The catalog of the destination table to load data into. If unset, a 
backend-specific default may be used.
+  optional string catalog = 4;
+  /*
+   * Store ingested data in a temporary table.
+   * The effect of setting temporary is to place the table in a 
backend-defined namespace, and to drop the table at the end of the session.
+   * The namespacing may make use of a backend-specific schema and/or catalog.
+   * The server should return an error if an explicit choice of schema or 
catalog is incompatible with the server's namespacing decision.
+  */
+  bool temporary = 5;
+  // Perform the ingestion as part of this transaction. If specified, results 
should not be committed in the event of an error/cancellation.
+  optional bytes transaction_id = 6;
+
+  // Future extensions to the parameters of CommandStatementIngest should be 
added here, at a lower index than the generic 'options' parameter.
+
+  // Backend-specific options.
+  map<string, string> options = 1000;
+}
+
+/*
+ * Returned from the RPC call DoPut when a CommandStatementUpdate,
+ * CommandPreparedStatementUpdate, or CommandStatementIngest was
+ * in the request, containing results from the update.
   */
  message DoPutUpdateResult {
-   option (experimental) = true;
  
    // The number of records updated. A return value of -1 represents
    // an unknown updated record count.
@@ -1804,7 +1851,6 @@
   * can continue as though the fields in this message were not provided or set 
to sensible default values.
   */
   message DoPutPreparedStatementResult {
-    option (experimental) = true;
 
     // Represents a (potentially updated) opaque handle for the prepared 
statement on the server.
     // Because the handle could potentially be updated, any previous handles 
for this prepared
@@ -1836,7 +1882,6 @@
   */
  message ActionCancelQueryRequest {
    option deprecated = true;
-   option (experimental) = true;
  
    // The result of the GetFlightInfo RPC that initiated the query.
    // XXX(ARROW-16902): this must be a serialized FlightInfo, but is
@@ -1855,7 +1900,6 @@
   */
  message ActionCancelQueryResult {
    option deprecated = true;
-   option (experimental) = true;
  
    enum CancelResult {
      // The cancellation status is unknown. Servers should avoid using

Reply via email to