Search in sources :

Example 36 with Column

use of net.sf.jsqlparser.schema.Column in project yyl_example by Relucent.

the class CountSqlParser method sqlToCount.

/**
 * 将 SQL 转换为 COUNT 查询
 */
public void sqlToCount(Select select) {
    SelectBody selectBody = select.getSelectBody();
    List<SelectItem> countItem = new ArrayList<SelectItem>();
    countItem.add(new SelectExpressionItem(new Column("count(*)")));
    if (selectBody instanceof PlainSelect && isSimpleCount((PlainSelect) selectBody)) {
        ((PlainSelect) selectBody).setSelectItems(countItem);
    } else {
        SubSelect subSelect = new SubSelect();
        subSelect.setSelectBody(selectBody);
        subSelect.setAlias(TABLE_ALIAS);
        PlainSelect plainSelect = new PlainSelect();
        plainSelect.setFromItem(subSelect);
        plainSelect.setSelectItems(countItem);
        select.setSelectBody(plainSelect);
    }
}
Also used : Column(net.sf.jsqlparser.schema.Column) SelectItem(net.sf.jsqlparser.statement.select.SelectItem) SelectExpressionItem(net.sf.jsqlparser.statement.select.SelectExpressionItem) ArrayList(java.util.ArrayList) PlainSelect(net.sf.jsqlparser.statement.select.PlainSelect) SelectBody(net.sf.jsqlparser.statement.select.SelectBody) LateralSubSelect(net.sf.jsqlparser.statement.select.LateralSubSelect) SubSelect(net.sf.jsqlparser.statement.select.SubSelect)

Example 37 with Column

use of net.sf.jsqlparser.schema.Column in project spanner-jdbc by olavloite.

the class CloudSpannerPreparedStatement method createUpdateMutation.

private Mutation createUpdateMutation(Update update, boolean generateParameterMetaData) throws SQLException {
    if (update.getTables().isEmpty())
        throw new CloudSpannerSQLException("No table found in update statement", Code.INVALID_ARGUMENT);
    if (update.getTables().size() > 1)
        throw new CloudSpannerSQLException("Update statements for multiple tables at once are not supported", Code.INVALID_ARGUMENT);
    String table = unquoteIdentifier(update.getTables().get(0).getFullyQualifiedName());
    getParameterStore().setTable(table);
    List<Expression> expressions = update.getExpressions();
    WriteBuilder builder = Mutation.newUpdateBuilder(table);
    int index = 0;
    for (Column col : update.getColumns()) {
        String columnName = unquoteIdentifier(col.getFullyQualifiedName());
        expressions.get(index).accept(new ValueBinderExpressionVisitorAdapter<>(getParameterStore(), builder.set(columnName), columnName));
        index++;
    }
    visitUpdateWhereClause(update.getWhere(), builder, generateParameterMetaData);
    return builder.build();
}
Also used : Expression(net.sf.jsqlparser.expression.Expression) Column(net.sf.jsqlparser.schema.Column) WriteBuilder(com.google.cloud.spanner.Mutation.WriteBuilder) CloudSpannerSQLException(nl.topicus.jdbc.exception.CloudSpannerSQLException)

Example 38 with Column

use of net.sf.jsqlparser.schema.Column in project spanner-jdbc by olavloite.

the class CloudSpannerPreparedStatement method setPlainSelectParameters.

