Search in sources :

Example 11 with Update

use of net.sf.jsqlparser.statement.update.Update in project JSqlParser by JSQLParser.

the class UpdateTest method testUpdateWAlias.

@Test
public void testUpdateWAlias() throws JSQLParserException {
    String statement = "UPDATE table1 A SET A.columna = 'XXX' WHERE A.cod_table = 'YYY'";
    Update update = (Update) parserManager.parse(new StringReader(statement));
}
Also used : StringReader(java.io.StringReader) Update(net.sf.jsqlparser.statement.update.Update) Test(org.junit.Test)

Example 12 with Update

use of net.sf.jsqlparser.statement.update.Update in project JSqlParser by JSQLParser.

the class TablesNamesFinderTest method testGetTableListFromUpdate2.

@Test
public void testGetTableListFromUpdate2() throws Exception {
    String sql = "UPDATE MY_TABLE1 SET a = 5 WHERE 0 < (SELECT COUNT(b) FROM MY_TABLE3)";
    net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql));
    Update updateStatement = (Update) statement;
    TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
    List<String> tableList = tablesNamesFinder.getTableList(updateStatement);
    assertEquals(2, tableList.size());
    assertTrue(tableList.contains("MY_TABLE1"));
    assertTrue(tableList.contains("MY_TABLE3"));
}
Also used : Statement(net.sf.jsqlparser.statement.Statement) StringReader(java.io.StringReader) Update(net.sf.jsqlparser.statement.update.Update) Test(org.junit.Test) CCJSqlParserManagerTest(net.sf.jsqlparser.test.simpleparsing.CCJSqlParserManagerTest)

Example 13 with Update

use of net.sf.jsqlparser.statement.update.Update in project JSqlParser by JSQLParser.

the class TablesNamesFinderTest method testGetTableListFromUpdate.

@Test
public void testGetTableListFromUpdate() throws Exception {
    String sql = "UPDATE MY_TABLE1 SET a = (SELECT a from MY_TABLE2 WHERE a = 1)";
    net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql));
    Update updateStatement = (Update) statement;
    TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
    List<String> tableList = tablesNamesFinder.getTableList(updateStatement);
    assertEquals(2, tableList.size());
    assertTrue(tableList.contains("MY_TABLE1"));
    assertTrue(tableList.contains("MY_TABLE2"));
}
Also used : Statement(net.sf.jsqlparser.statement.Statement) StringReader(java.io.StringReader) Update(net.sf.jsqlparser.statement.update.Update) Test(org.junit.Test) CCJSqlParserManagerTest(net.sf.jsqlparser.test.simpleparsing.CCJSqlParserManagerTest)

Example 14 with Update

use of net.sf.jsqlparser.statement.update.Update in project dbeaver by serge-rider.

the class SQLQuery method parseQuery.

