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

difin 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 3d3f461db6f HIVE-29490: Add tests for HIVE-26758 
(hive.use.scratchdir.for.staging) (#6562)
3d3f461db6f is described below

commit 3d3f461db6f65cccbd57de8e9079c2ee05cd81b3
Author: Mahesh Raju Somalaraju <[email protected]>
AuthorDate: Thu Jul 23 21:56:22 2026 +0530

    HIVE-29490: Add tests for HIVE-26758 (hive.use.scratchdir.for.staging) 
(#6562)
    
    * HIVE-29490: Add tests for HIVE-26758 (hive.use.scratchdir.for.staging)
---
 .../test/resources/testconfiguration.properties    |   1 +
 .../optimizer/TestGenMapRedUtilsStagingPath.java   | 387 +++++++++++++++++++++
 .../hive_use_scratchdir_for_staging.q              |  79 +++++
 .../tez/hive_use_scratchdir_for_staging.q.out      | 211 +++++++++++
 4 files changed, 678 insertions(+)

diff --git a/itests/src/test/resources/testconfiguration.properties 
b/itests/src/test/resources/testconfiguration.properties
index bfefc3b5f02..2ac3b5d7d36 100644
--- a/itests/src/test/resources/testconfiguration.properties
+++ b/itests/src/test/resources/testconfiguration.properties
@@ -27,6 +27,7 @@ minitez.query.files=\
   explainanalyze_6.q,\
   explainuser_3.q,\
   flatten_union_subdir.q,\
+  hive_use_scratchdir_for_staging.q,\
   limit_bailout.q,\
   mapjoin_addjar.q,\
   non_strict_numeric_to_timestamp_conversion.q,\
diff --git 
a/ql/src/test/org/apache/hadoop/hive/ql/optimizer/TestGenMapRedUtilsStagingPath.java
 
b/ql/src/test/org/apache/hadoop/hive/ql/optimizer/TestGenMapRedUtilsStagingPath.java
new file mode 100644
index 00000000000..0aded7010e6
--- /dev/null
+++ 
b/ql/src/test/org/apache/hadoop/hive/ql/optimizer/TestGenMapRedUtilsStagingPath.java
@@ -0,0 +1,387 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.ql.optimizer;
+
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.conf.HiveConf.ConfVars;
+import org.apache.hadoop.hive.metastore.api.hive_metastoreConstants;
+import org.apache.hadoop.hive.ql.CompilationOpContext;
+import org.apache.hadoop.hive.ql.Context;
+import org.apache.hadoop.hive.ql.exec.FileSinkOperator;
+import org.apache.hadoop.hive.ql.exec.RowSchema;
+import org.apache.hadoop.hive.ql.exec.mr.MapRedTask;
+import org.apache.hadoop.hive.ql.parse.ParseContext;
+import org.apache.hadoop.hive.ql.io.AcidUtils;
+import org.apache.hadoop.hive.ql.plan.DynamicPartitionCtx;
+import org.apache.hadoop.hive.ql.plan.FileSinkDesc;
+import org.apache.hadoop.hive.ql.plan.TableDesc;
+import org.apache.hadoop.hive.ql.session.SessionState;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.Collections;
+import java.util.Properties;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ * Unit tests for HIVE-26758: staging directory path selection controlled by
+ * hive.use.scratchdir.for.staging.
+ */
+public class TestGenMapRedUtilsStagingPath {
+
+  private static final Path DEST_PATH =
+      new Path("hdfs://namenode/warehouse/mydb.db/target_tbl");
+  private static final Path FINAL_JOB_STAGING =
+      new 
Path("hdfs://namenode/warehouse/mydb.db/target_tbl/.hive-staging_job0");
+  private static final Path INTERIM_JOB_STAGING =
+      new Path("hdfs://namenode/tmp/hive-scratch/.hive-staging_job0");
+
+  @BeforeClass
+  public static void initializeSessionState() {
+    HiveConf conf = new HiveConf();
+    conf.set("_hive.hdfs.session.path",  "file:///tmp/hive-test/hdfs-session");
+    conf.set("_hive.local.session.path", 
"file:///tmp/hive-test/local-session");
+    conf.set(HiveConf.ConfVars.HIVE_EXECUTION_ENGINE.varname, "mr");
+    SessionState.start(conf);
+  }
+
+  private static HiveConf buildConf() {
+    HiveConf conf = new HiveConf();
+    conf.set("_hive.hdfs.session.path",  "file:///tmp/hive-test/hdfs-session");
+    conf.set("_hive.local.session.path", 
"file:///tmp/hive-test/local-session");
+    conf.set(ConfVars.STAGING_DIR.varname, ".hive-staging");
+    return conf;
+  }
+
+  /**
+   * Builds a minimal FileSinkDesc whose isMmTable and
+   * isDirectInsert flags are both false, so that
+   * GenMapRedUtils#createMoveTask enters the staging-path branch.
+   */
+  private static FileSinkDesc buildFileSinkDesc(Path destPath) {
+    TableDesc tableDesc = new TableDesc(null, null, new Properties());
+    return new FileSinkDesc(
+        destPath,
+        tableDesc,
+        false,
+        0,
+        false,
+        false,
+        1,
+        1,
+        null,
+        null,
+        destPath,
+        false,
+        false,
+        false,
+        false,
+        false,
+        AcidUtils.Operation.NOT_ACID,
+        false);
+  }
+
+  private static FileSinkOperator buildFileSinkOperator(FileSinkDesc fsd) {
+    FileSinkOperator fsOp = mock(FileSinkOperator.class);
+    when(fsOp.getConf()).thenReturn(fsd);
+    when(fsOp.getSchema()).thenReturn(mock(RowSchema.class));
+    
when(fsOp.getCompilationOpContext()).thenReturn(mock(CompilationOpContext.class));
+    return fsOp;
+  }
+
+  private static Context buildMockContext() {
+    Context mockCtx = mock(Context.class);
+    
when(mockCtx.getTempDirForFinalJobPath(any(Path.class))).thenReturn(FINAL_JOB_STAGING);
+    
when(mockCtx.getTempDirForInterimJobPath(any(Path.class))).thenReturn(INTERIM_JOB_STAGING);
+    return mockCtx;
+  }
+
+  private static ParseContext buildMockParseContext(Context ctx) {
+    ParseContext mockParseCtx = mock(ParseContext.class);
+    when(mockParseCtx.getContext()).thenReturn(ctx);
+    return mockParseCtx;
+  }
+
+  @Test
+  public void testCreateMoveTaskUsesFinalJobPathWhenConfigFalse() {
+    HiveConf conf = buildConf();
+    conf.setBoolVar(ConfVars.HIVE_USE_SCRATCHDIR_FOR_STAGING, false);
+    Context mockCtx = buildMockContext();
+    FileSinkDesc fsd = buildFileSinkDesc(DEST_PATH);
+    FileSinkOperator fsOp = buildFileSinkOperator(fsd);
+
+    GenMapRedUtils.createMoveTask(
+        new MapRedTask(), true, fsOp,
+        buildMockParseContext(mockCtx),
+        Collections.emptyList(), conf, null);
+
+    verify(mockCtx).getTempDirForFinalJobPath(DEST_PATH);
+    verify(mockCtx, never()).getTempDirForInterimJobPath(any());
+
+    Path dirName = fsd.getDirName();
+
+    assertNotNull("FileSinkDesc.getDirName() must not be null", dirName);
+    assertEquals(
+        "With scratchdir.for.staging=false, FileSinkDesc.getDirName() must 
equal "
+            + "the value returned by getTempDirForFinalJobPath 
(FINAL_JOB_STAGING).",
+        FINAL_JOB_STAGING.toString(), dirName.toString());
+    assertNotEquals(
+        "With scratchdir.for.staging=false, getDirName() must NOT be the 
interim staging path.",
+        INTERIM_JOB_STAGING.toString(), dirName.toString());
+  }
+
+  @Test
+  public void testCreateMoveTaskUsesInterimJobPathWhenConfigTrue() {
+    HiveConf conf = buildConf();
+    conf.setBoolVar(ConfVars.HIVE_USE_SCRATCHDIR_FOR_STAGING, true);
+    Context mockCtx = buildMockContext();
+    FileSinkDesc fsd = buildFileSinkDesc(DEST_PATH);
+    FileSinkOperator fsOp = buildFileSinkOperator(fsd);
+
+    GenMapRedUtils.createMoveTask(
+        new MapRedTask(), true, fsOp,
+        buildMockParseContext(mockCtx),
+        Collections.emptyList(), conf, null);
+
+    verify(mockCtx).getTempDirForInterimJobPath(DEST_PATH);
+    verify(mockCtx, never()).getTempDirForFinalJobPath(any());
+
+    Path dirName = fsd.getDirName();
+
+    assertNotNull("FileSinkDesc.getDirName() must not be null", dirName);
+    assertEquals(
+        "With scratchdir.for.staging=true, FileSinkDesc.getDirName() must 
equal "
+            + "the value returned by getTempDirForInterimJobPath 
(INTERIM_JOB_STAGING).",
+        INTERIM_JOB_STAGING.toString(), dirName.toString());
+    assertNotEquals(
+        "With scratchdir.for.staging=true, getDirName() must NOT be the 
dest-relative staging path.",
+        FINAL_JOB_STAGING.toString(), dirName.toString());
+  }
+
+  /**
+   * Flipping the config flag must produce a different staging path, so that 
the two paths do not collide.
+   */
+  @Test
+  public void testConfigSwitchChangesStagingLocation() {
+    HiveConf confFalse = buildConf();
+    confFalse.setBoolVar(ConfVars.HIVE_USE_SCRATCHDIR_FOR_STAGING, false);
+    Context mockCtxFalse = buildMockContext();
+    FileSinkDesc fsdFalse = buildFileSinkDesc(DEST_PATH);
+
+    GenMapRedUtils.createMoveTask(
+        new MapRedTask(), true, buildFileSinkOperator(fsdFalse),
+        buildMockParseContext(mockCtxFalse),
+        Collections.emptyList(), confFalse, null);
+
+    HiveConf confTrue = buildConf();
+    confTrue.setBoolVar(ConfVars.HIVE_USE_SCRATCHDIR_FOR_STAGING, true);
+    Context mockCtxTrue = buildMockContext();
+    FileSinkDesc fsdTrue = buildFileSinkDesc(DEST_PATH);
+
+    GenMapRedUtils.createMoveTask(
+        new MapRedTask(), true, buildFileSinkOperator(fsdTrue),
+        buildMockParseContext(mockCtxTrue),
+        Collections.emptyList(), confTrue, null);
+
+    assertNotEquals(
+        "Flipping hive.use.scratchdir.for.staging must produce a different "
+            + "FileSinkDesc.getDirName(). false=" + fsdFalse.getDirName()
+            + " true=" + fsdTrue.getDirName(),
+        fsdFalse.getDirName().toString(),
+        fsdTrue.getDirName().toString());
+    assertEquals("false-branch must use FINAL_JOB_STAGING",
+        FINAL_JOB_STAGING.toString(), fsdFalse.getDirName().toString());
+    assertEquals("true-branch must use INTERIM_JOB_STAGING",
+        INTERIM_JOB_STAGING.toString(), fsdTrue.getDirName().toString());
+  }
+
+  /**
+   * The HIVE-26758 staging path change applies ONLY to native, non-MM, 
non-direct-insert tables.
+   * Micro-managed (insert-only) tables must bypass the staging path selection 
entirely.
+   */
+  @Test
+  public void testNoStagingForMmTable() {
+    HiveConf conf = buildConf();
+    conf.setBoolVar(ConfVars.HIVE_USE_SCRATCHDIR_FOR_STAGING, false);
+    Properties mmProps = new Properties();
+    
mmProps.setProperty(hive_metastoreConstants.TABLE_TRANSACTIONAL_PROPERTIES, 
"insert_only");
+    TableDesc mmTableDesc = new TableDesc(null, null, mmProps);
+
+    FileSinkDesc fsd = new FileSinkDesc(
+        DEST_PATH, mmTableDesc, false, 0, false, false,
+            1, 1, null, null,
+        DEST_PATH, false, false, false, false, false,
+        AcidUtils.Operation.NOT_ACID, false);
+
+    Context mockCtx = buildMockContext();
+    GenMapRedUtils.createMoveTask(
+        new MapRedTask(), true, buildFileSinkOperator(fsd),
+        buildMockParseContext(mockCtx),
+        Collections.emptyList(), conf, null);
+
+    // Neither staging method must be called for an MM table.
+    verify(mockCtx, never()).getTempDirForFinalJobPath(any());
+    verify(mockCtx, never()).getTempDirForInterimJobPath(any());
+
+    // getDirName() must remain at its initial value – no staging redirection.
+    assertEquals(
+        "MM table: getDirName() must stay at DEST_PATH; staging must be 
skipped.",
+        DEST_PATH.toString(), fsd.getDirName().toString());
+  }
+
+  /**
+   * Full-ACID tables with direct-insert must bypass the staging path 
selection entirely.
+   * Neither Context staging method should be called and getDirName() must 
remain unchanged.
+   */
+  @Test
+  public void testNoStagingForDirectInsert() {
+    HiveConf conf = buildConf();
+    conf.setBoolVar(ConfVars.HIVE_USE_SCRATCHDIR_FOR_STAGING, false);
+
+    FileSinkDesc fsd = new FileSinkDesc(
+        DEST_PATH, new TableDesc(null, null, new Properties()),
+        false, 0, false, false, 1, 1,
+            null, null,
+        DEST_PATH, false, false, false, false,
+        true,   // isDirectInsert = true
+        AcidUtils.Operation.INSERT, false);
+
+    Context mockCtx = buildMockContext();
+    GenMapRedUtils.createMoveTask(
+        new MapRedTask(), true, buildFileSinkOperator(fsd),
+        buildMockParseContext(mockCtx),
+        Collections.emptyList(), conf, null);
+
+    // Neither staging method must be called for a direct-insert table.
+    verify(mockCtx, never()).getTempDirForFinalJobPath(any());
+    verify(mockCtx, never()).getTempDirForInterimJobPath(any());
+
+    assertEquals(
+        "Direct-insert table: getDirName() must stay at DEST_PATH; staging 
must be skipped.",
+        DEST_PATH.toString(), fsd.getDirName().toString());
+  }
+
+  /**
+   * With the default config hive.use.scratchdir.for.staging=false.
+   * GenMapRedUtils#createMoveTask must produce the new HIVE-26758 layout:
+   * <staging_root>/<SPPath> where the staging directory appears before the 
static partition segment.
+   * Example (year=2001 is the static partition)
+   * table_path/.hive-staging_job0/year=2001
+   */
+  @Test
+  public void testDynamicPartitionStagingLayoutWithDefaultConfig() {
+    HiveConf conf = buildConf();
+    conf.setBoolVar(ConfVars.HIVE_USE_SCRATCHDIR_FOR_STAGING, false);
+    // Static partition segment: year=2001  (dynamic partition is season)
+    String spPath = "year=2001";
+    DynamicPartitionCtx dpCtx = new DynamicPartitionCtx();
+    dpCtx.setSPPath(spPath);
+    FileSinkDesc fsd = buildFileSinkDesc(DEST_PATH);
+    fsd.setDynPartCtx(dpCtx);
+    Context mockCtx = buildMockContext();
+    GenMapRedUtils.createMoveTask(
+        new MapRedTask(), true, buildFileSinkOperator(fsd),
+        buildMockParseContext(mockCtx),
+        Collections.emptyList(), conf, null);
+    Path expected = new Path(FINAL_JOB_STAGING, spPath);
+
+    assertEquals(
+        "With scratchdir.for.staging=false, getDirName() must be 
<staging_root>/year=2001 "
+            + "(staging dir BEFORE static partition).",
+        expected.toString(), fsd.getDirName().toString());
+
+    String dirStr  = fsd.getDirName().toString();
+    int stagingIdx = dirStr.indexOf(".hive-staging");
+    int spIdx      = dirStr.indexOf(spPath);
+
+    assertTrue(
+        "Staging dir must precede static partition. stagingIdx=" + stagingIdx
+            + " spIdx=" + spIdx + " path=" + dirStr,
+        stagingIdx >= 0 && stagingIdx < spIdx);
+
+    // Explicitly confirm that the PRE HIVE-26758 behavior 
(<dest>/year=2001/<staging>) is NOT produced.
+    assertFalse(
+        "getDirName() must NOT follow the pre-patch layout 
(<dest>/year=2001/<staging>). Got: " + dirStr,
+        dirStr.contains(DEST_PATH + "/" + spPath));
+  }
+
+  /**
+   * With hive.use.scratchdir.for.staging=true.
+   * GenMapRedUtils#createMoveTask must place staging under the
+   * scratch directory and still append the static partition after it:
+   * <hive.exec.scratchdir>/<staging_root>/<SPPath>
+   * This lets a subsequent MoveTask relocate data from scratchdir to the
+   * final table path without any intermediate moves under the table location.
+   * Example (year=2001 is the static partition)
+   *   expected: hive.exec.scratchdir/.hive-staging_job0/year=2001
+   */
+  @Test
+  public void testDynamicPartitionStagingLayoutWithScratchdirConfig() {
+    HiveConf conf = buildConf();
+    conf.setBoolVar(ConfVars.HIVE_USE_SCRATCHDIR_FOR_STAGING, true);
+    String spPath = "year=2001";
+    DynamicPartitionCtx dpCtx = new DynamicPartitionCtx();
+    dpCtx.setSPPath(spPath);
+    FileSinkDesc fsd = buildFileSinkDesc(DEST_PATH);
+    fsd.setDynPartCtx(dpCtx);
+    Context mockCtx = buildMockContext();
+    GenMapRedUtils.createMoveTask(
+        new MapRedTask(), true, buildFileSinkOperator(fsd),
+        buildMockParseContext(mockCtx),
+        Collections.emptyList(), conf, null);
+    Path expected = new Path(INTERIM_JOB_STAGING, spPath);
+
+    assertEquals(
+        "With scratchdir.for.staging=true, getDirName() must be "
+            + "<scratchdir_staging_root>/year=2001.",
+        expected.toString(), fsd.getDirName().toString());
+
+    String dirStr  = fsd.getDirName().toString();
+    int stagingIdx = dirStr.indexOf(".hive-staging");
+    int spIdx      = dirStr.indexOf(spPath);
+
+    assertTrue(
+        "Staging dir must precede static partition. stagingIdx=" + stagingIdx
+            + " spIdx=" + spIdx + " path=" + dirStr,
+        stagingIdx >= 0 && stagingIdx < spIdx);
+    assertTrue(
+        "With config=true, staging must be rooted at INTERIM_JOB_STAGING 
(scratchdir). Got: " + dirStr,
+        dirStr.startsWith(INTERIM_JOB_STAGING.toString()));
+    assertFalse(
+        "With config=true, staging must NOT be rooted at FINAL_JOB_STAGING 
(table path). Got: " + dirStr,
+        dirStr.startsWith(FINAL_JOB_STAGING.toString()));
+  }
+
+  @Test
+  public void testDefaultConfigValueIsFalse() {
+    assertFalse(
+        "hive.use.scratchdir.for.staging must default to false",
+        buildConf().getBoolVar(ConfVars.HIVE_USE_SCRATCHDIR_FOR_STAGING));
+  }
+}
diff --git 
a/ql/src/test/queries/clientpositive/hive_use_scratchdir_for_staging.q 
b/ql/src/test/queries/clientpositive/hive_use_scratchdir_for_staging.q
new file mode 100644
index 00000000000..cb50e3988d1
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/hive_use_scratchdir_for_staging.q
@@ -0,0 +1,79 @@
+-- HIVE-29490: Test hive.use.scratchdir.for.staging configuration and
+-- dynamic partition staging directory layout change for native non-acid,
+-- non-mm, non-direct-insert external tables.
+
+-- SORT_QUERY_RESULTS
+
+--! qt:replace:/(COLUMN_STATS_ACCURATE\s+)\{.*/$1#Masked#/
+--! qt:replace:/(transient_lastDdlTime\s+)[0-9]+/$1#Masked#/
+
+set hive.exec.dynamic.partition=true;
+set hive.exec.dynamic.partition.mode=nonstrict;
+set hive.stats.autogather=true;
+set hive.exec.max.dynamic.partitions=500;
+set hive.exec.max.dynamic.partitions.pernode=500;
+
+create database mydb;
+create external table mydb.source_test_tbl (a string) stored as orc;
+create external table mydb.target_test_tbl (a string) partitioned by (created 
string, day string) stored as orc;
+
+insert into table mydb.source_test_tbl values ('a');
+insert into table mydb.source_test_tbl values ('b');
+
+-- Staging dir sits above the static partition in the table directory:
+-- <table_path>/<staging_dir>/<static_partition>/<dynamic_partition>
+
+set hive.use.scratchdir.for.staging=false;
+set hive.exec.stagingdir=.hive-staging;
+insert into table mydb.target_test_tbl partition (created='20250101', day)
+select a, '20250101' as day
+from mydb.source_test_tbl;
+
+-- Verify data is correctly written to the final partition.
+-- If staging were broken the partition would be empty or missing.
+select * from mydb.target_test_tbl;
+show partitions mydb.target_test_tbl;
+
+-- hive.use.scratchdir.for.staging=true
+-- Staging uses ${hive.exec.scratchdir} entirely outside the table path:
+-- <hive.exec.scratchdir>/<staging_dir>/<static_partition>/<dynamic_partition>
+-- MoveTask then relocates data from scratchdir staging into <table_path>.
+-- If the scratchdir-based staging or MoveTask were broken, the data
+-- would NOT appear in the final partition, making this test fail.
+
+set hive.use.scratchdir.for.staging=true;
+set hive.exec.stagingdir=/tmp/hive-staging-dir/hive-staging;
+
+insert overwrite table mydb.target_test_tbl partition (created='20250101', day)
+select a, '20250101' as day
+from mydb.source_test_tbl;
+
+-- Verify data was correctly moved from scratchdir staging to the final 
partition.
+select * from mydb.target_test_tbl;
+show partitions mydb.target_test_tbl;
+
+-- File merge validation with hive.merge.tezfiles=true & 
hive.use.scratchdir.for.staging=true
+set tez.grouping.split-count=2;
+set hive.merge.tezfiles=true;
+set hive.merge.smallfiles.avgsize=1000000;
+
+insert overwrite table mydb.target_test_tbl partition (created='20250101', day)
+select a, '20250101' as day
+from mydb.source_test_tbl;
+
+-- Verify data is still correct after merge
+select * from mydb.target_test_tbl;
+show partitions mydb.target_test_tbl;
+
+-- verify the file count. it should merged into 1 final file by the merge task.
+analyze table mydb.target_test_tbl partition(created='20250101', 
day='20250101') compute statistics noscan;
+desc formatted mydb.target_test_tbl partition(created='20250101', 
day='20250101');
+
+-- Cleanup
+set hive.use.scratchdir.for.staging=false;
+set hive.merge.tezfiles=false;
+
+drop table mydb.source_test_tbl;
+drop table mydb.target_test_tbl;
+drop database mydb;
+
diff --git 
a/ql/src/test/results/clientpositive/tez/hive_use_scratchdir_for_staging.q.out 
b/ql/src/test/results/clientpositive/tez/hive_use_scratchdir_for_staging.q.out
new file mode 100644
index 00000000000..85bf603e7b7
--- /dev/null
+++ 
b/ql/src/test/results/clientpositive/tez/hive_use_scratchdir_for_staging.q.out
@@ -0,0 +1,211 @@
+PREHOOK: query: create database mydb
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:mydb
+POSTHOOK: query: create database mydb
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:mydb
+PREHOOK: query: create external table mydb.source_test_tbl (a string) stored 
as orc
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:mydb
+PREHOOK: Output: mydb@source_test_tbl
+POSTHOOK: query: create external table mydb.source_test_tbl (a string) stored 
as orc
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:mydb
+POSTHOOK: Output: mydb@source_test_tbl
+PREHOOK: query: create external table mydb.target_test_tbl (a string) 
partitioned by (created string, day string) stored as orc
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:mydb
+PREHOOK: Output: mydb@target_test_tbl
+POSTHOOK: query: create external table mydb.target_test_tbl (a string) 
partitioned by (created string, day string) stored as orc
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:mydb
+POSTHOOK: Output: mydb@target_test_tbl
+PREHOOK: query: insert into table mydb.source_test_tbl values ('a')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: mydb@source_test_tbl
+POSTHOOK: query: insert into table mydb.source_test_tbl values ('a')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: mydb@source_test_tbl
+POSTHOOK: Lineage: source_test_tbl.a SCRIPT []
+PREHOOK: query: insert into table mydb.source_test_tbl values ('b')
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: mydb@source_test_tbl
+POSTHOOK: query: insert into table mydb.source_test_tbl values ('b')
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: mydb@source_test_tbl
+POSTHOOK: Lineage: source_test_tbl.a SCRIPT []
+PREHOOK: query: insert into table mydb.target_test_tbl partition 
(created='20250101', day)
+select a, '20250101' as day
+from mydb.source_test_tbl
+PREHOOK: type: QUERY
+PREHOOK: Input: mydb@source_test_tbl
+PREHOOK: Output: mydb@target_test_tbl@created=20250101
+POSTHOOK: query: insert into table mydb.target_test_tbl partition 
(created='20250101', day)
+select a, '20250101' as day
+from mydb.source_test_tbl
+POSTHOOK: type: QUERY
+POSTHOOK: Input: mydb@source_test_tbl
+POSTHOOK: Output: mydb@target_test_tbl@created=20250101/day=20250101
+POSTHOOK: Lineage: target_test_tbl PARTITION(created=20250101,day=20250101).a 
SIMPLE [(source_test_tbl)source_test_tbl.FieldSchema(name:a, type:string, 
comment:null), ]
+PREHOOK: query: select * from mydb.target_test_tbl
+PREHOOK: type: QUERY
+PREHOOK: Input: mydb@target_test_tbl
+PREHOOK: Input: mydb@target_test_tbl@created=20250101/day=20250101
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from mydb.target_test_tbl
+POSTHOOK: type: QUERY
+POSTHOOK: Input: mydb@target_test_tbl
+POSTHOOK: Input: mydb@target_test_tbl@created=20250101/day=20250101
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+a      20250101        20250101
+b      20250101        20250101
+PREHOOK: query: show partitions mydb.target_test_tbl
+PREHOOK: type: SHOWPARTITIONS
+PREHOOK: Input: mydb@target_test_tbl
+POSTHOOK: query: show partitions mydb.target_test_tbl
+POSTHOOK: type: SHOWPARTITIONS
+POSTHOOK: Input: mydb@target_test_tbl
+created=20250101/day=20250101
+PREHOOK: query: insert overwrite table mydb.target_test_tbl partition 
(created='20250101', day)
+select a, '20250101' as day
+from mydb.source_test_tbl
+PREHOOK: type: QUERY
+PREHOOK: Input: mydb@source_test_tbl
+PREHOOK: Output: mydb@target_test_tbl@created=20250101
+POSTHOOK: query: insert overwrite table mydb.target_test_tbl partition 
(created='20250101', day)
+select a, '20250101' as day
+from mydb.source_test_tbl
+POSTHOOK: type: QUERY
+POSTHOOK: Input: mydb@source_test_tbl
+POSTHOOK: Output: mydb@target_test_tbl@created=20250101/day=20250101
+POSTHOOK: Lineage: target_test_tbl PARTITION(created=20250101,day=20250101).a 
SIMPLE [(source_test_tbl)source_test_tbl.FieldSchema(name:a, type:string, 
comment:null), ]
+PREHOOK: query: select * from mydb.target_test_tbl
+PREHOOK: type: QUERY
+PREHOOK: Input: mydb@target_test_tbl
+PREHOOK: Input: mydb@target_test_tbl@created=20250101/day=20250101
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from mydb.target_test_tbl
+POSTHOOK: type: QUERY
+POSTHOOK: Input: mydb@target_test_tbl
+POSTHOOK: Input: mydb@target_test_tbl@created=20250101/day=20250101
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+a      20250101        20250101
+b      20250101        20250101
+PREHOOK: query: show partitions mydb.target_test_tbl
+PREHOOK: type: SHOWPARTITIONS
+PREHOOK: Input: mydb@target_test_tbl
+POSTHOOK: query: show partitions mydb.target_test_tbl
+POSTHOOK: type: SHOWPARTITIONS
+POSTHOOK: Input: mydb@target_test_tbl
+created=20250101/day=20250101
+PREHOOK: query: insert overwrite table mydb.target_test_tbl partition 
(created='20250101', day)
+select a, '20250101' as day
+from mydb.source_test_tbl
+PREHOOK: type: QUERY
+PREHOOK: Input: mydb@source_test_tbl
+PREHOOK: Output: mydb@target_test_tbl@created=20250101
+POSTHOOK: query: insert overwrite table mydb.target_test_tbl partition 
(created='20250101', day)
+select a, '20250101' as day
+from mydb.source_test_tbl
+POSTHOOK: type: QUERY
+POSTHOOK: Input: mydb@source_test_tbl
+POSTHOOK: Output: mydb@target_test_tbl@created=20250101/day=20250101
+POSTHOOK: Lineage: target_test_tbl PARTITION(created=20250101,day=20250101).a 
SIMPLE [(source_test_tbl)source_test_tbl.FieldSchema(name:a, type:string, 
comment:null), ]
+PREHOOK: query: select * from mydb.target_test_tbl
+PREHOOK: type: QUERY
+PREHOOK: Input: mydb@target_test_tbl
+PREHOOK: Input: mydb@target_test_tbl@created=20250101/day=20250101
+PREHOOK: Output: hdfs://### HDFS PATH ###
+POSTHOOK: query: select * from mydb.target_test_tbl
+POSTHOOK: type: QUERY
+POSTHOOK: Input: mydb@target_test_tbl
+POSTHOOK: Input: mydb@target_test_tbl@created=20250101/day=20250101
+POSTHOOK: Output: hdfs://### HDFS PATH ###
+a      20250101        20250101
+b      20250101        20250101
+PREHOOK: query: show partitions mydb.target_test_tbl
+PREHOOK: type: SHOWPARTITIONS
+PREHOOK: Input: mydb@target_test_tbl
+POSTHOOK: query: show partitions mydb.target_test_tbl
+POSTHOOK: type: SHOWPARTITIONS
+POSTHOOK: Input: mydb@target_test_tbl
+created=20250101/day=20250101
+PREHOOK: query: analyze table mydb.target_test_tbl 
partition(created='20250101', day='20250101') compute statistics noscan
+PREHOOK: type: QUERY
+PREHOOK: Input: mydb@target_test_tbl
+PREHOOK: Output: mydb@target_test_tbl
+PREHOOK: Output: mydb@target_test_tbl@created=20250101/day=20250101
+POSTHOOK: query: analyze table mydb.target_test_tbl 
partition(created='20250101', day='20250101') compute statistics noscan
+POSTHOOK: type: QUERY
+POSTHOOK: Input: mydb@target_test_tbl
+POSTHOOK: Output: mydb@target_test_tbl
+POSTHOOK: Output: mydb@target_test_tbl@created=20250101/day=20250101
+PREHOOK: query: desc formatted mydb.target_test_tbl 
partition(created='20250101', day='20250101')
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: mydb@target_test_tbl
+POSTHOOK: query: desc formatted mydb.target_test_tbl 
partition(created='20250101', day='20250101')
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: mydb@target_test_tbl
+# col_name             data_type               comment             
+a                      string                                      
+                
+# Partition Information                 
+# col_name             data_type               comment             
+created                string                                      
+day                    string                                      
+                
+# Detailed Partition Information                
+Partition Value:       [20250101, 20250101]     
+Database:              mydb                     
+Table:                 target_test_tbl          
+#### A masked pattern was here ####
+Partition Parameters:           
+       COLUMN_STATS_ACCURATE   #Masked#
+       numFiles                1                   
+       numRows                 2                   
+       rawDataSize             178                 
+       totalSize               #Masked#
+#### A masked pattern was here ####
+                
+# Storage Information           
+SerDe Library:         org.apache.hadoop.hive.ql.io.orc.OrcSerde        
+InputFormat:           org.apache.hadoop.hive.ql.io.orc.OrcInputFormat  
+OutputFormat:          org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat        
 
+Compressed:            No                       
+Num Buckets:           -1                       
+Bucket Columns:        []                       
+Sort Columns:          []                       
+Storage Desc Params:            
+       serialization.format    1                   
+PREHOOK: query: drop table mydb.source_test_tbl
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: mydb@source_test_tbl
+PREHOOK: Output: database:mydb
+PREHOOK: Output: mydb@source_test_tbl
+POSTHOOK: query: drop table mydb.source_test_tbl
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: mydb@source_test_tbl
+POSTHOOK: Output: database:mydb
+POSTHOOK: Output: mydb@source_test_tbl
+PREHOOK: query: drop table mydb.target_test_tbl
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: mydb@target_test_tbl
+PREHOOK: Output: database:mydb
+PREHOOK: Output: mydb@target_test_tbl
+POSTHOOK: query: drop table mydb.target_test_tbl
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: mydb@target_test_tbl
+POSTHOOK: Output: database:mydb
+POSTHOOK: Output: mydb@target_test_tbl
+PREHOOK: query: drop database mydb
+PREHOOK: type: DROPDATABASE
+PREHOOK: Input: database:mydb
+PREHOOK: Output: database:mydb
+POSTHOOK: query: drop database mydb
+POSTHOOK: type: DROPDATABASE
+POSTHOOK: Input: database:mydb
+POSTHOOK: Output: database:mydb

Reply via email to