This is an automated email from the ASF dual-hosted git repository.
dengzh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new d716d292ea0 HIVE-27060: Exception in add partitions with SQL Server
when number of parameters exceed 2100 (Venu Reddy, reviewed by Zhihua Deng)
d716d292ea0 is described below
commit d716d292ea04c449ba872a9cc01884532297d035
Author: Venu Reddy <[email protected]>
AuthorDate: Fri Feb 10 14:10:15 2023 +0530
HIVE-27060: Exception in add partitions with SQL Server when number of
parameters exceed 2100 (Venu Reddy, reviewed by Zhihua Deng)
Closes #4044
---
.../org/apache/hadoop/hive/metastore/DirectSqlInsertPart.java | 10 ++++++++--
.../org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java | 6 +-----
2 files changed, 9 insertions(+), 7 deletions(-)
diff --git
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/DirectSqlInsertPart.java
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/DirectSqlInsertPart.java
index 182768402f6..be17470edd6 100644
---
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/DirectSqlInsertPart.java
+++
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/DirectSqlInsertPart.java
@@ -19,7 +19,6 @@
package org.apache.hadoop.hive.metastore;
import static org.apache.commons.lang3.StringUtils.repeat;
-import static org.apache.hadoop.hive.metastore.Batchable.NO_BATCHING;
import java.util.ArrayList;
import java.util.Collections;
@@ -83,7 +82,14 @@ class DirectSqlInsertPart {
if (rowCount == 0 || columnCount == 0) {
return;
}
- int maxRowsInBatch = (batchSize == NO_BATCHING) ? rowCount : batchSize;
+ int maxRowsInBatch = batchSize > 0 ? batchSize : rowCount;
+ if (dbType.isSQLSERVER()) {
+ // SQL Server supports a maximum of 2100 parameters in a request. Adjust
the maxRowsInBatch accordingly
+ int maxAllowedRows = (2100 - columnCount) / columnCount;
+ if (maxRowsInBatch > maxAllowedRows) {
+ maxRowsInBatch = maxAllowedRows;
+ }
+ }
int maxBatches = rowCount / maxRowsInBatch;
int last = rowCount % maxRowsInBatch;
String rowFormat = "(" + repeat(",?", columnCount).substring(1) + ")";
diff --git
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
index a39da29cbb8..5789b535deb 100644
---
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
+++
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
@@ -195,16 +195,12 @@ class MetaStoreDirectSql {
this.dbType = dbType;
int batchSize = MetastoreConf.getIntVar(conf,
ConfVars.DIRECT_SQL_PARTITION_BATCH_SIZE);
+ this.directSqlInsertPart = new DirectSqlInsertPart(pm, dbType, batchSize);
if (batchSize == DETECT_BATCHING) {
batchSize = dbType.needsInBatching() ? 1000 : NO_BATCHING;
}
this.batchSize = batchSize;
this.updateStat = new DirectSqlUpdateStat(pm, conf, dbType, batchSize);
-
- // TODO: Oracle supports to insert more than 1000 rows with a single
insert query. Can use NO_BATCHING for oracle db
- // too during batch detection(DETECT_BATCHING) for insert queries as
future improvement. Currently, used the same
- // limit as IN clause/operator limit(i.e., 1000) during batch detection.
- this.directSqlInsertPart = new DirectSqlInsertPart(pm, dbType, batchSize);
ImmutableMap.Builder<String, String> fieldNameToTableNameBuilder =
new ImmutableMap.Builder<>();