Class SQLChar
- All Implemented Interfaces:
Externalizable, Serializable, Comparable, Formatable, Storable, StreamStorable, TypedFormat, ConcatableDataValue, DataValueDescriptor, Orderable, StringDataValue, VariableSizeDataValue
- Direct Known Subclasses:
CollatorSQLChar, SQLVarchar
The state may be in char[], a String, a Clob, or an unread stream, depending on how the datatype was created.
Stream notes:
When the datatype comes from the database layer and the length of the bytes necessary to store the datatype on disk exceeds the size of a page of the container holding the data then the store returns a stream rather than reading all the bytes into a char[] or String. The hope is that the usual usage case is that data never need be expanded in the derby layer, and that client can just be given a stream that can be read a char at a time through the jdbc layer. Even though SQLchar's can't ever be this big, this code is shared by all the various character datatypes including SQLClob which is expected to usually larger than a page.
The state can also be a stream in the case of insert/update where the client has used a jdbc interface to set the value as a stream rather than char[]. In this case the hope is that the usual usage case is that stream never need be read until it is passed to store, read once, and inserted into the database.
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected ClobThe value as a user-created Clob(package private) char[][]private static final intprivate static final char[]Static array that can be used for blank padding.protected static final StreamHeaderGeneratorStream header generator for CHAR, VARCHAR and LONG VARCHAR.private CollationKeyprivate static final intwhen we know that the array needs to grow by at least one byte, it is not performant to grow by just one byte instead this amount is used to provide a reasonable growby size.private LocaleFinderprivate static final charThe pad character (space).private char[]private intprotected static final intthreshold, that decides when we return space back to the VM see getString() where it is used(package private) InputStreamThe value as a stream in the on-disk format.private StringFields of the classFields inherited from interface DataValueDescriptor
UNKNOWN_LOGICAL_LENGTHFields inherited from interface Orderable
ORDER_OP_EQUALS, ORDER_OP_GREATEROREQUALS, ORDER_OP_GREATERTHAN, ORDER_OP_LESSOREQUALS, ORDER_OP_LESSTHANFields inherited from interface StringDataValue
BOTH, COLLATION_DERIVATION_EXPLICIT, COLLATION_DERIVATION_IMPLICIT, COLLATION_DERIVATION_NONE, COLLATION_TYPE_TERRITORY_BASED, COLLATION_TYPE_TERRITORY_BASED_IDENTICAL, COLLATION_TYPE_TERRITORY_BASED_PRIMARY, COLLATION_TYPE_TERRITORY_BASED_SECONDARY, COLLATION_TYPE_TERRITORY_BASED_TERTIARY, COLLATION_TYPE_UCS_BASIC, LEADING, TRAILINGFields inherited from interface VariableSizeDataValue
IGNORE_PRECISION -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionansiTrim(int trimType, StringDataValue trimChar, StringDataValue result) The SQL Ansi trim function.private static voidappendBlanks(char[] ca, int offset, int howMany) Private/Protected methods of This class:charLength(NumberDataValue result) This method implements the char_length function for char.Shallow clone a StreamStorable without objectifying.cloneValue(boolean forceMaterialization) Clone this DataValueDescriptor.booleancompare(int op, DataValueDescriptor other, boolean orderedNulls, boolean unknownRV) Compare this Orderable with a given Orderable for the purpose of qualification and sorting.intcompare(DataValueDescriptor other) Compare this Orderable with a given Orderable for the purpose of index positioning.concatenate(StringDataValue leftOperand, StringDataValue rightOperand, StringDataValue result) The SQL concatenation '||' operator.private voidcopyState(String otherValue, char[] otherRawData, int otherRawLength, CollationKey otherCKey, InputStream otherStream, Clob otherClobValue, LocaleFinder otherLocaleFinder) protected voidequals(DataValueDescriptor left, DataValueDescriptor right) The = operator as called from the language module, as opposed to the storage module.intEstimate the memory usage in bytes of the data value and the overhead of the class.private voidformatJDBCDate(Calendar cal, StringBuffer sb) private voidformatJDBCTime(Calendar cal, StringBuffer sb) booleanGet Boolean from a SQLChar.bytegetByte()Get Byte from a SQLChar.char[]Get a char array.private intprotected CollationKeyThis method gets called for the collation sensitive char classes ie CollatorSQLChar, CollatorSQLVarchar, CollatorSQLLongvarchar, CollatorSQLClob.protected RuleBasedCollatorGet date from a SQLChar.static DategetDate(Calendar cal, String str, LocaleFinder localeFinder) Static function to Get date from a string.doubleGet double from a SQLChar.floatgetFloat()Get float from a SQLChar.intgetInt()Get int from a SQLChar.intGets the length of the data value.private Localeprotected LocaleFinderlonggetLong()Get long from a SQLChar.Get a new null value of the same type as this data value.protected StringDataValueGet a SQLVarchar for a built-in string function.Gets the value in the data value descriptor as a int.char[]This is a special accessor used when we wrap passwords in VARCHARs.shortgetShort()Get Short from a SQLChar.Gets the value in the data stream descriptor as an InputStream.Returns the default stream header generator for the string data types.Returns a descriptor for the input stream for this character data value.If possible, use getCharArray() if you don't really need a string.Get time from a SQLChar.static TimegetTime(Calendar cal, String str, LocaleFinder localeFinder) Static function to Get Time from a string.getTimestamp(Calendar cal) Get Timestamp from a SQLChar.static TimestampgetTimestamp(Calendar cal, String str, LocaleFinder localeFinder) Static function to Get Timestamp from a string.Gets a trace representation for debugging.intReturn my format identifier.Get the SQL name of the datatypeprivate intgetUTF8Length(String string, int start, int end) Get the number of bytes needed to represent a string in modified UTF-8, which is the encoding used bywriteExternal()andwriteUTF().getValue(RuleBasedCollator collatorForComparison) Gets either SQLChar/SQLVarchar/SQLLongvarchar/SQLClob(base classes) or CollatorSQLChar/CollatorSQLVarchar/CollatorSQLLongvarch/CollatorSQLClob (subclasses).greaterOrEquals(DataValueDescriptor left, DataValueDescriptor right) The >= operator as called from the language module, as opposed to the storage module.greaterThan(DataValueDescriptor left, DataValueDescriptor right) The > operator as called from the language module, as opposed to the storage module.protected intgrowBy()returns the reasonable minimum amount by which the array can grow .inthashCode()(package private) intHash code implementation for collator sensitive subclasses.protected final voidhasNonBlankChars(String source, int start, int end) booleanisNull()see if the String value is null.lessOrEquals(DataValueDescriptor left, DataValueDescriptor right) The <= operator as called from the language module, as opposed to the storage module.lessThan(DataValueDescriptor left, DataValueDescriptor right) The < operator as called from the language module, as opposed to the storage module.like(DataValueDescriptor pattern) This method implements the like function for char (with no escape value).like(DataValueDescriptor pattern, DataValueDescriptor escape) This method implements the like function for char with an escape value.voidSet the value by reading the stream and converting it to an object form.locate(StringDataValue searchFrom, NumberDataValue start, NumberDataValue result) This method implements the locate function for char.lower(StringDataValue result) Convert the string to lower case.protected voidnormalize(DataTypeDescriptor desiredType, String sourceValue) voidnormalize(DataTypeDescriptor desiredType, DataValueDescriptor source) Normalization method - this method may be called when putting a value into a SQLChar, for example, when inserting into a SQLChar column.notEquals(DataValueDescriptor left, DataValueDescriptor right) The <> operator as called from the language module, as opposed to the storage module.private intvoidprotected voidreadExternal(ObjectInput in, int utflen, int knownStrLen) Restores the data value from the source stream, materializing the value in memory.protected voidreadExternalClobFromArray(ArrayInputStream in, int charLen) Reads a CLOB from the source stream and materializes the value in a character array.voidReads in a string from the specified data input stream.private voidResets state after materializing value from an array.voidRestore this object to its (SQL)null value.Public Methods of StreamStorable interface:voidsetBigDecimal(BigDecimal bigDecimal) Only to be called when an application through JDBC is setting a SQLChar to a java.math.BigDecimal.protected voidsetFrom(DataValueDescriptor theValue) Set the value of this DataValueDescriptor based on the value of the specified DataValueDescriptor.final voidsetInto(PreparedStatement ps, int position) Set the value into a PreparedStatement.protected voidsetLocaleFinder(LocaleFinder localeFinder) voidsetObjectForCast(Object theValue, boolean instanceOfResultType, String resultTypeClassName) Allow any Java type to be cast to a character type using Object.toString.voidsetStream(InputStream newStream) Set this value to the on-disk format stream.voidsetStreamHeaderFormat(Boolean inSoftUpgradeMode) Sets the mode for the database being accessed.voidsetValue(boolean theValue) Set the value.voidsetValue(byte theValue) Set the value of this DataValueDescriptor to the given byte value At DataType level just throws an error lower classes will overridevoidsetValue(byte[] theValue) Set the value of this DataValueDescriptor.voidsetValue(double theValue) Set the value of this DataValueDescriptor to the given double value At DataType level just throws an error lower classes will overridevoidsetValue(float theValue) Set the value of this DataValueDescriptor to the given float value At DataType level just throws an error lower classes will overridevoidsetValue(int theValue) Set the value of this DataValueDescriptor to the given int value At DataType level just throws an error lower classes will overridevoidsetValue(long theValue) Set the value of this DataValueDescriptor to the given long value At DataType level just throws an error lower classes will overridevoidsetValue(short theValue) Set the value of this DataValueDescriptor to the given short value At DataType level just throws an error lower classes will overridefinal voidsetValue(InputStream theStream, int valueLength) Set the value from the stream which is in the on-disk format.voidSet the value of this DataValueDescriptor.voidSet the value of this DataValueDescriptor.voidSet the value of this DataValueDescriptor.voidSet the value of this DataValueDescriptor.voidSet the value of this DataValueDescriptor.final voidsetValueFromResultSet(ResultSet resultSet, int colNumber, boolean isNullable) Set the value based on the value for the specified DataValueDescriptor from the specified ResultSet.voidsetWidth(int desiredWidth, int desiredScale, boolean errorOnTrunc) Set the width of the to the desired value.protected static intstringCompare(char[] op1, int leftlen, char[] op2, int rightlen) Compare two Strings using standard SQL semantics.protected static intstringCompare(String op1, String op2) Compare two Strings using standard SQL semantics.protected intstringCompare(SQLChar char1, SQLChar char2) Compare two SQLChars.substring(NumberDataValue start, NumberDataValue length, ConcatableDataValue result, int maxLen) The SQL substr() function.protected voidWraps anIOExceptionin aStandardExceptionthen throws the wrapping exception.toString()private StringtrimInternal(int trimType, char trimChar, String source) This function public for testing purposes.intEach built-in type in JSQL has a precedence.intCHAR/VARCHAR/LONG VARCHAR implementation.upper(StringDataValue result) Convert the string to upper case.protected final voidwriteClobUTF(ObjectOutput out) Writes the header and the user data for a CLOB to the destination stream.voidWrites a non-Clob data value to the modified UTF-8 format used by Derby.private static voidwriteUTF(ObjectOutput out, int c) Write a single character to a stream in the modified UTF-8 format.private final voidwriteUTF(ObjectOutput out, int strLen, boolean isRaw, Reader characterReader) Writes the user data value to a stream in the modified UTF-8 format.voidZero out the wrapped char[] so that it can't be memory-sniffed.Methods inherited from class DataType
checkHostVariable, coalesce, compare, compare, compareTo, dataTypeConversion, equals, flip, genericSetObject, getBytes, getTypeName, hasStream, in, invalidFormat, isNotNull, isNullOp, outOfRange, recycle, setInto, setObject, setToNull, setValue, setValue, setValue, setValue, setValue, setValue, throwLangSetMismatch, throwLangSetMismatch
-
Field Details
-
PAD
private static final char PADThe pad character (space).- See Also:
-
RETURN_SPACE_THRESHOLD
protected static final int RETURN_SPACE_THRESHOLDthreshold, that decides when we return space back to the VM see getString() where it is used- See Also:
-
GROWBY_FOR_CHAR
private static final int GROWBY_FOR_CHARwhen we know that the array needs to grow by at least one byte, it is not performant to grow by just one byte instead this amount is used to provide a reasonable growby size.- See Also:
-
BASE_MEMORY_USAGE
private static final int BASE_MEMORY_USAGE -
BLANKS
private static final char[] BLANKSStatic array that can be used for blank padding. -
CHAR_HEADER_GENERATOR
Stream header generator for CHAR, VARCHAR and LONG VARCHAR. Currently, only one header format is used for these data types. -
value
Fields of the class -
rawData
private char[] rawData -
rawLength
private int rawLength -
cKey
-
_clobValue
The value as a user-created Clob -
stream
InputStream streamThe value as a stream in the on-disk format. -
localeFinder
-
arg_passer
char[][] arg_passer
-
-
Constructor Details
-
SQLChar
public SQLChar()no-arg constructor, required by Formattable. -
SQLChar
-
SQLChar
-
SQLChar
public SQLChar(char[] val) This is a special constructor used when we need to represent a password as a VARCHAR (see DERBY-866). If you need a general-purpose constructor for char[] values and you want to re-use this constructor, make sure to keep track of the following:
- A password should never be turned into a String. This is because Java garbage collection makes it easy to sniff memory for String passwords. For more information, see this blog.
- It must be possible to 0 out the char[] array wrapped inside this SQLChar. This reduces the vulnerability that someone could sniff the char[] password after Derby has processed it.
-
-
Method Details
-
appendBlanks
private static void appendBlanks(char[] ca, int offset, int howMany) Private/Protected methods of This class: -
getRawDataAndZeroIt
public char[] getRawDataAndZeroIt()This is a special accessor used when we wrap passwords in VARCHARs. This accessor copies the wrapped char[] and then fills it with 0s so that the password can't be memory-sniffed. For more information, see the comment on the SQLChar( char[] ) constructor.
-
zeroRawData
public void zeroRawData()Zero out the wrapped char[] so that it can't be memory-sniffed. This helps us protect passwords. See the comment on the SQLChar( char[] ) constructor.
-
getBoolean
Get Boolean from a SQLChar.Return false for only "0" or "false" for false. No case insensitivity. Everything else is true.
The above matches JCC and the client driver.
- Specified by:
getBooleanin interfaceDataValueDescriptor- Overrides:
getBooleanin classDataType- Returns:
- The data value as a boolean.
- Throws:
StandardException- Thrown on error- See Also:
-
getByte
Get Byte from a SQLChar.Uses java standard Byte.parseByte() to perform coercion.
- Specified by:
getBytein interfaceDataValueDescriptor- Overrides:
getBytein classDataType- Returns:
- The data value as a byte.
- Throws:
StandardException- thrown on failure to convert- See Also:
-
getShort
Get Short from a SQLChar.Uses java standard Short.parseShort() to perform coercion.
- Specified by:
getShortin interfaceDataValueDescriptor- Overrides:
getShortin classDataType- Returns:
- The data value as a short.
- Throws:
StandardException- thrown on failure to convert- See Also:
-
getInt
Get int from a SQLChar.Uses java standard Short.parseInt() to perform coercion.
- Specified by:
getIntin interfaceDataValueDescriptor- Overrides:
getIntin classDataType- Returns:
- The data value as a int.
- Throws:
StandardException- thrown on failure to convert- See Also:
-
getLong
Get long from a SQLChar.Uses java standard Short.parseLong() to perform coercion.
- Specified by:
getLongin interfaceDataValueDescriptor- Overrides:
getLongin classDataType- Returns:
- The data value as a long.
- Throws:
StandardException- thrown on failure to convert- See Also:
-
getFloat
Get float from a SQLChar.Uses java standard Float.floatValue() to perform coercion.
- Specified by:
getFloatin interfaceDataValueDescriptor- Overrides:
getFloatin classDataType- Returns:
- The data value as a float.
- Throws:
StandardException- thrown on failure to convert- See Also:
-
getDouble
Get double from a SQLChar.Uses java standard Double.doubleValue() to perform coercion.
- Specified by:
getDoublein interfaceDataValueDescriptor- Overrides:
getDoublein classDataType- Returns:
- The data value as a double.
- Throws:
StandardException- thrown on failure to convert- See Also:
-
getDate
Get date from a SQLChar.- Specified by:
getDatein interfaceDataValueDescriptor- Overrides:
getDatein classDataType- Parameters:
cal- calendar for object creation- Returns:
- The data value as a java.sql.Date.
- Throws:
StandardException- thrown on failure to convert- See Also:
-
getDate
public static Date getDate(Calendar cal, String str, LocaleFinder localeFinder) throws StandardException Static function to Get date from a string.- Throws:
StandardException- thrown on failure to convert- See Also:
-
getTime
Get time from a SQLChar.- Specified by:
getTimein interfaceDataValueDescriptor- Overrides:
getTimein classDataType- Parameters:
cal- calendar for object creation- Returns:
- The data value as a java.sql.Time.
- Throws:
StandardException- thrown on failure to convert- See Also:
-
getTime
public static Time getTime(Calendar cal, String str, LocaleFinder localeFinder) throws StandardException Static function to Get Time from a string.- Throws:
StandardException- thrown on failure to convert- See Also:
-
getTimestamp
Get Timestamp from a SQLChar.- Specified by:
getTimestampin interfaceDataValueDescriptor- Overrides:
getTimestampin classDataType- Parameters:
cal- calendar for object creation- Returns:
- The data value as a java.sql.Timestamp.
- Throws:
StandardException- thrown on failure to convert- See Also:
-
getTimestamp
public static Timestamp getTimestamp(Calendar cal, String str, LocaleFinder localeFinder) throws StandardException Static function to Get Timestamp from a string.- Throws:
StandardException- thrown on failure to convert- See Also:
-
returnStream
Public Methods of StreamStorable interface:- Specified by:
returnStreamin interfaceStreamStorable
-
setStream
Set this value to the on-disk format stream.- Specified by:
setStreamin interfaceStreamStorable
-
loadStream
Description copied from interface:StreamStorableSet the value by reading the stream and converting it to an object form.- Specified by:
loadStreamin interfaceStreamStorable- Throws:
StandardException- on error
-
getObject
Description copied from class:DataTypeGets the value in the data value descriptor as a int. Throws an exception if the data value is not receivable as a int.- Specified by:
getObjectin interfaceDataValueDescriptor- Overrides:
getObjectin classDataType- Returns:
- The data value as a int.
- Throws:
StandardException- Thrown on error
-
getStream
Description copied from class:DataTypeGets the value in the data stream descriptor as an InputStream. Throws an exception if the data value is not receivable as a stream.- Specified by:
getStreamin interfaceDataValueDescriptor- Overrides:
getStreamin classDataType- Returns:
- The data value as an InputStream.
- Throws:
StandardException- Thrown on error- See Also:
-
getStreamWithDescriptor
Returns a descriptor for the input stream for this character data value.- Specified by:
getStreamWithDescriptorin interfaceStringDataValue- Returns:
- Nothing, throws exception.
- Throws:
StandardException- if the value isn't represented by a stream- See Also:
-
typeToBigDecimal
CHAR/VARCHAR/LONG VARCHAR implementation. Convert to a BigDecimal using getString.- Specified by:
typeToBigDecimalin interfaceDataValueDescriptor- Overrides:
typeToBigDecimalin classDataType- Returns:
- Types.CHAR for String conversion through getString Types.DECIMAL for BigDecimal through getObject or Types.BIGINT for long conversion through getLong
- Throws:
StandardException- Conversion is not possible
-
getLength
Description copied from interface:DataValueDescriptorGets the length of the data value. The meaning of this is implementation-dependent. For string types, it is the number of characters in the string. For numeric types, it is the number of bytes used to store the number. This is the actual length of this value, not the length of the type it was defined as. For example, a VARCHAR value may be shorter than the declared VARCHAR (maximum) length.- Specified by:
getLengthin interfaceDataValueDescriptor- Returns:
- The length of the data value
- Throws:
StandardException- Thrown on error
-
throwStreamingIOException
Wraps anIOExceptionin aStandardExceptionthen throws the wrapping exception.- Parameters:
ioe- theIOExceptionto wrap- Throws:
StandardException- the wrapping exception
-
getTypeName
Description copied from interface:DataValueDescriptorGet the SQL name of the datatype- Specified by:
getTypeNamein interfaceDataValueDescriptor- Returns:
- The SQL name of the datatype
-
getString
If possible, use getCharArray() if you don't really need a string. getString() will cause an extra char array to be allocated when it calls the the String() constructor (the first time through), so may be cheaper to use getCharArray().- Specified by:
getStringin interfaceDataValueDescriptor- Returns:
- The data value as a String.
- Throws:
StandardException- Thrown on error
-
getCharArray
Get a char array. Typically, this is a simple getter that is cheaper than getString() because we always need to create a char array when doing I/O. Use this instead of getString() where reasonable.WARNING: may return a character array that has spare characters at the end. MUST be used in conjunction with getLength() to be safe.
- Specified by:
getCharArrayin interfaceStringDataValue- Throws:
StandardException- Thrown on error
-
getTypeFormatId
public int getTypeFormatId()Return my format identifier.- Specified by:
getTypeFormatIdin interfaceTypedFormat- Returns:
- The identifier. (A UUID stuffed in an array of 16 bytes).
- See Also:
-
isNull
-
writeExternal
Writes a non-Clob data value to the modified UTF-8 format used by Derby. The maximum stored size is based upon the UTF format used to stored the String. The format consists of a two byte length field and a maximum number of three bytes for each character.
This puts an upper limit on the length of a stored String. The maximum stored length is 65535, these leads to the worse case of a maximum string length of 21844 ((65535 - 2) / 3).
Strings with stored length longer than 64K is handled with the following format: (1) 2 byte length: will be assigned 0. (2) UTF formated string data. (3) terminate the string with the following 3 bytes: first byte is: +---+---+---+---+---+---+---+---+ | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | +---+---+---+---+---+---+---+---+ second byte is: +---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---+---+---+---+---+---+---+---+ third byte is: +---+---+---+---+---+---+---+---+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---+---+---+---+---+---+---+---+ The UTF format: Writes a string to the underlying output stream using UTF-8 encoding in a machine-independent manner.First, two bytes are written to the output stream as if by the
writeShortmethod giving the number of bytes to follow. This value is the number of bytes actually written out, not the length of the string. Following the length, each character of the string is output, in sequence, using the UTF-8 encoding for the character.- Specified by:
writeExternalin interfaceExternalizable- Throws:
IOException- if an I/O error occurs.- Since:
- JDK1.0
- See Also:
-
writeUTF
private final void writeUTF(ObjectOutput out, int strLen, boolean isRaw, Reader characterReader) throws IOException Writes the user data value to a stream in the modified UTF-8 format.- Parameters:
out- destination streamstrLen- string length of the valueisRaw-trueif the source israwData,falseif the source isvaluecharacterReader- Reader from _clobValue if it exists- Throws:
IOException- if writing to the destination stream fails
-
writeUTF
Write a single character to a stream in the modified UTF-8 format.- Parameters:
out- the destination streamc- the character to write- Throws:
IOException- if writing to the destination stream fails
-
writeClobUTF
Writes the header and the user data for a CLOB to the destination stream.- Parameters:
out- destination stream- Throws:
IOException- if writing to the destination stream fails
-
readExternalFromArray
Reads in a string from the specified data input stream. The string has been encoded using a modified UTF-8 format.The first two bytes are read as if by
readUnsignedShort. This value gives the number of following bytes that are in the encoded string, not the length of the resulting string. The following bytes are then interpreted as bytes encoding characters in the UTF-8 format and are converted into characters.This method blocks until all the bytes are read, the end of the stream is detected, or an exception is thrown.
- Specified by:
readExternalFromArrayin interfaceDataValueDescriptor- Overrides:
readExternalFromArrayin classDataType- Parameters:
in- a data input stream.- Throws:
EOFException- if the input stream reaches the end before all the bytes.IOException- if an I/O error occurs.UTFDataFormatException- if the bytes do not represent a valid UTF-8 encoding of a Unicode string.- See Also:
-
readExternalClobFromArray
Reads a CLOB from the source stream and materializes the value in a character array.- Parameters:
in- source streamcharLen- the char length of the value, or0if unknown- Throws:
IOException- if reading from the source fails
-
resetForMaterialization
private void resetForMaterialization()Resets state after materializing value from an array. -
readExternal
- Specified by:
readExternalin interfaceExternalizable- Throws:
IOException
-
readExternal
Restores the data value from the source stream, materializing the value in memory.- Parameters:
in- the source streamutflen- the byte length, or0if unknownknownStrLen- the char length, or0if unknown- Throws:
UTFDataFormatException- if an encoding error is detectedIOException- if reading the stream fails
-
growBy
protected int growBy()returns the reasonable minimum amount by which the array can grow . See readExternal. when we know that the array needs to grow by at least one byte, it is not performant to grow by just one byte instead this amount is used to provide a resonable growby size.- Returns:
- minimum reasonable growby size
-
restoreToNull
public void restoreToNull()Description copied from interface:StorableRestore this object to its (SQL)null value.- Specified by:
restoreToNullin interfaceStorable- See Also:
-
compare
public boolean compare(int op, DataValueDescriptor other, boolean orderedNulls, boolean unknownRV) throws StandardException Description copied from interface:DataValueDescriptorCompare this Orderable with a given Orderable for the purpose of qualification and sorting. The caller gets to determine how nulls should be treated - they can either be ordered values or unknown values.- Specified by:
comparein interfaceDataValueDescriptor- Overrides:
comparein classDataType- Parameters:
op- Orderable.ORDER_OP_EQUALS means do an = comparison. Orderable.ORDER_OP_LESSTHAN means compare this < other. Orderable.ORDER_OP_LESSOREQUALS means compare this <= other.other- The DataValueDescriptor to compare this one to.orderedNulls- True means to treat nulls as ordered values, that is, treat SQL null as equal to null, and less than all other values. False means to treat nulls as unknown values, that is, the result of any comparison with a null is the UNKNOWN truth value.unknownRV- The return value to use if the result of the comparison is the UNKNOWN truth value. In other words, if orderedNulls is false, and a null is involved in the comparison, return unknownRV. This parameter is not used orderedNulls is true.- Returns:
- true if the comparison is true (duh!)
- Throws:
StandardException- thrown on error
-
compare
Description copied from interface:DataValueDescriptorCompare this Orderable with a given Orderable for the purpose of index positioning. This method treats nulls as ordered values - that is, it treats SQL null as equal to null and greater than all other values.- Specified by:
comparein interfaceDataValueDescriptor- Parameters:
other- The Orderable to compare this one to.- Returns:
- <0 - this Orderable is less than other. 0 - this Orderable equals other. >0 - this Orderable is greater than other. The code should not explicitly look for -1, or 1.
- Throws:
StandardException- thrown on error
-
cloneHolder
Shallow clone a StreamStorable without objectifying. This is used to avoid unnecessary objectifying of a stream object. The only difference of this method from cloneValue is this method does not objectify a stream.- Specified by:
cloneHolderin interfaceDataValueDescriptor- Overrides:
cloneHolderin classDataType- Returns:
- A shallow clone.
-
cloneValue
Description copied from interface:DataValueDescriptorClone this DataValueDescriptor. Results in a new object that has the same value as this but can be modified independently.Even though the objects can be modified independently regardless of the value of
forceMaterialization, both the clone and the original may be dependent on the store state ifforceMaterializationis set tofalse. An example is if you need to access the value you just read usingcloneValueafter the current transaction has ended, or after the source result set has been closed.- Specified by:
cloneValuein interfaceDataValueDescriptor- Parameters:
forceMaterialization- any streams representing the data value will be materialized iftrue, the data value will be kept as a stream if possible iffalse- Returns:
- A clone of the
DataValueDescriptorwith the same initial value as this. - See Also:
-
getNewNull
Description copied from interface:DataValueDescriptorGet a new null value of the same type as this data value.- Specified by:
getNewNullin interfaceDataValueDescriptor- See Also:
-
getValue
Description copied from interface:StringDataValueGets either SQLChar/SQLVarchar/SQLLongvarchar/SQLClob(base classes) or CollatorSQLChar/CollatorSQLVarchar/CollatorSQLLongvarch/CollatorSQLClob (subclasses). Whether this method returns the base class or the subclass depends on the value of the RuleBasedCollator. If RuleBasedCollator is null, then the object returned would be baseclass otherwise it would be subcalss.- Specified by:
getValuein interfaceStringDataValue- See Also:
-
setValueFromResultSet
public final void setValueFromResultSet(ResultSet resultSet, int colNumber, boolean isNullable) throws SQLException Description copied from interface:DataValueDescriptorSet the value based on the value for the specified DataValueDescriptor from the specified ResultSet.- Specified by:
setValueFromResultSetin interfaceDataValueDescriptor- Parameters:
resultSet- The specified ResultSet.colNumber- The 1-based column # into the resultSet.isNullable- Whether or not the column is nullable (No need to call wasNull() if not)- Throws:
SQLException- Thrown on error- See Also:
-
setInto
public final void setInto(PreparedStatement ps, int position) throws SQLException, StandardException Set the value into a PreparedStatement.- Specified by:
setIntoin interfaceDataValueDescriptor- Overrides:
setIntoin classDataType- Throws:
SQLException- thrown by the PreparedStatement objectStandardException- thrown by me accessing my value.
-
setValue
Description copied from class:DataTypeSet the value of this DataValueDescriptor. At DataType level just throws an error lower classes will override- Specified by:
setValuein interfaceDataValueDescriptor- Specified by:
setValuein interfaceStringDataValue- Overrides:
setValuein classDataType- Parameters:
theValue- The Clob value to set this DataValueDescriptor to
-
setValue
Description copied from class:DataTypeSet the value of this DataValueDescriptor. At DataType level just throws an error lower classes will override- Specified by:
setValuein interfaceDataValueDescriptor- Overrides:
setValuein classDataType- Parameters:
theValue- The BigDecimal value to set this DataValueDescriptor to
-
setValue
Description copied from class:DataTypeSet the value. At DataType level just throws an error lower classes will override- Specified by:
setValuein interfaceDataValueDescriptor- Overrides:
setValuein classDataType- Parameters:
theValue- Contains the boolean value to set this to- Throws:
StandardException
-
setValue
Description copied from class:DataTypeSet the value of this DataValueDescriptor to the given int value At DataType level just throws an error lower classes will override- Specified by:
setValuein interfaceDataValueDescriptor- Overrides:
setValuein classDataType- Parameters:
theValue- The value to set this DataValueDescriptor to- Throws:
StandardException- Thrown on error
-
setValue
Description copied from class:DataTypeSet the value of this DataValueDescriptor to the given double value At DataType level just throws an error lower classes will override- Specified by:
setValuein interfaceDataValueDescriptor- Overrides:
setValuein classDataType- Parameters:
theValue- The value to set this DataValueDescriptor to- Throws:
StandardException- Thrown on error
-
setValue
Description copied from class:DataTypeSet the value of this DataValueDescriptor to the given float value At DataType level just throws an error lower classes will override- Specified by:
setValuein interfaceDataValueDescriptor- Overrides:
setValuein classDataType- Parameters:
theValue- The value to set this DataValueDescriptor to- Throws:
StandardException- Thrown on error
-
setValue
Description copied from class:DataTypeSet the value of this DataValueDescriptor to the given short value At DataType level just throws an error lower classes will override- Specified by:
setValuein interfaceDataValueDescriptor- Overrides:
setValuein classDataType- Parameters:
theValue- The value to set this DataValueDescriptor to- Throws:
StandardException- Thrown on error
-
setValue
Description copied from class:DataTypeSet the value of this DataValueDescriptor to the given long value At DataType level just throws an error lower classes will override- Specified by:
setValuein interfaceDataValueDescriptor- Overrides:
setValuein classDataType- Parameters:
theValue- The value to set this DataValueDescriptor to- Throws:
StandardException- Thrown on error
-
setValue
Description copied from class:DataTypeSet the value of this DataValueDescriptor to the given byte value At DataType level just throws an error lower classes will override- Specified by:
setValuein interfaceDataValueDescriptor- Overrides:
setValuein classDataType- Parameters:
theValue- The value to set this DataValueDescriptor to- Throws:
StandardException- Thrown on error
-
setValue
Description copied from class:DataTypeSet the value of this DataValueDescriptor. At DataType level just throws an error lower classes will override- Specified by:
setValuein interfaceDataValueDescriptor- Overrides:
setValuein classDataType- Parameters:
theValue- The byte value to set this DataValueDescriptor to- Throws:
StandardException
-
setBigDecimal
Only to be called when an application through JDBC is setting a SQLChar to a java.math.BigDecimal.- Specified by:
setBigDecimalin interfaceDataValueDescriptor- Overrides:
setBigDecimalin classDataType- Parameters:
bigDecimal- required to be a BigDecimal or null.- Throws:
StandardException
-
setValue
Description copied from class:DataTypeSet the value of this DataValueDescriptor. At DataType level just throws an error lower classes will override- Specified by:
setValuein interfaceDataValueDescriptor- Overrides:
setValuein classDataType- Parameters:
theValue- The Date value to set this DataValueDescriptor tocal- The time zone from the calendar is used to construct the database date value- Throws:
StandardException- Thrown on error
-
setValue
Description copied from class:DataTypeSet the value of this DataValueDescriptor. At DataType level just throws an error lower classes will override- Specified by:
setValuein interfaceDataValueDescriptor- Overrides:
setValuein classDataType- Parameters:
theValue- The Time value to set this DataValueDescriptor tocal- The time zone from the calendar is used to construct the database time value- Throws:
StandardException- Thrown on error
-
setValue
Description copied from class:DataTypeSet the value of this DataValueDescriptor. At DataType level just throws an error lower classes will override- Specified by:
setValuein interfaceDataValueDescriptor- Overrides:
setValuein classDataType- Parameters:
theValue- The Timestamp value to set this DataValueDescriptor tocal- The time zone from the calendar is used to construct the database timestamp value- Throws:
StandardException- Thrown on error
-
formatJDBCDate
-
formatJDBCTime
-
setValue
Set the value from the stream which is in the on-disk format.- Specified by:
setValuein interfaceDataValueDescriptor- Overrides:
setValuein classDataType- Parameters:
theStream- On disk format of the streamvalueLength- length of the logical value in characters, orDataValueDescriptor.UNKNOWN_LOGICAL_LENGTH
-
setObjectForCast
public void setObjectForCast(Object theValue, boolean instanceOfResultType, String resultTypeClassName) throws StandardException Allow any Java type to be cast to a character type using Object.toString.- Specified by:
setObjectForCastin interfaceDataValueDescriptor- Overrides:
setObjectForCastin classDataType- Parameters:
theValue- The new valueinstanceOfResultType- Whether or not the new value is an instanceof the result type.resultTypeClassName- The class name of the resulting (declared) type (for error messages only).- Throws:
StandardException- thrown on failure- See Also:
-
setFrom
Description copied from class:DataTypeSet the value of this DataValueDescriptor based on the value of the specified DataValueDescriptor.- Overrides:
setFromin classDataType- Parameters:
theValue- The DataValueDescriptor that holds the value to which we want to set this DataValueDescriptor's value.- Throws:
StandardException
-
normalize
public void normalize(DataTypeDescriptor desiredType, DataValueDescriptor source) throws StandardException Normalization method - this method may be called when putting a value into a SQLChar, for example, when inserting into a SQLChar column. See NormalizeResultSet in execution.- Specified by:
normalizein interfaceDataValueDescriptor- Overrides:
normalizein classDataType- Parameters:
desiredType- The type to normalize the source column tosource- The value to normalize- Throws:
StandardException- Thrown for null into non-nullable column, and for truncation error
-
normalize
protected void normalize(DataTypeDescriptor desiredType, String sourceValue) throws StandardException - Throws:
StandardException
-
hasNonBlankChars
- Throws:
StandardException
-
setWidth
public void setWidth(int desiredWidth, int desiredScale, boolean errorOnTrunc) throws StandardException Set the width of the to the desired value. Used when CASTing. Ideally we'd recycle normalize(), but the behavior is different (we issue a warning instead of an error, and we aren't interested in nullability).- Specified by:
setWidthin interfaceVariableSizeDataValue- Parameters:
desiredWidth- the desired lengthdesiredScale- the desired scale (ignored)errorOnTrunc- throw an error on truncation- Throws:
StandardException- Thrown when errorOnTrunc is true and when a shrink will truncate non-white spaces.
-
getUTF8Length
Get the number of bytes needed to represent a string in modified UTF-8, which is the encoding used bywriteExternal()andwriteUTF().- Parameters:
string- the string whose length to calculatestart- start index (inclusive)end- end index (exclusive)- Throws:
StandardException
-
equals
public BooleanDataValue equals(DataValueDescriptor left, DataValueDescriptor right) throws StandardException The = operator as called from the language module, as opposed to the storage module.- Specified by:
equalsin interfaceDataValueDescriptor- Overrides:
equalsin classDataType- Parameters:
left- The value on the left side of the =right- The value on the right side of the =- Returns:
- A SQL boolean value telling whether the two parameters are equal
- Throws:
StandardException- Thrown on error
-
notEquals
public BooleanDataValue notEquals(DataValueDescriptor left, DataValueDescriptor right) throws StandardException The <> operator as called from the language module, as opposed to the storage module.- Specified by:
notEqualsin interfaceDataValueDescriptor- Overrides:
notEqualsin classDataType- Parameters:
left- The value on the left side of the operatorright- The value on the right side of the operator- Returns:
- A SQL boolean value telling whether the two parameters are not equal
- Throws:
StandardException- Thrown on error
-
lessThan
public BooleanDataValue lessThan(DataValueDescriptor left, DataValueDescriptor right) throws StandardException The < operator as called from the language module, as opposed to the storage module.- Specified by:
lessThanin interfaceDataValueDescriptor- Overrides:
lessThanin classDataType- Parameters:
left- The value on the left side of the operatorright- The value on the right side of the operator- Returns:
- A SQL boolean value telling whether the first operand is less than the second operand
- Throws:
StandardException- Thrown on error
-
greaterThan
public BooleanDataValue greaterThan(DataValueDescriptor left, DataValueDescriptor right) throws StandardException The > operator as called from the language module, as opposed to the storage module.- Specified by:
greaterThanin interfaceDataValueDescriptor- Overrides:
greaterThanin classDataType- Parameters:
left- The value on the left side of the operatorright- The value on the right side of the operator- Returns:
- A SQL boolean value telling whether the first operand is greater than the second operand
- Throws:
StandardException- Thrown on error
-
lessOrEquals
public BooleanDataValue lessOrEquals(DataValueDescriptor left, DataValueDescriptor right) throws StandardException The <= operator as called from the language module, as opposed to the storage module.- Specified by:
lessOrEqualsin interfaceDataValueDescriptor- Overrides:
lessOrEqualsin classDataType- Parameters:
left- The value on the left side of the operatorright- The value on the right side of the operator- Returns:
- A SQL boolean value telling whether the first operand is less than or equal to the second operand
- Throws:
StandardException- Thrown on error
-
greaterOrEquals
public BooleanDataValue greaterOrEquals(DataValueDescriptor left, DataValueDescriptor right) throws StandardException The >= operator as called from the language module, as opposed to the storage module.- Specified by:
greaterOrEqualsin interfaceDataValueDescriptor- Overrides:
greaterOrEqualsin classDataType- Parameters:
left- The value on the left side of the operatorright- The value on the right side of the operator- Returns:
- A SQL boolean value telling whether the first operand is greater than or equal to the second operand
- Throws:
StandardException- Thrown on error
-
charLength
This method implements the char_length function for char.- Specified by:
charLengthin interfaceConcatableDataValue- Parameters:
result- The result of a previous call to this method, null if not called yet- Returns:
- A SQLInteger containing the length of the char value
- Throws:
StandardException- Thrown on error- See Also:
-
concatenate
public StringDataValue concatenate(StringDataValue leftOperand, StringDataValue rightOperand, StringDataValue result) throws StandardException Description copied from interface:StringDataValueThe SQL concatenation '||' operator.- Specified by:
concatenatein interfaceStringDataValue- Parameters:
leftOperand- String on the left hand side of '||'rightOperand- String on the right hand side of '||'result- The result of a previous call to this method, null if not called yet.- Returns:
- A ConcatableDataValue containing the result of the '||'
- Throws:
StandardException- Thrown on error- See Also:
-
like
This method implements the like function for char (with no escape value).- Specified by:
likein interfaceStringDataValue- Parameters:
pattern- The pattern to use- Returns:
- A SQL boolean value telling whether the first operand is like the second operand
- Throws:
StandardException- Thrown on error
-
like
public BooleanDataValue like(DataValueDescriptor pattern, DataValueDescriptor escape) throws StandardException This method implements the like function for char with an escape value.- Specified by:
likein interfaceStringDataValue- Parameters:
pattern- The pattern to useescape- the escape character- Returns:
- A SQL boolean value telling whether the first operand is like the second operand
- Throws:
StandardException- Thrown on error
-
locate
public NumberDataValue locate(StringDataValue searchFrom, NumberDataValue start, NumberDataValue result) throws StandardException This method implements the locate function for char.- Specified by:
locatein interfaceStringDataValue- Parameters:
searchFrom- - The string to search fromstart- - The position to search from in string searchFromresult- - The object to return Note: use getString() to get the string to search for.- Returns:
- The position in searchFrom the fist occurrence of this.value. 0 is returned if searchFrom does not contain this.value.
- Throws:
StandardException- Thrown on error
-
substring
public ConcatableDataValue substring(NumberDataValue start, NumberDataValue length, ConcatableDataValue result, int maxLen) throws StandardException The SQL substr() function.- Specified by:
substringin interfaceConcatableDataValue- Parameters:
start- Start of substrlength- Length of substrresult- The result of a previous call to this method, null if not called yet.maxLen- Maximum length of the result- Returns:
- A ConcatableDataValue containing the result of the substr()
- Throws:
StandardException- Thrown on error
-
trimInternal
This function public for testing purposes.- Parameters:
trimType- Type of trim (LEADING, TRAILING, or BOTH)trimChar- Character to trimsource- String from which to trim trimChar- Returns:
- A String containing the result of the trim.
-
ansiTrim
public StringDataValue ansiTrim(int trimType, StringDataValue trimChar, StringDataValue result) throws StandardException Description copied from interface:StringDataValueThe SQL Ansi trim function.- Specified by:
ansiTrimin interfaceStringDataValue- Parameters:
trimType- Type of trim (LEADING, TRAILING, or BOTH)trimChar- Character to trim from this SQLChar (may be null)result- The result of a previous call to this method, null if not called yet.- Returns:
- A StringDataValue containing the result of the trim.
- Throws:
StandardException
-
upper
Description copied from interface:StringDataValueConvert the string to upper case.- Specified by:
upperin interfaceStringDataValue- Parameters:
result- The result (reusable - allocate if null).- Returns:
- The string converted to upper case.
- Throws:
StandardException- Thrown on error- See Also:
-
lower
Description copied from interface:StringDataValueConvert the string to lower case.- Specified by:
lowerin interfaceStringDataValue- Parameters:
result- The result (reusable - allocate if null).- Returns:
- The string converted to lower case.
- Throws:
StandardException- Thrown on error- See Also:
-
typePrecedence
public int typePrecedence()Description copied from class:DataTypeEach built-in type in JSQL has a precedence. This precedence determines how to do type promotion when using binary operators. For example, float has a higher precedence than int, so when adding an int to a float, the result type is float. The precedence for some types is arbitrary. For example, it doesn't matter what the precedence of the boolean type is, since it can't be mixed with other types. But the precedence for the number types is critical. The SQL standard requires that exact numeric types be promoted to approximate numeric when one operator uses both. Also, the precedence is arranged so that one will not lose precision when promoting a type.- Specified by:
typePrecedencein interfaceDataValueDescriptor- Overrides:
typePrecedencein classDataType- Returns:
- The precedence of this type.
- See Also:
-
stringCompare
-
stringCompare
Compare two SQLChars.- Throws:
StandardException- Thrown on error
-
stringCompare
protected static int stringCompare(char[] op1, int leftlen, char[] op2, int rightlen) Compare two Strings using standard SQL semantics.- Parameters:
op1- The first Stringop2- The second String- Returns:
- -1 - op1 < op2 0 - op1 == op2 1 - op1 > op2
-
getCollationKey
This method gets called for the collation sensitive char classes ie CollatorSQLChar, CollatorSQLVarchar, CollatorSQLLongvarchar, CollatorSQLClob. These collation sensitive chars need to have the collation key in order to do string comparison. And the collation key is obtained using the Collator object that these classes already have.- Returns:
- CollationKey obtained using Collator on the string
- Throws:
StandardException
-
toString
-
hashCode
-
hashCodeForCollation
int hashCodeForCollation()Hash code implementation for collator sensitive subclasses. -
getNewVarchar
Get a SQLVarchar for a built-in string function.- Returns:
- a SQLVarchar.
- Throws:
StandardException- Thrown on error
-
setLocaleFinder
-
getLocale
- Throws:
StandardException- Thrown on error
-
getCollatorForCollation
- Throws:
StandardException
-
getLocaleFinder
-
estimateMemoryUsage
public int estimateMemoryUsage()Description copied from interface:DataValueDescriptorEstimate the memory usage in bytes of the data value and the overhead of the class.- Specified by:
estimateMemoryUsagein interfaceDataValueDescriptor- Returns:
- the estimated memory usage
-
copyState
-
copyState
private void copyState(String otherValue, char[] otherRawData, int otherRawLength, CollationKey otherCKey, InputStream otherStream, Clob otherClobValue, LocaleFinder otherLocaleFinder) -
getTraceString
Gets a trace representation for debugging.- Specified by:
getTraceStringin interfaceDataValueDescriptor- Overrides:
getTraceStringin classDataType- Returns:
- a trace representation of this SQL Type.
- Throws:
StandardException- if getting the data value fails.- See Also:
-
getStreamHeaderGenerator
Returns the default stream header generator for the string data types.- Specified by:
getStreamHeaderGeneratorin interfaceStringDataValue- Returns:
- A stream header generator.
- See Also:
-
setStreamHeaderFormat
Sets the mode for the database being accessed.- Specified by:
setStreamHeaderFormatin interfaceStringDataValue- Parameters:
inSoftUpgradeMode-trueif the database is being accessed in soft upgrade mode,falseif not, andnullif unknown
-
getClobLength
- Throws:
StandardException
-
rawGetClobLength
- Throws:
SQLException
-