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);
}
}
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();
}
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);
}
}
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();
}
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;
}
Aggregations