private void setPlainSelectParameters(PlainSelect plainSelect, com.google.cloud.spanner.Statement.Builder builder) {
    if (plainSelect.getFromItem() != null) {
        plainSelect.getFromItem().accept(new FromItemVisitorAdapter() {

            private int tableCount = 0;

            @Override
            public void visit(Table table) {
                tableCount++;
                if (tableCount == 1)
                    getParameterStore().setTable(unquoteIdentifier(table.getFullyQualifiedName()));
                else
                    getParameterStore().setTable(null);
            }

            @Override
            public void visit(SubSelect subSelect) {
                if (subSelect.getSelectBody() instanceof PlainSelect) {
                    setPlainSelectParameters((PlainSelect) subSelect.getSelectBody(), builder);
                } else {
                    subSelect.getSelectBody().accept(new SelectVisitorAdapter() {

                        @Override
                        public void visit(PlainSelect plainSelect) {
                            setPlainSelectParameters(plainSelect, builder);
                        }

                        @Override
                        public void visit(SetOperationList setOpList) {
                            for (SelectBody body : setOpList.getSelects()) {
                                setSelectParameters(body, builder);
                            }
                        }
                    });
                }
            }
        });
    }
    if (plainSelect.getSelectItems() != null) {
        for (SelectItem selectItem : plainSelect.getSelectItems()) {
            selectItem.accept(new SelectItemVisitorAdapter() {

                @Override
                public void visit(SelectExpressionItem item) {
                    item.getExpression().accept(new ExpressionVisitorAdapter() {

                        private String currentCol = null;

                        @Override
                        public void visit(Column col) {
                            currentCol = unquoteIdentifier(col.getFullyQualifiedName());
                        }

                        @Override
                        public void visit(JdbcParameter parameter) {
                            parameter.accept(new ValueBinderExpressionVisitorAdapter<>(getParameterStore(), builder.bind("p" + parameter.getIndex()), currentCol));
                            currentCol = null;
                        }

                        @Override
                        public void visit(SubSelect subSelect) {
                            setSelectParameters(subSelect.getSelectBody(), builder);
                        }
                    });
                }
            });
        }
    }
    setWhereParameters(plainSelect.getWhere(), builder);
    if (plainSelect.getLimit() != null) {
        setWhereParameters(plainSelect.getLimit().getRowCount(), builder);
    }
    if (plainSelect.getOffset() != null && plainSelect.getOffset().getOffsetJdbcParameter() != null) {
        ValueBinderExpressionVisitorAdapter<com.google.cloud.spanner.Statement.Builder> binder = new ValueBinderExpressionVisitorAdapter<>(getParameterStore(), builder.bind("p" + getParameterStore().getHighestIndex()), null);
        binder.setValue(getParameterStore().getParameter(getParameterStore().getHighestIndex()), Types.BIGINT);
        getParameterStore().setType(getParameterStore().getHighestIndex(), Types.BIGINT);
    }
}
Also used : Table(net.sf.jsqlparser.schema.Table) JdbcParameter(net.sf.jsqlparser.expression.JdbcParameter) SelectExpressionItem(net.sf.jsqlparser.statement.select.SelectExpressionItem) WriteBuilder(com.google.cloud.spanner.Mutation.WriteBuilder) PlainSelect(net.sf.jsqlparser.statement.select.PlainSelect) SelectBody(net.sf.jsqlparser.statement.select.SelectBody) SetOperationList(net.sf.jsqlparser.statement.select.SetOperationList) SelectVisitorAdapter(net.sf.jsqlparser.statement.select.SelectVisitorAdapter) SelectItemVisitorAdapter(net.sf.jsqlparser.statement.select.SelectItemVisitorAdapter) Column(net.sf.jsqlparser.schema.Column) SelectItem(net.sf.jsqlparser.statement.select.SelectItem) FromItemVisitorAdapter(net.sf.jsqlparser.statement.select.FromItemVisitorAdapter) ExpressionVisitorAdapter(net.sf.jsqlparser.expression.ExpressionVisitorAdapter) SubSelect(net.sf.jsqlparser.statement.select.SubSelect)

Example 39 with Column

use of net.sf.jsqlparser.schema.Column in project spanner-jdbc by olavloite.

the class CloudSpannerPreparedStatement method createInsertMutation.

