blob: e165cfe2e53891d2a08c01d3c29e787dac1f2c25 [file] [log] [blame]
/**
* 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 com.cloudera.sqoop;
import java.io.IOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.cloudera.sqoop.testutil.ImportJobTestCase;
/**
* Test cases that import rows containing multiple columns,
* some of which may contain null values.
*
* Also test loading only selected columns from the db.
*/
public class TestMultiCols extends ImportJobTestCase {
public static final Log LOG = LogFactory.getLog(
TestMultiCols.class.getName());
/**
* Do a full import verification test on a table containing one row.
* @param types the types of the columns to insert
* @param insertVals the SQL text to use to insert each value
* @param validateVals the text to expect when retrieving each value from
* the db
* @param validateLine the text to expect as a toString() of the entire row,
* as imported by the tool
* @param importColumns The list of columns to import
*/
private void verifyTypes(String [] types , String [] insertVals,
String validateLine) {
verifyTypes(types, insertVals, validateLine, null);
}
private void verifyTypes(String [] types , String [] insertVals,
String validateLine, String [] importColumns) {
createTableWithColTypes(types, insertVals);
verifyImport(validateLine, importColumns);
LOG.debug("Verified input line as " + validateLine + " -- ok!");
}
public void testThreeStrings() {
String [] types = { "VARCHAR(32)", "VARCHAR(32)", "VARCHAR(32)" };
String [] insertVals = { "'foo'", "'bar'", "'baz'" };
String validateLine = "foo,bar,baz";
verifyTypes(types, insertVals, validateLine);
}
public void testStringsWithNull1() {
String [] types = { "VARCHAR(32)", "VARCHAR(32)", "VARCHAR(32)" };
String [] insertVals = { "'foo'", "null", "'baz'" };
String validateLine = "foo,null,baz";
verifyTypes(types, insertVals, validateLine);
}
public void testStringsWithNull2() {
String [] types = { "VARCHAR(32)", "VARCHAR(32)", "VARCHAR(32)" };
String [] insertVals = { "null", "'foo'", "'baz'" };
String validateLine = "null,foo,baz";
verifyTypes(types, insertVals, validateLine);
}
public void testStringsWithNull3() {
String [] types = { "VARCHAR(32)", "VARCHAR(32)", "VARCHAR(32)" };
String [] insertVals = { "'foo'", "'baz'", "null"};
String validateLine = "foo,baz,null";
verifyTypes(types, insertVals, validateLine);
}
public void testThreeInts() {
String [] types = { "INTEGER", "INTEGER", "INTEGER" };
String [] insertVals = { "1", "2", "3" };
String validateLine = "1,2,3";
verifyTypes(types, insertVals, validateLine);
}
public void testIntsWithNulls() {
String [] types = { "INTEGER", "INTEGER", "INTEGER" };
String [] insertVals = { "1", "null", "3" };
String validateLine = "1,null,3";
verifyTypes(types, insertVals, validateLine);
}
public void testMixed1() {
String [] types = { "INTEGER", "VARCHAR(32)", "DATE" };
String [] insertVals = { "1", "'meep'", "'2009-12-31'" };
String validateLine = "1,meep,2009-12-31";
verifyTypes(types, insertVals, validateLine);
}
public void testMixed2() {
String [] types = { "INTEGER", "VARCHAR(32)", "DATE" };
String [] insertVals = { "null", "'meep'", "'2009-12-31'" };
String validateLine = "null,meep,2009-12-31";
verifyTypes(types, insertVals, validateLine);
}
public void testMixed3() {
String [] types = { "INTEGER", "VARCHAR(32)", "DATE" };
String [] insertVals = { "1", "'meep'", "null" };
String validateLine = "1,meep,null";
verifyTypes(types, insertVals, validateLine);
}
public void testMixed4() {
String [] types = { "NUMERIC", "INTEGER", "NUMERIC" };
String [] insertVals = { "-42", "17", "33333333333333333333333.1714" };
String validateLine = "-42,17,33333333333333333333333.1714";
verifyTypes(types, insertVals, validateLine);
}
public void testMixed5() {
String [] types = { "NUMERIC", "INTEGER", "NUMERIC" };
String [] insertVals = { "null", "17", "33333333333333333333333.0" };
String validateLine = "null,17,33333333333333333333333.0";
verifyTypes(types, insertVals, validateLine);
}
public void testMixed6() {
String [] types = { "NUMERIC", "INTEGER", "NUMERIC" };
String [] insertVals = { "33333333333333333333333", "17", "-42"};
String validateLine = "33333333333333333333333,17,-42";
verifyTypes(types, insertVals, validateLine);
}
//////////////////////////////////////////////////////////////////////////
// the tests below here test the --columns parameter and ensure that
// we can selectively import only certain columns.
//////////////////////////////////////////////////////////////////////////
public void testSkipFirstCol() {
String [] types = { "NUMERIC", "INTEGER", "NUMERIC" };
String [] insertVals = { "33333333333333333333333", "17", "-42"};
String validateLine = "17,-42";
String [] loadCols = {"DATA_COL1", "DATA_COL2"};
verifyTypes(types, insertVals, validateLine, loadCols);
}
public void testSkipSecondCol() {
String [] types = { "NUMERIC", "INTEGER", "NUMERIC" };
String [] insertVals = { "33333333333333333333333", "17", "-42"};
String validateLine = "33333333333333333333333,-42";
String [] loadCols = {"DATA_COL0", "DATA_COL2"};
verifyTypes(types, insertVals, validateLine, loadCols);
}
public void testSkipThirdCol() {
String [] types = { "NUMERIC", "INTEGER", "NUMERIC" };
String [] insertVals = { "33333333333333333333333", "17", "-42"};
String validateLine = "33333333333333333333333,17";
String [] loadCols = {"DATA_COL0", "DATA_COL1"};
verifyTypes(types, insertVals, validateLine, loadCols);
}
/**
* This tests that the columns argument can handle comma-separated column
* names. So this is like having:
* --columns "DATA_COL0,DATA_COL1,DATA_COL2"
* as two args on a sqoop command line
*
* @throws IOException
*/
public void testSingleColumnsArg() throws IOException {
String [] types = { "VARCHAR(32)", "VARCHAR(32)", "VARCHAR(32)" };
String [] insertVals = { "'foo'", "'bar'", "'baz'" };
String validateLine = "foo,bar,baz";
String [] loadCols = {"DATA_COL0,DATA_COL1,DATA_COL2"};
verifyTypes(types, insertVals, validateLine, loadCols);
}
/**
* This tests that the columns argument can handle spaces between column
* names. So this is like having:
* --columns "DATA_COL0, DATA_COL1, DATA_COL2"
* as two args on a sqoop command line
*
* @throws IOException
*/
public void testColumnsWithSpaces() throws IOException {
String [] types = { "VARCHAR(32)", "VARCHAR(32)", "VARCHAR(32)" };
String [] insertVals = { "'foo'", "'bar'", "'baz'" };
String validateLine = "foo,bar,baz";
String [] loadCols = {"DATA_COL0, DATA_COL1, DATA_COL2"};
verifyTypes(types, insertVals, validateLine, loadCols);
}
}