package net.sf.jsqlparser.test.insert;
import java.io.StringReader;
import junit.framework.TestCase;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.DoubleValue;
import net.sf.jsqlparser.expression.JdbcParameter;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.parser.CCJSqlParserManager;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.SubSelect;
import org.junit.Test;
public class InsertTest extends TestCase {
CCJSqlParserManager parserManager = new CCJSqlParserManager();
@Test
public void testRegularInsert() throws JSQLParserException {
String statement = "INSERT INTO mytable (col1, col2, col3) VALUES (?, 'sadfsd', 234)";
Insert insert = (Insert) parserManager.parse(new StringReader(statement));
assertEquals("mytable", insert.getTable().getName());
assertEquals(3, insert.getColumns().size());
assertEquals("col1", ((Column) insert.getColumns().get(0)).getColumnName());
assertEquals("col2", ((Column) insert.getColumns().get(1)).getColumnName());
assertEquals("col3", ((Column) insert.getColumns().get(2)).getColumnName());
assertEquals(3, ((ExpressionList) insert.getItemsList()).getExpressions().size());
assertTrue(((ExpressionList) insert.getItemsList()).getExpressions().get(0) instanceof JdbcParameter);
assertEquals("sadfsd", ((StringValue) ((ExpressionList) insert.getItemsList()).getExpressions().get(1)).getValue());
assertEquals(234, ((LongValue) ((ExpressionList) insert.getItemsList()).getExpressions().get(2)).getValue());
assertEquals(statement, "" + insert);
statement = "INSERT INTO myschema.mytable VALUES (?, ?, 2.3)";
insert = (Insert) parserManager.parse(new StringReader(statement));
assertEquals("myschema.mytable", insert.getTable().getWholeTableName());
assertEquals(3, ((ExpressionList) insert.getItemsList()).getExpressions().size());
assertTrue(((ExpressionList) insert.getItemsList()).getExpressions().get(0) instanceof JdbcParameter);
assertEquals(2.3, ((DoubleValue) ((ExpressionList) insert.getItemsList()).getExpressions().get(2)).getValue(), 0.0);
assertEquals(statement, "" + insert);
}
@Test
public void testComment() throws JSQLParserException {
String statement =
"/*90053*/ INSERT /*erte*/ INTO /*jkl;kl;*/ mytable /*dfgdg*/ (/*24242*/ col1 /*werfwer*/, /*24242*/ col2 /*werwerw*/, /*24242*/ col3 /*werwerw*/ ) /*werfsfs*/ VALUES /*weruwer*/ (/**/ ? /**/, /**/ 'sadfsd' /**/, /**/ 234 /**/ ) /*eiortouei*/";
Insert insert = (Insert) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + insert);
statement = "/*0*/ INSERT /*1*/ INTO /*2*/ mytable /*3*/ (/*4*/ col1 /*5*/, /*6*/ col2 /*7*/, /*8*/ col3 /*9*/ ) /*10*/ (/*11*/ SELECT /*12*/ * FROM /*13*/ mytable2 /*14*/) /*15*/";
insert = (Insert) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + insert);
}
@Test
public void testInsertFromSelect() throws JSQLParserException {
String statement = "INSERT INTO mytable t (col1, col2, col3) SELECT * FROM mytable2";
Insert insert = (Insert) parserManager.parse(new StringReader(statement));
assertEquals("mytable", insert.getTable().getName());
assertEquals(3, insert.getColumns().size());
assertEquals("col1", ((Column) insert.getColumns().get(0)).getColumnName());
assertEquals("col2", ((Column) insert.getColumns().get(1)).getColumnName());
assertEquals("col3", ((Column) insert.getColumns().get(2)).getColumnName());
assertTrue(insert.getItemsList() instanceof SubSelect);
assertEquals("mytable2", ((Table) ((PlainSelect) ((SubSelect) insert.getItemsList()).getSelectBody()).getFromItem()).getName());
//toString uses brakets
String statementToString = "INSERT INTO mytable t (col1, col2, col3) (SELECT * FROM mytable2)";
assertEquals(statementToString, "" + insert);
}
}