private Mutation createInsertMutation(Insert insert, boolean generateParameterMetaData) throws SQLException {
    ItemsList items = insert.getItemsList();
    if (generateParameterMetaData && items == null && insert.getSelect() != null) {
        // Just initialize the parameter meta data of the select statement
        createSelectBuilder(insert.getSelect(), insert.getSelect().toString());
        return null;
    }
    if (!(items instanceof ExpressionList)) {
        throw new CloudSpannerSQLException("Insert statement must specify a list of values", Code.INVALID_ARGUMENT);
    }
    if (insert.getColumns() == null || insert.getColumns().isEmpty()) {
        throw new CloudSpannerSQLException("Insert statement must specify a list of column names", Code.INVALID_ARGUMENT);
    }
    List<Expression> expressions = ((ExpressionList) items).getExpressions();
    String table = unquoteIdentifier(insert.getTable().getFullyQualifiedName());
    getParameterStore().setTable(table);
    WriteBuilder builder;
    if (insert.isUseDuplicate()) {
        /**
         * Do an insert-or-update. BUT: Cloud Spanner does not support supplying different values for
         * the insert and update statements, meaning that only the values specified in the INSERT part
         * of the statement will be considered. Anything specified in the 'ON DUPLICATE KEY UPDATE
         * ...' statement will be ignored.
         */
        if (this.forceUpdate)
            builder = Mutation.newUpdateBuilder(table);
        else
            builder = Mutation.newInsertOrUpdateBuilder(table);
    } else {
        /**
         * Just do an insert and throw an error if a row with the specified key alread exists.
         */
        builder = Mutation.newInsertBuilder(table);
    }
    int index = 0;
    for (Column col : insert.getColumns()) {
        String columnName = unquoteIdentifier(col.getFullyQualifiedName());
        expressions.get(index).accept(new ValueBinderExpressionVisitorAdapter<>(getParameterStore(), builder.set(columnName), columnName));
        index++;
    }
    return builder.build();
}
Also used : ItemsList(net.sf.jsqlparser.expression.operators.relational.ItemsList) Expression(net.sf.jsqlparser.expression.Expression) Column(net.sf.jsqlparser.schema.Column) WriteBuilder(com.google.cloud.spanner.Mutation.WriteBuilder) CloudSpannerSQLException(nl.topicus.jdbc.exception.CloudSpannerSQLException) ExpressionList(net.sf.jsqlparser.expression.operators.relational.ExpressionList)

Example 40 with Column

use of net.sf.jsqlparser.schema.Column in project spanner-jdbc by olavloite.

the class CloudSpannerResultSetMetaData method getPrecision.

@Override
public int getPrecision(int column) throws SQLException {
    int colType = getColumnType(column);
    switch(colType) {
        case Types.BOOLEAN:
            return 1;
        case Types.DATE:
            return 10;
        case Types.DOUBLE:
            return 14;
        case Types.BIGINT:
            return 10;
        case Types.TIMESTAMP:
            return 24;
        default:
    }
    Column col = getColumn(column);
    if (col != null && col.getTable() != null) {
        String schema = Strings.isNullOrEmpty(col.getTable().getSchemaName()) ? "" : CloudSpannerDriver.unquoteIdentifier(col.getTable().getSchemaName());
        String tableName = CloudSpannerDriver.unquoteIdentifier(col.getTable().getName());
        String colName = CloudSpannerDriver.unquoteIdentifier(col.getColumnName());
        try (java.sql.ResultSet rs = statement.getConnection().getMetaData().getColumns("", schema, tableName, colName)) {
            if (rs.next()) {
                return rs.getInt("COLUMN_SIZE");
            }
        }
    }
    return 0;
}
Also used : Column(net.sf.jsqlparser.schema.Column)

Aggregations

Column (net.sf.jsqlparser.schema.Column)43 Expression (net.sf.jsqlparser.expression.Expression)19 Test (org.junit.Test)19 Table (net.sf.jsqlparser.schema.Table)18 PlainSelect (net.sf.jsqlparser.statement.select.PlainSelect)18 Select (net.sf.jsqlparser.statement.select.Select)18 ArrayList (java.util.ArrayList)9 SelectExpressionItem (net.sf.jsqlparser.statement.select.SelectExpressionItem)8 SelectItem (net.sf.jsqlparser.statement.select.SelectItem)8 OrderByElement (net.sf.jsqlparser.statement.select.OrderByElement)6 LongValue (net.sf.jsqlparser.expression.LongValue)5 AndExpression (net.sf.jsqlparser.expression.operators.conditional.AndExpression)5 Statement (net.sf.jsqlparser.statement.Statement)5 SelectBody (net.sf.jsqlparser.statement.select.SelectBody)5 SimpleNode (net.sf.jsqlparser.parser.SimpleNode)4 SelectVisitorAdapter (net.sf.jsqlparser.statement.select.SelectVisitorAdapter)4 WriteBuilder (com.google.cloud.spanner.Mutation.WriteBuilder)3 ExpressionVisitorAdapter (net.sf.jsqlparser.expression.ExpressionVisitorAdapter)3 CloudSpannerSQLException (nl.topicus.jdbc.exception.CloudSpannerSQLException)3 SQLException (java.sql.SQLException)2