diff --git a/lealone-db/src/main/java/org/lealone/db/Database.java b/lealone-db/src/main/java/org/lealone/db/Database.java index 6d5e33724..4a4a0810f 100644 --- a/lealone-db/src/main/java/org/lealone/db/Database.java +++ b/lealone-db/src/main/java/org/lealone/db/Database.java @@ -185,7 +185,7 @@ public class Database implements DataHandler, DbObject { private final TransactionEngine transactionEngine; private String fullName; - private String storageName; // 不使用原始的名称,按是用id替换数据库名 + private String storageName; // 不使用原始的名称,而是用id替换数据库名 public Database(int id, String name, Map parameters) { this.id = id; @@ -384,7 +384,6 @@ private void openMetaTable() { cols.add(new Column("SQL", Value.STRING)); data.tableName = "SYS"; data.id = 0; - data.temporary = false; data.persistData = persistent; data.persistIndexes = persistent; data.create = true; diff --git a/lealone-db/src/main/java/org/lealone/db/index/StandardPrimaryIndex.java b/lealone-db/src/main/java/org/lealone/db/index/StandardPrimaryIndex.java index b5ef1b8ea..9677b4f37 100644 --- a/lealone-db/src/main/java/org/lealone/db/index/StandardPrimaryIndex.java +++ b/lealone-db/src/main/java/org/lealone/db/index/StandardPrimaryIndex.java @@ -65,8 +65,8 @@ public StandardPrimaryIndex(Session session, StandardTable table) { } ValueDataType keyType = new ValueDataType(null, null, null); ValueDataType valueType = new ValueDataType(database.getCompareMode(), database, sortTypes); - // mapName = getMapName("table", table.getSchema().getName(), table.getName(), getId()); - mapName = getMapName("table", getId()); + mapName = StandardTable.getMapNameForTable(getId()); + Storage storage = database.getStorage(table.getStorageEngine()); TransactionEngine transactionEngine = database.getTransactionEngine(); // TODO处理内存表的情况!table.isPersistData() @@ -77,16 +77,6 @@ public StandardPrimaryIndex(Session session, StandardTable table) { lastKey = k == null ? 0 : k.getLong(); } - static String getMapName(Object... args) { - StringBuilder name = new StringBuilder(); - for (Object arg : args) { - if (name.length() > 0) - name.append(Constants.NAME_SEPARATOR); - name.append(arg.toString()); - } - return name.toString(); - } - @Override public String getCreateSQL() { return null; diff --git a/lealone-db/src/main/java/org/lealone/db/index/StandardSecondaryIndex.java b/lealone-db/src/main/java/org/lealone/db/index/StandardSecondaryIndex.java index bcc7d690b..0fbaf7674 100644 --- a/lealone-db/src/main/java/org/lealone/db/index/StandardSecondaryIndex.java +++ b/lealone-db/src/main/java/org/lealone/db/index/StandardSecondaryIndex.java @@ -50,9 +50,6 @@ public StandardSecondaryIndex(Session session, StandardTable table, int id, Stri // always store the row key in the map key, // even for unique indexes, as some of the index columns could be null keyColumns = columns.length + 1; - // mapName = StandardPrimaryIndex.getMapName("index", table.getSchema().getName(), table.getName(), indexName, - // getId()); - mapName = StandardPrimaryIndex.getMapName("index", getId()); int[] sortTypes = new int[keyColumns]; for (int i = 0; i < columns.length; i++) { sortTypes[i] = columns[i].sortType; @@ -60,6 +57,7 @@ public StandardSecondaryIndex(Session session, StandardTable table, int id, Stri sortTypes[keyColumns - 1] = SortOrder.ASCENDING; ValueDataType keyType = new ValueDataType(db.getCompareMode(), db, sortTypes); ValueDataType valueType = new ValueDataType(null, null, null); + mapName = StandardTable.getMapNameForIndex(getId()); Storage storage = database.getStorage(table.getStorageEngine()); TransactionEngine transactionEngine = database.getTransactionEngine(); diff --git a/lealone-db/src/main/java/org/lealone/db/table/CreateTableData.java b/lealone-db/src/main/java/org/lealone/db/table/CreateTableData.java index 6bae96417..c56b65b7e 100644 --- a/lealone-db/src/main/java/org/lealone/db/table/CreateTableData.java +++ b/lealone-db/src/main/java/org/lealone/db/table/CreateTableData.java @@ -83,8 +83,8 @@ public class CreateTableData { */ public boolean isHidden; - public boolean isMemoryTable() { - return !session.getDatabase().isPersistent() || isHidden || globalTemporary || temporary || !persistData - || id <= 0; - } + // public boolean isMemoryTable() { + // return !session.getDatabase().isPersistent() || isHidden || globalTemporary || temporary || !persistData + // || id <= 0; + // } } diff --git a/lealone-db/src/main/java/org/lealone/db/table/StandardTable.java b/lealone-db/src/main/java/org/lealone/db/table/StandardTable.java index 98f4b4790..18c2b7974 100644 --- a/lealone-db/src/main/java/org/lealone/db/table/StandardTable.java +++ b/lealone-db/src/main/java/org/lealone/db/table/StandardTable.java @@ -423,7 +423,7 @@ public Index addIndex(Session session, String indexName, int indexId, IndexColum index = createDelegateIndex(indexId, indexName, indexType, mainIndexColumn); } else { if (database.isStarting()) { - if (database.getStorage(storageEngine).hasMap("index." + indexId)) { + if (database.getStorage(storageEngine).hasMap(getMapNameForIndex(indexId))) { mainIndexColumn = -1; } } else if (primaryIndex.getRowCountMax() != 0) { @@ -816,4 +816,22 @@ public boolean containsGlobalUniqueIndex() { // public TransactionMap getRowVersionMap() { // return rowVersionMap; // } + + public static String getMapNameForTable(int id) { + return getMapName("table", id); + } + + public static String getMapNameForIndex(int id) { + return getMapName("index", id); + } + + private static String getMapName(Object... args) { + StringBuilder name = new StringBuilder(); + for (Object arg : args) { + if (name.length() > 0) + name.append(Constants.NAME_SEPARATOR); + name.append(arg.toString()); + } + return name.toString(); + } } diff --git a/lealone-test/src/test/java/org/lealone/test/sql/ddl/CreateDatabaseTest.java b/lealone-test/src/test/java/org/lealone/test/sql/ddl/CreateDatabaseTest.java index d4915138a..c25d30d23 100644 --- a/lealone-test/src/test/java/org/lealone/test/sql/ddl/CreateDatabaseTest.java +++ b/lealone-test/src/test/java/org/lealone/test/sql/ddl/CreateDatabaseTest.java @@ -27,7 +27,8 @@ public class CreateDatabaseTest extends SqlTestBase { @Test public void run() { executeUpdate("CREATE DATABASE IF NOT EXISTS CreateDatabaseTest1"); - executeUpdate("CREATE DATABASE IF NOT EXISTS CreateDatabaseTest2 TEMPORARY"); + executeUpdate("CREATE DATABASE IF NOT EXISTS CreateDatabaseTest2 WITH(OPTIMIZE_DISTINCT=true, PERSISTENT=false)"); + executeUpdate("CREATE DATABASE IF NOT EXISTS CreateDatabaseTest3 WITH()"); try { stmt.executeUpdate("CREATE DATABASE CreateDatabaseTest1"); diff --git a/lealone-test/src/test/java/org/lealone/test/sql/index/MainIndexColumnTest.java b/lealone-test/src/test/java/org/lealone/test/sql/index/MainIndexColumnTest.java new file mode 100644 index 000000000..b391f506b --- /dev/null +++ b/lealone-test/src/test/java/org/lealone/test/sql/index/MainIndexColumnTest.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.lealone.test.sql.index; + +import org.junit.Test; +import org.lealone.test.sql.SqlTestBase; + +public class MainIndexColumnTest extends SqlTestBase { + + @Test + public void run() { + executeUpdate("drop table IF EXISTS MainIndexColumnTest CASCADE"); + executeUpdate("create table IF NOT EXISTS MainIndexColumnTest(id int not null, name varchar(50))"); + + executeUpdate("CREATE PRIMARY KEY IF NOT EXISTS MainIndexColumnTest_id ON MainIndexColumnTest(id)"); + + executeUpdate("insert into MainIndexColumnTest(id, name) values(10, 'a1')"); + executeUpdate("insert into MainIndexColumnTest(id, name) values(20, 'b1')"); + executeUpdate("insert into MainIndexColumnTest(id, name) values(30, 'a2')"); + + sql = "select * from MainIndexColumnTest"; + printResultSet(); + } + +}