private void parseQuery() {
    if (parsed) {
        return;
    }
    parsed = true;
    try {
        if (CommonUtils.isEmpty(text)) {
            this.statement = null;
            this.parseError = new DBException("Empty query");
            return;
        }
        statement = SQLSemanticProcessor.parseQuery(dataSource == null ? null : dataSource.getSQLDialect(), text);
        if (statement instanceof Select) {
            type = SQLQueryType.SELECT;
            // Detect single source table (no joins, no group by, no sub-selects)
            SelectBody selectBody = ((Select) statement).getSelectBody();
            if (selectBody instanceof PlainSelect) {
                PlainSelect plainSelect = (PlainSelect) selectBody;
                if (plainSelect.getFromItem() instanceof Table && CommonUtils.isEmpty(plainSelect.getJoins()) && (plainSelect.getGroupBy() == null || CommonUtils.isEmpty(plainSelect.getGroupBy().getGroupByExpressions())) && CommonUtils.isEmpty(plainSelect.getIntoTables())) {
                    boolean hasSubSelects = false;
                    for (SelectItem si : plainSelect.getSelectItems()) {
                        if (si instanceof SelectExpressionItem && ((SelectExpressionItem) si).getExpression() instanceof SubSelect) {
                            hasSubSelects = true;
                            break;
                        }
                    }
                    if (!hasSubSelects) {
                        fillSingleSource((Table) plainSelect.getFromItem());
                    }
                }
                // Extract select items info
                final List<SelectItem> items = plainSelect.getSelectItems();
                if (items != null && !items.isEmpty()) {
                    selectItems = new ArrayList<>();
                    for (SelectItem item : items) {
                        selectItems.add(new SQLSelectItem(item));
                    }
                }
            }
        } else if (statement instanceof Insert) {
            type = SQLQueryType.INSERT;
            fillSingleSource(((Insert) statement).getTable());
        } else if (statement instanceof Update) {
            type = SQLQueryType.UPDATE;
            Table table = ((Update) statement).getTable();
            if (table != null) {
                fillSingleSource(table);
            }
        } else if (statement instanceof Delete) {
            type = SQLQueryType.DELETE;
            if (((Delete) statement).getTable() != null) {
                fillSingleSource(((Delete) statement).getTable());
            } else {
                List<Table> tables = ((Delete) statement).getTables();
                if (tables != null && tables.size() == 1) {
                    fillSingleSource(tables.get(0));
                }
            }
        } else if (statement instanceof Alter || statement instanceof CreateTable || statement instanceof CreateView || statement instanceof Drop || statement instanceof CreateIndex) {
            type = SQLQueryType.DDL;
        } else {
            type = SQLQueryType.UNKNOWN;
        }
    } catch (Throwable e) {
        this.type = SQLQueryType.UNKNOWN;
        this.parseError = e;
    // log.debug("Error parsing SQL query [" + query + "]:" + CommonUtils.getRootCause(e).getMessage());
    }
}
Also used : Delete(net.sf.jsqlparser.statement.delete.Delete) DBException(org.jkiss.dbeaver.DBException) Table(net.sf.jsqlparser.schema.Table) CreateTable(net.sf.jsqlparser.statement.create.table.CreateTable) CreateTable(net.sf.jsqlparser.statement.create.table.CreateTable) Insert(net.sf.jsqlparser.statement.insert.Insert) Update(net.sf.jsqlparser.statement.update.Update) CreateView(net.sf.jsqlparser.statement.create.view.CreateView) Drop(net.sf.jsqlparser.statement.drop.Drop) Alter(net.sf.jsqlparser.statement.alter.Alter) CreateIndex(net.sf.jsqlparser.statement.create.index.CreateIndex) ArrayList(java.util.ArrayList) List(java.util.List)

Example 15 with Update

use of net.sf.jsqlparser.statement.update.Update in project spanner-jdbc by olavloite.

the class AbstractCloudSpannerStatement method createInsertSelectOnDuplicateKeyUpdateStatement.

/**
 * Transform the given UPDATE-statement into an "INSERT INTO TAB1 (...) SELECT ... FROM TAB1 WHERE
 * ... ON DUPLICATE KEY UPDATE"
 *
 * @param update The UPDATE-statement
 * @return An SQL-statement equal to the UPDATE-statement but in INSERT form
 * @throws SQLException if a database exception occurs while getting the table meta data or if the
 *         statement tries to update the primary key value
 */
