blob: b4995d67af58faf1c8eeb1fd8dfbbb2c3118bb31 [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 org.apache.openjpa.jdbc.sql;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Arrays;
import org.apache.openjpa.jdbc.identifier.DBIdentifier.DBIdentifierType;
import org.apache.openjpa.jdbc.kernel.exps.FilterValue;
import org.apache.openjpa.jdbc.schema.Column;
import org.apache.openjpa.jdbc.schema.Index;
/**
* Dictionary for the SQL Server databases (Sybase and MS SQL Server).
*/
public abstract class AbstractSQLServerDictionary
extends DBDictionary {
public AbstractSQLServerDictionary() {
reservedWordSet.addAll(Arrays.asList(new String[]{ "FILE", "INDEX" }));
invalidColumnWordSet.addAll(reservedWordSet);
systemTableSet.add("DTPROPERTIES");
validationSQL = "SELECT GETDATE()";
rangePosition = RANGE_POST_DISTINCT;
supportsDeferredConstraints = false;
supportsSelectEndIndex = true;
allowsAliasInBulkClause = false;
supportsAutoAssign = true;
autoAssignClause = "IDENTITY";
lastGeneratedKeyQuery = "SELECT @@IDENTITY";
trimLeadingFunction = "LTRIM({0})";
trimTrailingFunction = "RTRIM({0})";
trimBothFunction = "LTRIM(RTRIM({0}))";
concatenateFunction = "({0}+{1})";
supportsModOperator = true;
currentDateFunction = "GETDATE()";
currentTimeFunction = "GETDATE()";
currentTimestampFunction = "GETDATE()";
useGetStringForClobs = true;
useSetStringForClobs = true;
useGetBytesForBlobs = true;
useSetBytesForBlobs = true;
binaryTypeName = "BINARY";
blobTypeName = "IMAGE";
longVarbinaryTypeName = "IMAGE";
clobTypeName = "TEXT";
longVarcharTypeName = "TEXT";
dateTypeName = "DATETIME";
timeTypeName = "DATETIME";
timestampTypeName = "DATETIME";
timestampWithZoneTypeName = "DATETIMEOFFSET";
floatTypeName = "FLOAT(16)";
doubleTypeName = "FLOAT(32)";
integerTypeName = "INT";
fixedSizeTypeNameSet.addAll(Arrays.asList(new String[]{
"IMAGE", "TEXT", "NTEXT", "MONEY", "SMALLMONEY", "INT",
"DOUBLE PRECISION", "DATETIME", "SMALLDATETIME",
"EXTENDED TYPE", "SYSNAME", "SQL_VARIANT", "INDEX",
"DATETIME2",
}));
}
@Override
public Column[] getColumns(DatabaseMetaData meta, String catalog,
String schemaName, String tableName, String colName, Connection conn)
throws SQLException {
Column[] cols = super.getColumns(meta, catalog, schemaName, tableName,
colName, conn);
for (int i = 0; cols != null && i < cols.length; i++)
if (cols[i].getType() == Types.LONGVARCHAR)
cols[i].setType(Types.CLOB);
return cols;
}
@Override
public String getFullName(Index idx) {
return toDBName(getNamingUtil().append(DBIdentifierType.INDEX,
getFullIdentifier(idx.getTable(), false),idx.getIdentifier()));
}
@Override
public void setNull(PreparedStatement stmnt, int idx, int colType,
Column col)
throws SQLException {
// SQLServer has some problems with setNull on lobs
if (colType == Types.CLOB)
stmnt.setString(idx, null);
else if (colType == Types.BLOB)
stmnt.setBytes(idx, null);
else
super.setNull(stmnt, idx, colType, col);
}
@Override
protected void appendSelectRange(SQLBuffer buf, long start, long end,
boolean subselect) {
// cannot use a value here, since SQLServer does not support
// bound parameters in a "TOP" clause
buf.append(" TOP ").append(Long.toString(end));
}
@Override
public void substring(SQLBuffer buf, FilterValue str, FilterValue start,
FilterValue length) {
if (length != null)
super.substring(buf, str, start, length);
else {
buf.append("SUBSTRING(");
str.appendTo(buf);
buf.append(", ");
start.appendTo(buf);
buf.append(", LEN(");
str.appendTo(buf);
buf.append(")");
buf.append(" - (");
start.appendTo(buf);
buf.append(" - 1))");
}
}
}