提交 6186516b authored 作者: Andrei Tokar's avatar Andrei Tokar

Merge remote-tracking branch 'h2database/master' into batch-append

......@@ -651,10 +651,9 @@ public class Parser {
for (int i = 0;; i++) {
Column column = parseColumnForTable("C" + i, true);
list.add(column);
if (readIf(")")) {
if (!readIfMore(true)) {
break;
}
read(",");
}
}
read("AS");
......@@ -3302,20 +3301,17 @@ public class Parser {
r = new ExpressionList(new Expression[0]);
} else {
r = readExpression();
if (readIf(",")) {
if (readIfMore(true)) {
ArrayList<Expression> list = Utils.newSmallArrayList();
list.add(r);
while (!readIf(")")) {
r = readExpression();
list.add(r);
if (!readIf(",")) {
read(")");
if (!readIfMore(true)) {
break;
}
}
r = new ExpressionList(list.toArray(new Expression[0]));
} else {
read(")");
}
}
break;
......@@ -5770,10 +5766,9 @@ public class Parser {
readIfEqualOrTo();
Set command = new Set(session, SetTypes.SCHEMA_SEARCH_PATH);
ArrayList<String> list = Utils.newSmallArrayList();
list.add(readAliasIdentifier());
while (readIf(",")) {
do {
list.add(readAliasIdentifier());
}
} while (readIf(","));
command.setStringArray(list.toArray(new String[0]));
return command;
} else if (readIf("JAVA_OBJECT_SERIALIZER")) {
......@@ -5836,11 +5831,10 @@ public class Parser {
}
private Set parseSetBinaryCollation() {
Set command = new Set(session, SetTypes.BINARY_COLLATION);
String name = readAliasIdentifier();
command.setString(name);
if (equalsToken(name, CompareMode.UNSIGNED) ||
equalsToken(name, CompareMode.SIGNED)) {
if (equalsToken(name, CompareMode.UNSIGNED) || equalsToken(name, CompareMode.SIGNED)) {
Set command = new Set(session, SetTypes.BINARY_COLLATION);
command.setString(name);
return command;
}
throw DbException.getInvalidValueException("BINARY_COLLATION", name);
......
......@@ -17,6 +17,7 @@ import org.h2.table.Column;
import org.h2.table.Table;
import org.h2.table.TableType;
import org.h2.util.StatementBuilder;
import org.h2.value.DataType;
import org.h2.value.Value;
import org.h2.value.ValueInt;
import org.h2.value.ValueNull;
......@@ -104,8 +105,7 @@ public class Analyze extends DefineCommand {
StatementBuilder buff = new StatementBuilder("SELECT ");
for (Column col : columns) {
buff.appendExceptFirst(", ");
int type = col.getType();
if (type == Value.BLOB || type == Value.CLOB) {
if (DataType.isLargeObject(col.getType())) {
// can not index LOB columns, so calculating
// the selectivity is not required
buff.append("MAX(NULL)");
......
......@@ -7,7 +7,6 @@ package org.h2.engine;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
......@@ -50,6 +49,7 @@ import org.h2.util.ColumnNamerConfiguration;
import org.h2.util.CurrentTimestamp;
import org.h2.util.SmallLRUCache;
import org.h2.util.Utils;
import org.h2.value.DataType;
import org.h2.value.Value;
import org.h2.value.ValueArray;
import org.h2.value.ValueLong;
......@@ -129,8 +129,7 @@ public class Session extends SessionWithState implements TransactionStore.Rollba
private SmallLRUCache<String, Command> queryCache;
private long modificationMetaID = -1;
private SubQueryInfo subQueryInfo;
private int parsingView;
private final Deque<String> viewNameStack = new ArrayDeque<>();
private ArrayDeque<String> viewNameStack;
private int preparingQueryExpression;
private volatile SmallLRUCache<Object, ViewIndex> viewIndexCache;
private HashMap<Object, ViewIndex> subQueryIndexCache;
......@@ -244,26 +243,23 @@ public class Session extends SessionWithState implements TransactionStore.Rollba
* name of the view
*/
public void setParsingCreateView(boolean parsingView, String viewName) {
// It can be recursive, thus implemented as counter.
this.parsingView += parsingView ? 1 : -1;
assert this.parsingView >= 0;
if (viewNameStack == null) {
viewNameStack = new ArrayDeque<>(3);
}
if (parsingView) {
viewNameStack.push(viewName);
} else {
assert viewName.equals(viewNameStack.peek());
viewNameStack.pop();
String name = viewNameStack.pop();
assert viewName.equals(name);
}
}
public String getParsingCreateViewName() {
if (viewNameStack.isEmpty()) {
return null;
}
return viewNameStack.peek();
return viewNameStack != null ? viewNameStack.peek() : null;
}
public boolean isParsingCreateView() {
assert parsingView >= 0;
return parsingView != 0;
return viewNameStack != null && !viewNameStack.isEmpty();
}
/**
......@@ -1701,7 +1697,7 @@ public class Session extends SessionWithState implements TransactionStore.Rollba
@Override
public void addTemporaryLob(Value v) {
if (v.getType() != Value.CLOB && v.getType() != Value.BLOB) {
if (!DataType.isLargeObject(v.getType())) {
return;
}
if (v.getTableId() == LobStorageFrontend.TABLE_RESULT
......
......@@ -15,6 +15,7 @@ import org.h2.message.DbException;
import org.h2.table.ColumnResolver;
import org.h2.table.TableFilter;
import org.h2.value.CompareMode;
import org.h2.value.DataType;
import org.h2.value.Value;
import org.h2.value.ValueBoolean;
import org.h2.value.ValueNull;
......@@ -198,9 +199,7 @@ public class CompareLike extends Condition {
// can't use an index
return;
}
int dataType = l.getColumn().getType();
if (dataType != Value.STRING && dataType != Value.STRING_IGNORECASE &&
dataType != Value.STRING_FIXED) {
if (!DataType.isStringType(l.getColumn().getType())) {
// column is not a varchar - can't use the index
return;
}
......
......@@ -23,6 +23,7 @@ import org.h2.table.Table;
import org.h2.table.TableFilter;
import org.h2.util.StatementBuilder;
import org.h2.util.StringUtils;
import org.h2.value.DataType;
import org.h2.value.Value;
import org.h2.value.ValueNull;
......@@ -72,8 +73,7 @@ public abstract class BaseIndex extends SchemaObjectBase implements Index {
*/
protected static void checkIndexColumnTypes(IndexColumn[] columns) {
for (IndexColumn c : columns) {
int type = c.column.getType();
if (type == Value.CLOB || type == Value.BLOB) {
if (DataType.isLargeObject(c.column.getType())) {
throw DbException.getUnsupportedException(
"Index on BLOB or CLOB column: " + c.column.getCreateSQL());
}
......
......@@ -23,6 +23,7 @@ import org.h2.table.Column;
import org.h2.table.IndexColumn;
import org.h2.table.Table;
import org.h2.util.TempFileDeleter;
import org.h2.value.DataType;
import org.h2.value.Value;
import org.h2.value.ValueNull;
......@@ -118,7 +119,7 @@ public class ResultTempTable implements ResultExternal {
for (int i = 0; i < expressions.length; i++) {
int type = expressions[i].getType();
Column col = new Column(COLUMN_NAME + i, type);
if (type == Value.CLOB || type == Value.BLOB) {
if (DataType.isLargeObject(type)) {
containsLob = true;
}
data.columns.add(col);
......
......@@ -13,6 +13,7 @@ import org.h2.engine.Session;
import org.h2.store.Data;
import org.h2.store.FileStore;
import org.h2.util.Utils;
import org.h2.value.DataType;
import org.h2.value.Value;
/**
......@@ -63,7 +64,7 @@ public class RowList {
buff.writeByte((byte) 0);
} else {
buff.writeByte((byte) 1);
if (v.getType() == Value.CLOB || v.getType() == Value.BLOB) {
if (DataType.isLargeObject(v.getType())) {
// need to keep a reference to temporary lobs,
// otherwise the temp file is deleted
if (v.getSmall() == null && v.getTableId() == 0) {
......
......@@ -37,6 +37,7 @@ import org.h2.store.LobStorageInterface;
import org.h2.util.IOUtils;
import org.h2.util.SmallLRUCache;
import org.h2.util.SmallMap;
import org.h2.value.DataType;
import org.h2.value.Transfer;
import org.h2.value.Value;
import org.h2.value.ValueLobDb;
......@@ -572,7 +573,7 @@ public class TcpServerThread implements Runnable {
}
private void writeValue(Value v) throws IOException {
if (v.getType() == Value.CLOB || v.getType() == Value.BLOB) {
if (DataType.isLargeObject(v.getType())) {
if (v instanceof ValueLobDb) {
ValueLobDb lob = (ValueLobDb) v;
if (lob.isStored()) {
......
......@@ -502,7 +502,12 @@ public class Column {
if (originalSQL != null) {
buff.append(originalSQL);
} else {
buff.append(DataType.getDataType(type).name);
DataType dataType = DataType.getDataType(type);
if (type == Value.TIMESTAMP_TZ) {
buff.append("TIMESTAMP");
} else {
buff.append(dataType.name);
}
switch (type) {
case Value.DECIMAL:
buff.append('(').append(precision).append(", ").append(scale).append(')');
......@@ -525,6 +530,16 @@ public class Column {
buff.append('(').append(precision).append(')');
}
break;
case Value.TIME:
case Value.TIMESTAMP:
case Value.TIMESTAMP_TZ:
if (scale != dataType.defaultScale) {
buff.append('(').append(scale).append(')');
}
if (type == Value.TIMESTAMP_TZ) {
buff.append(" WITH TIME ZONE");
}
break;
default:
}
}
......
......@@ -420,7 +420,7 @@ public class SourceCompiler {
final BufferedReader reader = new BufferedReader(new StringReader(output));
try {
for (String line; (line = reader.readLine()) != null;) {
if (line.endsWith("warning")) {
if (line.endsWith("warning") || line.endsWith("warnings")) {
// ignore summary line
} else if (line.startsWith("Note:")
|| line.startsWith("warning:")) {
......
......@@ -99,3 +99,30 @@ select cast('000102030405060708090a0b0c0d0e0f' as uuid);
select -cast(0 as double);
>> 0.0
SELECT * FROM (SELECT CAST('11:11:11.123456789' AS TIME));
>> 11:11:11
SELECT * FROM (SELECT CAST('11:11:11.123456789' AS TIME(0)));
>> 11:11:11
SELECT * FROM (SELECT CAST('11:11:11.123456789' AS TIME(9)));
>> 11:11:11.123456789
SELECT * FROM (SELECT CAST('2000-01-01 11:11:11.123456789' AS TIMESTAMP));
>> 2000-01-01 11:11:11.123457
SELECT * FROM (SELECT CAST('2000-01-01 11:11:11.123456789' AS TIMESTAMP(0)));
>> 2000-01-01 11:11:11
SELECT * FROM (SELECT CAST('2000-01-01 11:11:11.123456789' AS TIMESTAMP(9)));
>> 2000-01-01 11:11:11.123456789
SELECT * FROM (SELECT CAST('2000-01-01 11:11:11.123456789Z' AS TIMESTAMP WITH TIME ZONE));
>> 2000-01-01 11:11:11.123457+00
SELECT * FROM (SELECT CAST('2000-01-01 11:11:11.123456789Z' AS TIMESTAMP(0) WITH TIME ZONE));
>> 2000-01-01 11:11:11+00
SELECT * FROM (SELECT CAST('2000-01-01 11:11:11.123456789Z' AS TIMESTAMP(9) WITH TIME ZONE));
>> 2000-01-01 11:11:11.123456789+00
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论