protected String createInsertSelectOnDuplicateKeyUpdateStatement(Update update) throws SQLException {
    String tableName = unquoteIdentifier(update.getTables().get(0).getName());
    TableKeyMetaData table = getConnection().getTable(tableName);
    List<String> keyColumns = table.getKeyColumns();
    List<String> updateColumns = update.getColumns().stream().map(Column::getColumnName).map(String::toUpperCase).collect(Collectors.toList());
    List<String> quotedKeyColumns = keyColumns.stream().map(this::quoteIdentifier).collect(Collectors.toList());
    List<String> quotedAndQualifiedKeyColumns = keyColumns.stream().map(x -> quoteIdentifier(tableName) + "." + quoteIdentifier(x)).collect(Collectors.toList());
    List<String> quotedUpdateColumns = updateColumns.stream().map(this::quoteIdentifier).collect(Collectors.toList());
    List<String> expressions = update.getExpressions().stream().map(Object::toString).collect(Collectors.toList());
    if (updateColumns.stream().anyMatch(keyColumns::contains)) {
        String invalidCols = updateColumns.stream().filter(keyColumns::contains).collect(Collectors.joining());
        throw new CloudSpannerSQLException("UPDATE of a primary key value is not allowed, cannot UPDATE the column(s) " + invalidCols, Code.INVALID_ARGUMENT);
    }
    StringBuilder res = new StringBuilder();
    res.append("INSERT INTO ").append(quoteIdentifier(tableName)).append("\n(");
    res.append(String.join(", ", quotedKeyColumns)).append(", ");
    res.append(String.join(", ", quotedUpdateColumns)).append(")");
    res.append("\nSELECT ").append(String.join(", ", quotedAndQualifiedKeyColumns)).append(", ");
    res.append(String.join(", ", expressions));
    res.append("\nFROM ").append(quoteIdentifier(tableName));
    if (update.getWhere() != null)
        res.append("\n").append("WHERE ").append(update.getWhere().toString());
    res.append("\nON DUPLICATE KEY UPDATE");
    return res.toString();
}
Also used : TableKeyMetaData(nl.topicus.jdbc.MetaDataStore.TableKeyMetaData) TransactionCallable(com.google.cloud.spanner.TransactionRunner.TransactionCallable) ReadContext(com.google.cloud.spanner.ReadContext) SQLFeatureNotSupportedException(java.sql.SQLFeatureNotSupportedException) DatabaseClient(com.google.cloud.spanner.DatabaseClient) PlainSelect(net.sf.jsqlparser.statement.select.PlainSelect) TableKeyMetaData(nl.topicus.jdbc.MetaDataStore.TableKeyMetaData) SQLException(java.sql.SQLException) ResultSet(java.sql.ResultSet) Column(net.sf.jsqlparser.schema.Column) Update(net.sf.jsqlparser.statement.update.Update) SQLWarning(java.sql.SQLWarning) Code(com.google.rpc.Code) PartitionOptions(com.google.cloud.spanner.PartitionOptions) TransactionContext(com.google.cloud.spanner.TransactionContext) CloudSpannerConnection(nl.topicus.jdbc.CloudSpannerConnection) Table(net.sf.jsqlparser.schema.Table) BatchReadOnlyTransaction(com.google.cloud.spanner.BatchReadOnlyTransaction) CloudSpannerSQLException(nl.topicus.jdbc.exception.CloudSpannerSQLException) Collectors(java.util.stream.Collectors) AbstractCloudSpannerFetcher(nl.topicus.jdbc.AbstractCloudSpannerFetcher) Partition(com.google.cloud.spanner.Partition) SpannerException(com.google.cloud.spanner.SpannerException) List(java.util.List) Select(net.sf.jsqlparser.statement.select.Select) Statement(java.sql.Statement) CloudSpannerDriver(nl.topicus.jdbc.CloudSpannerDriver) SelectVisitorAdapter(net.sf.jsqlparser.statement.select.SelectVisitorAdapter) FromItemVisitorAdapter(net.sf.jsqlparser.statement.select.FromItemVisitorAdapter) Column(net.sf.jsqlparser.schema.Column) CloudSpannerSQLException(nl.topicus.jdbc.exception.CloudSpannerSQLException)

Aggregations

Update (net.sf.jsqlparser.statement.update.Update)18 Test (org.junit.Test)12 StringReader (java.io.StringReader)6 ArrayList (java.util.ArrayList)4 Statement (net.sf.jsqlparser.statement.Statement)4 Alter (net.sf.jsqlparser.statement.alter.Alter)4 CreateTable (net.sf.jsqlparser.statement.create.table.CreateTable)4 Delete (net.sf.jsqlparser.statement.delete.Delete)4 Drop (net.sf.jsqlparser.statement.drop.Drop)4 Insert (net.sf.jsqlparser.statement.insert.Insert)4 CCJSqlParserManagerTest (net.sf.jsqlparser.test.simpleparsing.CCJSqlParserManagerTest)4 UnitTest (nl.topicus.jdbc.test.category.UnitTest)4 List (java.util.List)3 Expression (net.sf.jsqlparser.expression.Expression)3 Column (net.sf.jsqlparser.schema.Column)3 Table (net.sf.jsqlparser.schema.Table)3 CreateIndex (net.sf.jsqlparser.statement.create.index.CreateIndex)3 Select (net.sf.jsqlparser.statement.select.Select)3 CreateView (net.sf.jsqlparser.statement.create.view.CreateView)2 OrderByElement (net.sf.jsqlparser.statement.select.OrderByElement)2