Unverified 提交 46ac2ec7 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov 提交者: GitHub

Merge pull request #1714 from katzyn/value

Assorted changes
...@@ -21,6 +21,12 @@ Change Log ...@@ -21,6 +21,12 @@ Change Log
<h2>Next Version (unreleased)</h2> <h2>Next Version (unreleased)</h2>
<ul> <ul>
<li>Issue #1715: Postgres mode: Domain "regproc" already exists
</li>
<li>PR #1714: Assorted changes
</li>
<li>PR #1713: Remove DataType.defaultDisplaySize and fix display size in TypeInfo
</li>
<li>PR #1711: Add QUALIFY clause to SELECT command <li>PR #1711: Add QUALIFY clause to SELECT command
</li> </li>
<li>Issue #1708: CREATE TABLE AS doesn't support column lists without data types <li>Issue #1708: CREATE TABLE AS doesn't support column lists without data types
......
...@@ -279,12 +279,12 @@ public class Mode { ...@@ -279,12 +279,12 @@ public class Mode {
// MS SQL Server does not support client info properties. See // MS SQL Server does not support client info properties. See
// https://msdn.microsoft.com/en-Us/library/dd571296%28v=sql.110%29.aspx // https://msdn.microsoft.com/en-Us/library/dd571296%28v=sql.110%29.aspx
mode.supportedClientInfoPropertiesRegEx = null; mode.supportedClientInfoPropertiesRegEx = null;
DataType dt = DataType.createDecimal(19, 19, 4, 21, false, false); DataType dt = DataType.createNumeric(19, 4, false);
dt.type = Value.DECIMAL; dt.type = Value.DECIMAL;
dt.sqlType = Types.NUMERIC; dt.sqlType = Types.NUMERIC;
dt.name = "MONEY"; dt.name = "MONEY";
mode.typeByNameMap.put("MONEY", dt); mode.typeByNameMap.put("MONEY", dt);
dt = DataType.createDecimal(10, 10, 4, 12, false, false); dt = DataType.createNumeric(10, 4, false);
dt.type = Value.DECIMAL; dt.type = Value.DECIMAL;
dt.sqlType = Types.NUMERIC; dt.sqlType = Types.NUMERIC;
dt.name = "SMALLMONEY"; dt.name = "SMALLMONEY";
...@@ -348,7 +348,7 @@ public class Mode { ...@@ -348,7 +348,7 @@ public class Mode {
disallowedTypes.add("TINYINT"); disallowedTypes.add("TINYINT");
disallowedTypes.add("BLOB"); disallowedTypes.add("BLOB");
mode.disallowedTypes = disallowedTypes; mode.disallowedTypes = disallowedTypes;
dt = DataType.createDecimal(19, 19, 2, 21, false, false); dt = DataType.createNumeric(19, 2, false);
dt.type = Value.DECIMAL; dt.type = Value.DECIMAL;
dt.sqlType = Types.NUMERIC; dt.sqlType = Types.NUMERIC;
dt.name = "MONEY"; dt.name = "MONEY";
......
...@@ -15,7 +15,7 @@ import org.h2.table.ColumnResolver; ...@@ -15,7 +15,7 @@ import org.h2.table.ColumnResolver;
import org.h2.table.TableFilter; import org.h2.table.TableFilter;
import org.h2.value.TypeInfo; import org.h2.value.TypeInfo;
import org.h2.value.Value; import org.h2.value.Value;
import org.h2.value.ValueArray; import org.h2.value.ValueCollectionBase;
/** /**
* An expression is a operation, a value, or a function in a query. * An expression is a operation, a value, or a function in a query.
...@@ -370,7 +370,7 @@ public abstract class Expression { ...@@ -370,7 +370,7 @@ public abstract class Expression {
* @param value the value to extract columns from * @param value the value to extract columns from
* @return array of expression columns * @return array of expression columns
*/ */
protected static Expression[] getExpressionColumns(Session session, ValueArray value) { protected static Expression[] getExpressionColumns(Session session, ValueCollectionBase value) {
Value[] list = value.getList(); Value[] list = value.getList();
ExpressionColumn[] expr = new ExpressionColumn[list.length]; ExpressionColumn[] expr = new ExpressionColumn[list.length];
for (int i = 0, len = list.length; i < len; i++) { for (int i = 0, len = list.length; i < len; i++) {
......
...@@ -13,8 +13,8 @@ import org.h2.table.ColumnResolver; ...@@ -13,8 +13,8 @@ import org.h2.table.ColumnResolver;
import org.h2.table.TableFilter; import org.h2.table.TableFilter;
import org.h2.value.TypeInfo; import org.h2.value.TypeInfo;
import org.h2.value.Value; import org.h2.value.Value;
import org.h2.value.ValueArray;
import org.h2.value.ValueBoolean; import org.h2.value.ValueBoolean;
import org.h2.value.ValueCollectionBase;
import org.h2.value.ValueNull; import org.h2.value.ValueNull;
/** /**
...@@ -163,8 +163,9 @@ public class ValueExpression extends Expression { ...@@ -163,8 +163,9 @@ public class ValueExpression extends Expression {
@Override @Override
public Expression[] getExpressionColumns(Session session) { public Expression[] getExpressionColumns(Session session) {
if (getType().getValueType() == Value.ARRAY) { int valueType = getType().getValueType();
return getExpressionColumns(session, (ValueArray) getValue(session)); if (valueType == Value.ARRAY || valueType == Value.ROW) {
return getExpressionColumns(session, (ValueCollectionBase) getValue(session));
} }
return super.getExpressionColumns(session); return super.getExpressionColumns(session);
} }
......
...@@ -161,6 +161,7 @@ public class JavaFunction extends Expression implements FunctionCall { ...@@ -161,6 +161,7 @@ public class JavaFunction extends Expression implements FunctionCall {
ValueResultSet rs = getValueForColumnList(session, getArgs()); ValueResultSet rs = getValueForColumnList(session, getArgs());
return getExpressionColumns(session, rs.getResult()); return getExpressionColumns(session, rs.getResult());
case Value.ARRAY: case Value.ARRAY:
case Value.ROW:
return getExpressionColumns(session, (ValueArray) getValue(session)); return getExpressionColumns(session, (ValueArray) getValue(session));
} }
return super.getExpressionColumns(session); return super.getExpressionColumns(session);
......
...@@ -107,6 +107,7 @@ merge into pg_catalog.pg_type values( ...@@ -107,6 +107,7 @@ merge into pg_catalog.pg_type values(
null null
); );
drop domain if exists regproc cascade;
create domain regproc as varchar_ignorecase; create domain regproc as varchar_ignorecase;
create view pg_catalog.pg_class -- (oid, relname, relnamespace, relkind, relam, reltuples, reltablespace, relpages, relhasindex, relhasrules, relhasoids, relchecks, reltriggers) create view pg_catalog.pg_class -- (oid, relname, relnamespace, relkind, relam, reltuples, reltablespace, relpages, relhasindex, relhasrules, relhasoids, relchecks, reltriggers)
......
...@@ -456,8 +456,8 @@ public final class JTSUtils { ...@@ -456,8 +456,8 @@ public final class JTSUtils {
int d = sequence.getDimension(); int d = sequence.getDimension();
if (M_IS_SUPPORTED) { if (M_IS_SUPPORTED) {
d -= measures; d -= measures;
z = d > 2 ? sequence.getOrdinate(index, Z) : Double.NaN; z = d > 2 ? toCanonicalDouble(sequence.getOrdinate(index, Z)) : Double.NaN;
m = measures >= 1 ? sequence.getOrdinate(index, d) : Double.NaN; m = measures >= 1 ? toCanonicalDouble(sequence.getOrdinate(index, d)) : Double.NaN;
} else { } else {
z = d >= 3 ? toCanonicalDouble(sequence.getOrdinate(index, Z)) : Double.NaN; z = d >= 3 ? toCanonicalDouble(sequence.getOrdinate(index, Z)) : Double.NaN;
m = d >= 4 ? toCanonicalDouble(sequence.getOrdinate(index, M)) : Double.NaN; m = d >= 4 ? toCanonicalDouble(sequence.getOrdinate(index, M)) : Double.NaN;
......
...@@ -163,11 +163,6 @@ public class DataType { ...@@ -163,11 +163,6 @@ public class DataType {
*/ */
public boolean hidden; public boolean hidden;
/**
* The number of bytes required for an object.
*/
public int memory;
static { static {
Class<?> g; Class<?> g;
try { try {
...@@ -182,77 +177,52 @@ public class DataType { ...@@ -182,77 +177,52 @@ public class DataType {
dataType.defaultPrecision = dataType.maxPrecision = ValueNull.PRECISION; dataType.defaultPrecision = dataType.maxPrecision = ValueNull.PRECISION;
add(Value.NULL, Types.NULL, add(Value.NULL, Types.NULL,
dataType, dataType,
new String[]{"NULL"}, new String[]{"NULL"}
// the value is always in the cache
0
); );
add(Value.STRING, Types.VARCHAR, add(Value.STRING, Types.VARCHAR,
createString(true), createString(true),
new String[]{"VARCHAR", "CHARACTER VARYING", "VARCHAR2", "NVARCHAR", "NVARCHAR2", new String[]{"VARCHAR", "CHARACTER VARYING", "VARCHAR2", "NVARCHAR", "NVARCHAR2",
"VARCHAR_CASESENSITIVE", "TID"}, "VARCHAR_CASESENSITIVE", "TID"}
// 24 for ValueString, 24 for String
48
); );
add(Value.STRING, Types.LONGVARCHAR, add(Value.STRING, Types.LONGVARCHAR,
createString(true), createString(true),
new String[]{"LONGVARCHAR", "LONGNVARCHAR"}, new String[]{"LONGVARCHAR", "LONGNVARCHAR"}
48
); );
add(Value.STRING_FIXED, Types.CHAR, add(Value.STRING_FIXED, Types.CHAR,
createString(true), createString(true),
new String[]{"CHAR", "CHARACTER", "NCHAR"}, new String[]{"CHAR", "CHARACTER", "NCHAR"}
48
); );
add(Value.STRING_IGNORECASE, Types.VARCHAR, add(Value.STRING_IGNORECASE, Types.VARCHAR,
createString(false), createString(false),
new String[]{"VARCHAR_IGNORECASE"}, new String[]{"VARCHAR_IGNORECASE"}
48
); );
add(Value.BOOLEAN, Types.BOOLEAN, add(Value.BOOLEAN, Types.BOOLEAN,
createDecimal(ValueBoolean.PRECISION, ValueBoolean.PRECISION, createNumeric(ValueBoolean.PRECISION, 0, false),
0, ValueBoolean.DISPLAY_SIZE, false, false), new String[]{"BOOLEAN", "BIT", "BOOL"}
new String[]{"BOOLEAN", "BIT", "BOOL"},
// the value is always in the cache
0
); );
add(Value.BYTE, Types.TINYINT, add(Value.BYTE, Types.TINYINT,
createDecimal(ValueByte.PRECISION, ValueByte.PRECISION, 0, createNumeric(ValueByte.PRECISION, 0, false),
ValueByte.DISPLAY_SIZE, false, false), new String[]{"TINYINT"}
new String[]{"TINYINT"},
// the value is almost always in the cache
1
); );
add(Value.SHORT, Types.SMALLINT, add(Value.SHORT, Types.SMALLINT,
createDecimal(ValueShort.PRECISION, ValueShort.PRECISION, 0, createNumeric(ValueShort.PRECISION, 0, false),
ValueShort.DISPLAY_SIZE, false, false), new String[]{"SMALLINT", "YEAR", "INT2"}
new String[]{"SMALLINT", "YEAR", "INT2"},
// in many cases the value is in the cache
20
); );
add(Value.INT, Types.INTEGER, add(Value.INT, Types.INTEGER,
createDecimal(ValueInt.PRECISION, ValueInt.PRECISION, 0, createNumeric(ValueInt.PRECISION, 0, false),
ValueInt.DISPLAY_SIZE, false, false), new String[]{"INTEGER", "INT", "MEDIUMINT", "INT4", "SIGNED"}
new String[]{"INTEGER", "INT", "MEDIUMINT", "INT4", "SIGNED"},
// in many cases the value is in the cache
20
); );
add(Value.INT, Types.INTEGER, add(Value.INT, Types.INTEGER,
createDecimal(ValueInt.PRECISION, ValueInt.PRECISION, 0, createNumeric(ValueInt.PRECISION, 0, true),
ValueInt.DISPLAY_SIZE, false, true), new String[]{"SERIAL"}
new String[]{"SERIAL"},
20
); );
add(Value.LONG, Types.BIGINT, add(Value.LONG, Types.BIGINT,
createDecimal(ValueLong.PRECISION, ValueLong.PRECISION, 0, createNumeric(ValueLong.PRECISION, 0, false),
ValueLong.DISPLAY_SIZE, false, false), new String[]{"BIGINT", "INT8", "LONG"}
new String[]{"BIGINT", "INT8", "LONG"},
24
); );
add(Value.LONG, Types.BIGINT, add(Value.LONG, Types.BIGINT,
createDecimal(ValueLong.PRECISION, ValueLong.PRECISION, 0, createNumeric(ValueLong.PRECISION, 0, true),
ValueLong.DISPLAY_SIZE, false, true), new String[]{"IDENTITY", "BIGSERIAL"}
new String[]{"IDENTITY", "BIGSERIAL"},
24
); );
if (SysProperties.BIG_DECIMAL_IS_DECIMAL) { if (SysProperties.BIG_DECIMAL_IS_DECIMAL) {
addDecimal(); addDecimal();
...@@ -262,44 +232,32 @@ public class DataType { ...@@ -262,44 +232,32 @@ public class DataType {
addDecimal(); addDecimal();
} }
add(Value.FLOAT, Types.REAL, add(Value.FLOAT, Types.REAL,
createDecimal(ValueFloat.PRECISION, ValueFloat.PRECISION, createNumeric(ValueFloat.PRECISION, 0, false),
0, ValueFloat.DISPLAY_SIZE, false, false), new String[] {"REAL", "FLOAT4"}
new String[] {"REAL", "FLOAT4"},
24
); );
add(Value.DOUBLE, Types.DOUBLE, add(Value.DOUBLE, Types.DOUBLE,
createDecimal(ValueDouble.PRECISION, ValueDouble.PRECISION, createNumeric(ValueDouble.PRECISION, 0, false),
0, ValueDouble.DISPLAY_SIZE, false, false), new String[] { "DOUBLE", "DOUBLE PRECISION" }
new String[] { "DOUBLE", "DOUBLE PRECISION" },
24
); );
add(Value.DOUBLE, Types.FLOAT, add(Value.DOUBLE, Types.FLOAT,
createDecimal(ValueDouble.PRECISION, ValueDouble.PRECISION, createNumeric(ValueDouble.PRECISION, 0, false),
0, ValueDouble.DISPLAY_SIZE, false, false), new String[] {"FLOAT", "FLOAT8" }
new String[] {"FLOAT", "FLOAT8" },
24
); );
add(Value.TIME, Types.TIME, add(Value.TIME, Types.TIME,
createDate(ValueTime.MAXIMUM_PRECISION, ValueTime.DEFAULT_PRECISION, createDate(ValueTime.MAXIMUM_PRECISION, ValueTime.DEFAULT_PRECISION,
"TIME", true, ValueTime.DEFAULT_SCALE, ValueTime.MAXIMUM_SCALE), "TIME", true, ValueTime.DEFAULT_SCALE, ValueTime.MAXIMUM_SCALE),
new String[]{"TIME", "TIME WITHOUT TIME ZONE"}, new String[]{"TIME", "TIME WITHOUT TIME ZONE"}
// 24 for ValueTime, 32 for java.sql.Time
56
); );
add(Value.DATE, Types.DATE, add(Value.DATE, Types.DATE,
createDate(ValueDate.PRECISION, ValueDate.PRECISION, createDate(ValueDate.PRECISION, ValueDate.PRECISION,
"DATE", false, 0, 0), "DATE", false, 0, 0),
new String[]{"DATE"}, new String[]{"DATE"}
// 24 for ValueDate, 32 for java.sql.Date
56
); );
add(Value.TIMESTAMP, Types.TIMESTAMP, add(Value.TIMESTAMP, Types.TIMESTAMP,
createDate(ValueTimestamp.MAXIMUM_PRECISION, ValueTimestamp.DEFAULT_PRECISION, createDate(ValueTimestamp.MAXIMUM_PRECISION, ValueTimestamp.DEFAULT_PRECISION,
"TIMESTAMP", true, ValueTimestamp.DEFAULT_SCALE, ValueTimestamp.MAXIMUM_SCALE), "TIMESTAMP", true, ValueTimestamp.DEFAULT_SCALE, ValueTimestamp.MAXIMUM_SCALE),
new String[]{"TIMESTAMP", "TIMESTAMP WITHOUT TIME ZONE", new String[]{"TIMESTAMP", "TIMESTAMP WITHOUT TIME ZONE",
"DATETIME", "DATETIME2", "SMALLDATETIME"}, "DATETIME", "DATETIME2", "SMALLDATETIME"}
// 24 for ValueTimestamp, 32 for java.sql.Timestamp
56
); );
// 2014 is the value of Types.TIMESTAMP_WITH_TIMEZONE // 2014 is the value of Types.TIMESTAMP_WITH_TIMEZONE
// use the value instead of the reference because the code has to // use the value instead of the reference because the code has to
...@@ -309,24 +267,19 @@ public class DataType { ...@@ -309,24 +267,19 @@ public class DataType {
createDate(ValueTimestampTimeZone.MAXIMUM_PRECISION, ValueTimestampTimeZone.DEFAULT_PRECISION, createDate(ValueTimestampTimeZone.MAXIMUM_PRECISION, ValueTimestampTimeZone.DEFAULT_PRECISION,
"TIMESTAMP_TZ", true, ValueTimestampTimeZone.DEFAULT_SCALE, "TIMESTAMP_TZ", true, ValueTimestampTimeZone.DEFAULT_SCALE,
ValueTimestampTimeZone.MAXIMUM_SCALE), ValueTimestampTimeZone.MAXIMUM_SCALE),
new String[]{"TIMESTAMP WITH TIME ZONE"}, new String[]{"TIMESTAMP WITH TIME ZONE"}
// 26 for ValueTimestampTimeZone, 32 for java.sql.Timestamp
58
); );
add(Value.BYTES, Types.VARBINARY, add(Value.BYTES, Types.VARBINARY,
createString(false), createString(false),
new String[]{"VARBINARY", "BINARY VARYING"}, new String[]{"VARBINARY", "BINARY VARYING"}
32
); );
add(Value.BYTES, Types.BINARY, add(Value.BYTES, Types.BINARY,
createString(false), createString(false),
new String[]{"BINARY", "RAW", "BYTEA", "LONG RAW"}, new String[]{"BINARY", "RAW", "BYTEA", "LONG RAW"}
32
); );
add(Value.BYTES, Types.LONGVARBINARY, add(Value.BYTES, Types.LONGVARBINARY,
createString(false), createString(false),
new String[]{"LONGVARBINARY"}, new String[]{"LONGVARBINARY"}
32
); );
dataType = new DataType(); dataType = new DataType();
dataType.prefix = dataType.suffix = "'"; dataType.prefix = dataType.suffix = "'";
...@@ -334,55 +287,45 @@ public class DataType { ...@@ -334,55 +287,45 @@ public class DataType {
add(Value.UUID, Types.BINARY, add(Value.UUID, Types.BINARY,
createString(false), createString(false),
// UNIQUEIDENTIFIER is the MSSQL mode equivalent // UNIQUEIDENTIFIER is the MSSQL mode equivalent
new String[]{"UUID", "UNIQUEIDENTIFIER"}, new String[]{"UUID", "UNIQUEIDENTIFIER"}
32
); );
add(Value.JAVA_OBJECT, Types.OTHER, add(Value.JAVA_OBJECT, Types.OTHER,
createString(false), createString(false),
new String[]{"OTHER", "OBJECT", "JAVA_OBJECT"}, new String[]{"OTHER", "OBJECT", "JAVA_OBJECT"}
24
); );
add(Value.BLOB, Types.BLOB, add(Value.BLOB, Types.BLOB,
createLob(), createLob(),
new String[]{"BLOB", "BINARY LARGE OBJECT", "TINYBLOB", "MEDIUMBLOB", new String[]{"BLOB", "BINARY LARGE OBJECT", "TINYBLOB", "MEDIUMBLOB",
"LONGBLOB", "IMAGE", "OID"}, "LONGBLOB", "IMAGE", "OID"}
// 80 for ValueLob, 24 for String
104
); );
add(Value.CLOB, Types.CLOB, add(Value.CLOB, Types.CLOB,
createLob(), createLob(),
new String[]{"CLOB", "CHARACTER LARGE OBJECT", "TINYTEXT", "TEXT", "MEDIUMTEXT", new String[]{"CLOB", "CHARACTER LARGE OBJECT", "TINYTEXT", "TEXT", "MEDIUMTEXT",
"LONGTEXT", "NTEXT", "NCLOB"}, "LONGTEXT", "NTEXT", "NCLOB"}
// 80 for ValueLob, 24 for String
104
); );
add(Value.GEOMETRY, Types.OTHER, add(Value.GEOMETRY, Types.OTHER,
createGeometry(), createGeometry(),
new String[]{"GEOMETRY"}, new String[]{"GEOMETRY"}
32
); );
dataType = new DataType(); dataType = new DataType();
dataType.prefix = "ARRAY["; dataType.prefix = "ARRAY[";
dataType.suffix = "]"; dataType.suffix = "]";
add(Value.ARRAY, Types.ARRAY, add(Value.ARRAY, Types.ARRAY,
dataType, dataType,
new String[]{"ARRAY"}, new String[]{"ARRAY"}
32
); );
dataType = new DataType(); dataType = new DataType();
dataType.maxPrecision = dataType.defaultPrecision = Integer.MAX_VALUE; dataType.maxPrecision = dataType.defaultPrecision = Integer.MAX_VALUE;
add(Value.RESULT_SET, DataType.TYPE_RESULT_SET, add(Value.RESULT_SET, DataType.TYPE_RESULT_SET,
dataType, dataType,
new String[]{"RESULT_SET"}, new String[]{"RESULT_SET"}
400
); );
dataType = createString(false); dataType = createString(false);
dataType.supportsPrecision = false; dataType.supportsPrecision = false;
dataType.supportsScale = false; dataType.supportsScale = false;
add(Value.ENUM, Types.OTHER, add(Value.ENUM, Types.OTHER,
dataType, dataType,
new String[]{"ENUM"}, new String[]{"ENUM"}
48
); );
for (int i = Value.INTERVAL_YEAR; i <= Value.INTERVAL_MINUTE_TO_SECOND; i++) { for (int i = Value.INTERVAL_YEAR; i <= Value.INTERVAL_MINUTE_TO_SECOND; i++) {
addInterval(i); addInterval(i);
...@@ -399,24 +342,15 @@ public class DataType { ...@@ -399,24 +342,15 @@ public class DataType {
private static void addDecimal() { private static void addDecimal() {
add(Value.DECIMAL, Types.DECIMAL, add(Value.DECIMAL, Types.DECIMAL,
createDecimal(Integer.MAX_VALUE, createNumeric(Integer.MAX_VALUE, ValueDecimal.DEFAULT_PRECISION, ValueDecimal.DEFAULT_SCALE),
ValueDecimal.DEFAULT_PRECISION, new String[]{"DECIMAL", "DEC"}
ValueDecimal.DEFAULT_SCALE,
ValueDecimal.DEFAULT_DISPLAY_SIZE, true, false),
new String[]{"DECIMAL", "DEC"},
// 40 for ValueDecimal,
64
); );
} }
private static void addNumeric() { private static void addNumeric() {
add(Value.DECIMAL, Types.NUMERIC, add(Value.DECIMAL, Types.NUMERIC,
createDecimal(Integer.MAX_VALUE, createNumeric(Integer.MAX_VALUE, ValueDecimal.DEFAULT_PRECISION, ValueDecimal.DEFAULT_SCALE),
ValueDecimal.DEFAULT_PRECISION, new String[]{"NUMERIC", "NUMBER"}
ValueDecimal.DEFAULT_SCALE,
ValueDecimal.DEFAULT_DISPLAY_SIZE, true, false),
new String[]{"NUMERIC", "NUMBER"},
64
); );
} }
...@@ -433,15 +367,17 @@ public class DataType { ...@@ -433,15 +367,17 @@ public class DataType {
dataType.supportsScale = true; dataType.supportsScale = true;
dataType.defaultScale = ValueInterval.DEFAULT_SCALE; dataType.defaultScale = ValueInterval.DEFAULT_SCALE;
dataType.maxScale = ValueInterval.MAXIMUM_SCALE; dataType.maxScale = ValueInterval.MAXIMUM_SCALE;
dataType.params = "PRECISION,SCALE";
} else {
dataType.params = "PRECISION";
} }
add(type, Types.OTHER, dataType, add(type, Types.OTHER, dataType,
new String[]{("INTERVAL " + name).intern()}, new String[]{("INTERVAL " + name).intern()}
36
); );
} }
private static void add(int type, int sqlType, private static void add(int type, int sqlType,
DataType dataType, String[] names, int memory) { DataType dataType, String[] names) {
for (int i = 0; i < names.length; i++) { for (int i = 0; i < names.length; i++) {
DataType dt = new DataType(); DataType dt = new DataType();
dt.type = type; dt.type = type;
...@@ -461,7 +397,6 @@ public class DataType { ...@@ -461,7 +397,6 @@ public class DataType {
dt.defaultScale = dataType.defaultScale; dt.defaultScale = dataType.defaultScale;
dt.caseSensitive = dataType.caseSensitive; dt.caseSensitive = dataType.caseSensitive;
dt.hidden = i > 0; dt.hidden = i > 0;
dt.memory = memory;
for (DataType t2 : TYPES) { for (DataType t2 : TYPES) {
if (t2.sqlType == dt.sqlType) { if (t2.sqlType == dt.sqlType) {
dt.sqlTypePos++; dt.sqlTypePos++;
...@@ -475,32 +410,41 @@ public class DataType { ...@@ -475,32 +410,41 @@ public class DataType {
} }
} }
/**
* Create a width numeric data type without parameters.
*
* @param precision precision
* @param scale scale
* @param autoInc whether the data type is an auto-increment type
* @return data type
*/
public static DataType createNumeric(int precision, int scale, boolean autoInc) {
DataType dataType = new DataType();
dataType.defaultPrecision = dataType.maxPrecision = precision;
dataType.defaultScale = dataType.maxScale = dataType.minScale = scale;
dataType.decimal = true;
dataType.autoIncrement = autoInc;
return dataType;
}
/** /**
* Create a numeric data type. * Create a numeric data type.
* *
* @param maxPrecision maximum supported precision * @param maxPrecision maximum supported precision
* @param defaultPrecision default precision * @param defaultPrecision default precision
* @param defaultScale default scale * @param defaultScale default scale
* @param defaultDisplaySize default display size
* @param needsPrecisionAndScale where precision and scale are supported
* @param autoInc whether the data type is an auto-increment type
* @return data type * @return data type
*/ */
public static DataType createDecimal(int maxPrecision, public static DataType createNumeric(int maxPrecision, int defaultPrecision, int defaultScale) {
int defaultPrecision, int defaultScale, int defaultDisplaySize,
boolean needsPrecisionAndScale, boolean autoInc) {
DataType dataType = new DataType(); DataType dataType = new DataType();
dataType.maxPrecision = maxPrecision; dataType.maxPrecision = maxPrecision;
dataType.defaultPrecision = defaultPrecision; dataType.defaultPrecision = defaultPrecision;
dataType.defaultScale = defaultScale; dataType.defaultScale = defaultScale;
if (needsPrecisionAndScale) {
dataType.params = "PRECISION,SCALE"; dataType.params = "PRECISION,SCALE";
dataType.supportsPrecision = true; dataType.supportsPrecision = true;
dataType.supportsScale = true; dataType.supportsScale = true;
dataType.maxScale = maxPrecision; dataType.maxScale = maxPrecision;
}
dataType.decimal = true; dataType.decimal = true;
dataType.autoIncrement = autoInc;
return dataType; return dataType;
} }
...@@ -521,10 +465,13 @@ public class DataType { ...@@ -521,10 +465,13 @@ public class DataType {
dataType.prefix = prefix + " '"; dataType.prefix = prefix + " '";
dataType.suffix = "'"; dataType.suffix = "'";
dataType.maxPrecision = maxPrecision; dataType.maxPrecision = maxPrecision;
dataType.supportsScale = supportsScale;
dataType.maxScale = maxScale;
dataType.defaultPrecision = precision; dataType.defaultPrecision = precision;
if (supportsScale) {
dataType.params = "SCALE";
dataType.supportsScale = true;
dataType.maxScale = maxScale;
dataType.defaultScale = scale; dataType.defaultScale = scale;
}
return dataType; return dataType;
} }
......
...@@ -314,7 +314,11 @@ public abstract class Value extends VersionedValue { ...@@ -314,7 +314,11 @@ public abstract class Value extends VersionedValue {
* @return the memory used in bytes * @return the memory used in bytes
*/ */
public int getMemory() { public int getMemory() {
return DataType.getDataType(getValueType()).memory; /*
* Java 11 with -XX:-UseCompressedOops for all values up to ValueLong
* and ValueDouble.
*/
return 24;
} }
/** /**
......
...@@ -50,6 +50,12 @@ public class ValueBoolean extends Value { ...@@ -50,6 +50,12 @@ public class ValueBoolean extends Value {
return BOOLEAN; return BOOLEAN;
} }
@Override
public int getMemory() {
// Singleton TRUE and FALSE values
return 0;
}
@Override @Override
public StringBuilder getSQL(StringBuilder builder) { public StringBuilder getSQL(StringBuilder builder) {
return builder.append(getString()); return builder.append(getString());
......
...@@ -123,7 +123,7 @@ public abstract class ValueCollectionBase extends Value { ...@@ -123,7 +123,7 @@ public abstract class ValueCollectionBase extends Value {
@Override @Override
public int getMemory() { public int getMemory() {
int memory = 32; int memory = 72;
for (Value v : values) { for (Value v : values) {
memory += v.getMemory() + Constants.MEMORY_POINTER; memory += v.getMemory() + Constants.MEMORY_POINTER;
} }
......
...@@ -103,6 +103,11 @@ public class ValueEnumBase extends Value { ...@@ -103,6 +103,11 @@ public class ValueEnumBase extends Value {
return ENUM; return ENUM;
} }
@Override
public int getMemory() {
return 120;
}
@Override @Override
public int hashCode() { public int hashCode() {
int results = 31; int results = 31;
......
...@@ -171,6 +171,12 @@ public class ValueInterval extends Value { ...@@ -171,6 +171,12 @@ public class ValueInterval extends Value {
return valueType; return valueType;
} }
@Override
public int getMemory() {
// Java 11 with -XX:-UseCompressedOops
return 48;
}
@Override @Override
public Value convertScale(boolean onlyToSmallerScale, int targetScale) { public Value convertScale(boolean onlyToSmallerScale, int targetScale) {
if (targetScale >= MAXIMUM_SCALE) { if (targetScale >= MAXIMUM_SCALE) {
......
...@@ -183,9 +183,9 @@ public class ValueJavaObject extends ValueBytes { ...@@ -183,9 +183,9 @@ public class ValueJavaObject extends ValueBytes {
@Override @Override
public int getMemory() { public int getMemory() {
if (value == null) { if (value == null) {
return DataType.getDataType(getValueType()).memory; return 40;
} }
int mem = super.getMemory(); int mem = 40;
if (javaObject != null) { if (javaObject != null) {
mem *= 2; mem *= 2;
} }
......
...@@ -515,7 +515,12 @@ public class ValueLobDb extends Value { ...@@ -515,7 +515,12 @@ public class ValueLobDb extends Value {
@Override @Override
public int getMemory() { public int getMemory() {
if (small != null) { if (small != null) {
return small.length + 104; /*
* Java 11 with -XX:-UseCompressedOops
* 0 bytes: 120 bytes
* 1 byte: 128 bytes
*/
return small.length + 127;
} }
return 140; return 140;
} }
......
...@@ -63,6 +63,12 @@ public class ValueNull extends Value { ...@@ -63,6 +63,12 @@ public class ValueNull extends Value {
return NULL; return NULL;
} }
@Override
public int getMemory() {
// Singleton value
return 0;
}
@Override @Override
public String getString() { public String getString() {
return null; return null;
......
...@@ -106,6 +106,11 @@ public class ValueResultSet extends Value { ...@@ -106,6 +106,11 @@ public class ValueResultSet extends Value {
return RESULT_SET; return RESULT_SET;
} }
@Override
public int getMemory() {
return result.getRowCount() * result.getVisibleColumnCount() * 32 + 400;
}
@Override @Override
public String getString() { public String getString() {
StringBuilder buff = new StringBuilder("("); StringBuilder buff = new StringBuilder("(");
......
...@@ -69,7 +69,12 @@ public class ValueString extends Value { ...@@ -69,7 +69,12 @@ public class ValueString extends Value {
@Override @Override
public int getMemory() { public int getMemory() {
return value.length() * 2 + 48; /*
* Java 11 with -XX:-UseCompressedOops
* Empty string: 88 bytes
* 1 to 4 UTF-16 chars: 96 bytes
*/
return value.length() * 2 + 94;
} }
@Override @Override
......
...@@ -176,6 +176,11 @@ public class ValueTimestamp extends Value { ...@@ -176,6 +176,11 @@ public class ValueTimestamp extends Value {
return TIMESTAMP; return TIMESTAMP;
} }
@Override
public int getMemory() {
return 32;
}
@Override @Override
public String getString() { public String getString() {
StringBuilder buff = new StringBuilder(MAXIMUM_PRECISION); StringBuilder buff = new StringBuilder(MAXIMUM_PRECISION);
......
...@@ -168,6 +168,12 @@ public class ValueTimestampTimeZone extends Value { ...@@ -168,6 +168,12 @@ public class ValueTimestampTimeZone extends Value {
return TIMESTAMP_TZ; return TIMESTAMP_TZ;
} }
@Override
public int getMemory() {
// Java 11 with -XX:-UseCompressedOops
return 40;
}
@Override @Override
public String getString() { public String getString() {
StringBuilder builder = new StringBuilder(ValueTimestampTimeZone.MAXIMUM_PRECISION); StringBuilder builder = new StringBuilder(ValueTimestampTimeZone.MAXIMUM_PRECISION);
......
...@@ -136,6 +136,11 @@ public class ValueUuid extends Value { ...@@ -136,6 +136,11 @@ public class ValueUuid extends Value {
return TypeInfo.TYPE_UUID; return TypeInfo.TYPE_UUID;
} }
@Override
public int getMemory() {
return 32;
}
@Override @Override
public int getValueType() { public int getValueType() {
return UUID; return UUID;
......
...@@ -637,7 +637,7 @@ public class TestMVTableEngine extends TestDb { ...@@ -637,7 +637,7 @@ public class TestMVTableEngine extends TestDb {
String readCount = plan.substring(plan.indexOf("reads: ")); String readCount = plan.substring(plan.indexOf("reads: "));
readCount = readCount.substring("reads: ".length(), readCount.indexOf('\n')); readCount = readCount.substring("reads: ".length(), readCount.indexOf('\n'));
int rc = Integer.parseInt(readCount); int rc = Integer.parseInt(readCount);
assertTrue(plan, rc >= 60 && rc <= 70); assertTrue(plan, rc >= 60 && rc <= 80);
// assertTrue(plan, rc >= 1000 && rc <= 1200); // assertTrue(plan, rc >= 1000 && rc <= 1200);
conn.close(); conn.close();
} }
......
...@@ -806,4 +806,4 @@ econd irst bcef ordinality nord unnest ...@@ -806,4 +806,4 @@ econd irst bcef ordinality nord unnest
analyst occupation distributive josaph aor engineer sajeewa isuru randil kevin doctor businessman artist ashan analyst occupation distributive josaph aor engineer sajeewa isuru randil kevin doctor businessman artist ashan
corrupts splitted disruption unintentional octets preconditions predicates subq objectweb insn opcodes corrupts splitted disruption unintentional octets preconditions predicates subq objectweb insn opcodes
preserves masking holder unboxing avert iae transformed subtle reevaluate exclusions subclause ftbl rgr preserves masking holder unboxing avert iae transformed subtle reevaluate exclusions subclause ftbl rgr
presorted inclusion contexts aax mwd percentile cont interpolate mwa hypothetical presorted inclusion contexts aax mwd percentile cont interpolate mwa hypothetical regproc
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论