diff --git a/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java b/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java index e224f2c348a49f0818591e0251c91196e17902ca..a664d4df3add5cfb7a0104f8364d4edc9d835ea4 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/session/SessionState.java @@ -27,6 +27,7 @@ import java.lang.management.ManagementFactory; import java.net.URI; import java.net.URISyntaxException; +import java.net.URLEncoder; import java.security.AccessController; import java.time.Instant; import java.util.ArrayList; @@ -129,6 +130,7 @@ private static final String TMP_TABLE_SPACE_KEY = "_hive.tmp_table_space"; static final String LOCK_FILE_NAME = "inuse.lck"; static final String INFO_FILE_NAME = "inuse.info"; + private static final String ENCODING = "UTF-8"; /** * Concurrent since SessionState is often propagated to workers in thread pools @@ -1492,6 +1494,7 @@ public String add_resource(ResourceType t, String value, boolean convertToUnix) for (String value : values) { String key; + value = URLEncoder.encode(value, ENCODING); //get the local path of downloaded jars. List downloadedURLs = resolveAndDownload(t, value, convertToUnix); @@ -1505,7 +1508,7 @@ public String add_resource(ResourceType t, String value, boolean convertToUnix) Set downloadedValues = new HashSet(); for (URI uri : downloadedURLs) { - String resourceValue = uri.toString(); + String resourceValue = uri.getPath(); downloadedValues.add(resourceValue); localized.add(resourceValue); if (reverseResourcePathMap.containsKey(resourceValue)) { diff --git a/ql/src/test/org/apache/hadoop/hive/ql/session/TestAddResource.java b/ql/src/test/org/apache/hadoop/hive/ql/session/TestAddResource.java index dabec44f90c202f5996fa26ebf18e4ba18e91c28..80c4f6752ec472d07d7a418081b94a8f9d180d6d 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/session/TestAddResource.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/session/TestAddResource.java @@ -18,9 +18,9 @@ package org.apache.hadoop.hive.ql.session; -import static org.junit.Assert.assertEquals; - +import java.io.BufferedWriter; import java.io.File; +import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.net.URI; @@ -31,23 +31,19 @@ import java.util.List; import java.util.Set; -import org.apache.hadoop.fs.Path; import org.apache.hadoop.hive.conf.HiveConf; -import org.junit.After; +import org.apache.hadoop.hive.ql.session.SessionState.ResourceType; + import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; -import org.apache.hadoop.hive.ql.session.SessionState.ResourceType; -import org.apache.hadoop.hive.ql.session.SessionState; -import org.apache.hadoop.util.Shell; -import java.io.BufferedWriter; -import java.io.FileWriter; +import static org.junit.Assert.assertEquals; public class TestAddResource { - private static final String TEST_JAR_DIR = System.getProperty("test.tmp.dir", ".") + File.pathSeparator; + private static final String TEST_JAR_DIR = System.getProperty("test.tmp.dir", ".") + File.separator; private HiveConf conf; private ResourceType t; @@ -58,15 +54,32 @@ public void setup() throws IOException { //Generate test jar files for (int i = 1; i <= 5; i++) { - Writer output = null; - String dataFile = TEST_JAR_DIR + "testjar" + i + ".jar"; - File file = new File(dataFile); - output = new BufferedWriter(new FileWriter(file)); - output.write("sample"); - output.close(); + writeTestJarFile(TEST_JAR_DIR + "testjar" + i + ".jar", "sample"); } } + private static void writeTestJarFile(String dataFile, String content) throws IOException { + File file = new File(dataFile); + file.deleteOnExit(); + Writer output = new BufferedWriter(new FileWriter(file)); + output.write(content); + output.close(); + } + + @Test + public void testSpecialCharsInPath() throws Exception { + String filePath = TEST_JAR_DIR + "testjar-[specialchars].jar"; + writeTestJarFile(filePath, "sample"); + + SessionState ss = Mockito.spy(SessionState.start(conf).get()); + ss.add_resource(t, filePath); + Set result = ss.list_resource(t, null); + assertEquals(1, result.size()); + assertEquals(filePath, result.stream().findFirst().get()); + + ss.close(); + } + // Check that all the jars are added to the classpath @Test public void testSanity() throws URISyntaxException, IOException { @@ -321,19 +334,6 @@ public void testDeleteJarMultiple() throws URISyntaxException, IOException { ss.close(); } - @After - public void tearDown() { - // delete sample jars - for (int i = 1; i <= 5; i++) { - String dataFile = TEST_JAR_DIR + "testjar" + i + ".jar"; - - File f = new File(dataFile); - if (!f.delete()) { - throw new RuntimeException("Could not delete the data file"); - } - } - } - private List union(List list1, List list2) { Set set = new HashSet();