Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
cceb5a12
提交
cceb5a12
authored
10月 09, 2013
作者:
noelgrandin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Issue 510: Make org.h2.bnf public for consumption by external projects, patch by Nicolas Fortin
上级
5da851fe
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
20 个修改的文件
包含
1193 行增加
和
623 行删除
+1193
-623
help.csv
h2/src/docsrc/help/help.csv
+4
-3
changelog.html
h2/src/docsrc/html/changelog.html
+1
-0
MANIFEST.MF
h2/src/main/META-INF/MANIFEST.MF
+3
-1
Bnf.java
h2/src/main/org/h2/bnf/Bnf.java
+2
-1
RuleElement.java
h2/src/main/org/h2/bnf/RuleElement.java
+2
-2
RuleList.java
h2/src/main/org/h2/bnf/RuleList.java
+2
-2
RuleOptional.java
h2/src/main/org/h2/bnf/RuleOptional.java
+2
-2
RuleRepeat.java
h2/src/main/org/h2/bnf/RuleRepeat.java
+2
-2
Sentence.java
h2/src/main/org/h2/bnf/Sentence.java
+7
-7
DbColumn.java
h2/src/main/org/h2/bnf/context/DbColumn.java
+83
-0
DbContents.java
h2/src/main/org/h2/bnf/context/DbContents.java
+281
-246
DbContextRule.java
h2/src/main/org/h2/bnf/context/DbContextRule.java
+319
-255
DbProcedure.java
h2/src/main/org/h2/bnf/context/DbProcedure.java
+95
-0
DbSchema.java
h2/src/main/org/h2/bnf/context/DbSchema.java
+157
-0
DbTableOrView.java
h2/src/main/org/h2/bnf/context/DbTableOrView.java
+106
-71
help.csv
h2/src/main/org/h2/res/help.csv
+2
-2
WebApp.java
h2/src/main/org/h2/server/web/WebApp.java
+33
-29
WebSession.java
h2/src/main/org/h2/server/web/WebSession.java
+4
-0
TestAll.java
h2/src/test/org/h2/test/TestAll.java
+2
-0
TestBnf.java
h2/src/test/org/h2/test/unit/TestBnf.java
+86
-0
没有找到文件。
h2/src/docsrc/help/help.csv
浏览文件 @
cceb5a12
...
@@ -489,7 +489,7 @@ CREATE DOMAIN EMAIL AS VARCHAR(255) CHECK (POSITION('@', VALUE) > 1)
...
@@ -489,7 +489,7 @@ CREATE DOMAIN EMAIL AS VARCHAR(255) CHECK (POSITION('@', VALUE) > 1)
"Commands (DDL)","CREATE INDEX","
"Commands (DDL)","CREATE INDEX","
CREATE
CREATE
{ [ UNIQUE ] [ HASH ] INDEX [ [ IF NOT EXISTS ] newIndexName ]
{ [ UNIQUE ] [ HASH ]
[ SPATIAL]
INDEX [ [ IF NOT EXISTS ] newIndexName ]
| PRIMARY KEY [ HASH ] }
| PRIMARY KEY [ HASH ] }
ON tableName ( indexColumn [,...] )
ON tableName ( indexColumn [,...] )
","
","
...
@@ -500,6 +500,7 @@ Hash indexes are meant for in-memory databases and memory tables (CREATE MEMORY
...
@@ -500,6 +500,7 @@ Hash indexes are meant for in-memory databases and memory tables (CREATE MEMORY
For other tables, or if the index contains multiple columns, the HASH keyword is ignored.
For other tables, or if the index contains multiple columns, the HASH keyword is ignored.
Hash indexes can only test for equality, and do not support range queries (similar to a hash table).
Hash indexes can only test for equality, and do not support range queries (similar to a hash table).
Non-unique keys are supported.
Non-unique keys are supported.
Spatial indexes are supported only on Geometry columns.
","
","
CREATE INDEX IDXNAME ON TEST(NAME)
CREATE INDEX IDXNAME ON TEST(NAME)
"
"
...
@@ -1726,9 +1727,9 @@ multiple lines long.
...
@@ -1726,9 +1727,9 @@ multiple lines long.
"
"
"Other Grammar","Compare","
"Other Grammar","Compare","
<> | <= | >= | = | < | > | !=
<> | <= | >= | = | < | > | !=
| &&
","
","
Comparison operator. The operator != is the same as <>.
Comparison operator. The operator != is the same as <>.
&& means overlapping, can only be used with geometry types.
","
","
<>
<>
"
"
...
...
h2/src/docsrc/html/changelog.html
浏览文件 @
cceb5a12
...
@@ -80,6 +80,7 @@ Change Log
...
@@ -80,6 +80,7 @@ Change Log
</li><li>
Make org.h2.util.ScriptReader throw a better exception when handling broken scripts which generate
</li><li>
Make org.h2.util.ScriptReader throw a better exception when handling broken scripts which generate
extremely large statements.
extremely large statements.
</li><li>
Fix bug with ALLOW_LITERALS=NONE, where the periodic analyze table on insert would throw an exception.
</li><li>
Fix bug with ALLOW_LITERALS=NONE, where the periodic analyze table on insert would throw an exception.
</li><li>
Issue 510: Make org.h2.bnf public for consumption by external projects, patch by Nicolas Fortin
</li></ul>
</li></ul>
<h2>
Version 1.3.173 (2013-07-28)
</h2>
<h2>
Version 1.3.173 (2013-07-28)
</h2>
...
...
h2/src/main/META-INF/MANIFEST.MF
浏览文件 @
cceb5a12
...
@@ -48,5 +48,7 @@ Export-Package: org.h2;version="${version}",
...
@@ -48,5 +48,7 @@ Export-Package: org.h2;version="${version}",
org.h2.jdbcx;version="${version}",
org.h2.jdbcx;version="${version}",
org.h2.tools;version="${version}",
org.h2.tools;version="${version}",
org.h2.util;version="${version}",
org.h2.util;version="${version}",
org.h2.value;version="${version}"
org.h2.value;version="${version}",
org.h2.bnf;version="${version}" ,
org.h2.bnf.context;version="${version}"
Premain-Class: org.h2.util.Profiler
Premain-Class: org.h2.util.Profiler
h2/src/main/org/h2/bnf/Bnf.java
浏览文件 @
cceb5a12
...
@@ -15,7 +15,8 @@ import java.sql.SQLException;
...
@@ -15,7 +15,8 @@ import java.sql.SQLException;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.StringTokenizer
;
import
java.util.StringTokenizer
;
import
org.h2.server.web.DbContextRule
;
import
org.h2.bnf.context.DbContextRule
;
import
org.h2.tools.Csv
;
import
org.h2.tools.Csv
;
import
org.h2.util.New
;
import
org.h2.util.New
;
import
org.h2.util.StringUtils
;
import
org.h2.util.StringUtils
;
...
...
h2/src/main/org/h2/bnf/RuleElement.java
浏览文件 @
cceb5a12
...
@@ -13,14 +13,14 @@ import org.h2.util.StringUtils;
...
@@ -13,14 +13,14 @@ import org.h2.util.StringUtils;
/**
/**
* A single terminal rule in a BNF object.
* A single terminal rule in a BNF object.
*/
*/
class
RuleElement
implements
Rule
{
public
class
RuleElement
implements
Rule
{
private
final
boolean
keyword
;
private
final
boolean
keyword
;
private
final
String
name
;
private
final
String
name
;
private
Rule
link
;
private
Rule
link
;
private
final
int
type
;
private
final
int
type
;
RuleElement
(
String
name
,
String
topic
)
{
public
RuleElement
(
String
name
,
String
topic
)
{
this
.
name
=
name
;
this
.
name
=
name
;
this
.
keyword
=
name
.
length
()
==
1
||
name
.
equals
(
StringUtils
.
toUpperEnglish
(
name
));
this
.
keyword
=
name
.
length
()
==
1
||
name
.
equals
(
StringUtils
.
toUpperEnglish
(
name
));
topic
=
StringUtils
.
toLowerEnglish
(
topic
);
topic
=
StringUtils
.
toLowerEnglish
(
topic
);
...
...
h2/src/main/org/h2/bnf/RuleList.java
浏览文件 @
cceb5a12
...
@@ -13,13 +13,13 @@ import org.h2.util.New;
...
@@ -13,13 +13,13 @@ import org.h2.util.New;
/**
/**
* Represents a sequence of BNF rules, or a list of alternative rules.
* Represents a sequence of BNF rules, or a list of alternative rules.
*/
*/
class
RuleList
implements
Rule
{
public
class
RuleList
implements
Rule
{
private
final
boolean
or
;
private
final
boolean
or
;
private
final
ArrayList
<
Rule
>
list
;
private
final
ArrayList
<
Rule
>
list
;
private
boolean
mapSet
;
private
boolean
mapSet
;
RuleList
(
Rule
first
,
Rule
next
,
boolean
or
)
{
public
RuleList
(
Rule
first
,
Rule
next
,
boolean
or
)
{
list
=
New
.
arrayList
();
list
=
New
.
arrayList
();
if
(
first
instanceof
RuleList
&&
((
RuleList
)
first
).
or
==
or
)
{
if
(
first
instanceof
RuleList
&&
((
RuleList
)
first
).
or
==
or
)
{
list
.
addAll
(((
RuleList
)
first
).
list
);
list
.
addAll
(((
RuleList
)
first
).
list
);
...
...
h2/src/main/org/h2/bnf/RuleOptional.java
浏览文件 @
cceb5a12
...
@@ -11,11 +11,11 @@ import java.util.HashMap;
...
@@ -11,11 +11,11 @@ import java.util.HashMap;
/**
/**
* Represents an optional BNF rule.
* Represents an optional BNF rule.
*/
*/
class
RuleOptional
implements
Rule
{
public
class
RuleOptional
implements
Rule
{
private
final
Rule
rule
;
private
final
Rule
rule
;
private
boolean
mapSet
;
private
boolean
mapSet
;
RuleOptional
(
Rule
rule
)
{
public
RuleOptional
(
Rule
rule
)
{
this
.
rule
=
rule
;
this
.
rule
=
rule
;
}
}
...
...
h2/src/main/org/h2/bnf/RuleRepeat.java
浏览文件 @
cceb5a12
...
@@ -11,12 +11,12 @@ import java.util.HashMap;
...
@@ -11,12 +11,12 @@ import java.util.HashMap;
/**
/**
* Represents a loop in a BNF object.
* Represents a loop in a BNF object.
*/
*/
class
RuleRepeat
implements
Rule
{
public
class
RuleRepeat
implements
Rule
{
private
final
Rule
rule
;
private
final
Rule
rule
;
private
final
boolean
comma
;
private
final
boolean
comma
;
RuleRepeat
(
Rule
rule
,
boolean
comma
)
{
public
RuleRepeat
(
Rule
rule
,
boolean
comma
)
{
this
.
rule
=
rule
;
this
.
rule
=
rule
;
this
.
comma
=
comma
;
this
.
comma
=
comma
;
}
}
...
...
h2/src/main/org/h2/bnf/Sentence.java
浏览文件 @
cceb5a12
...
@@ -9,8 +9,8 @@ package org.h2.bnf;
...
@@ -9,8 +9,8 @@ package org.h2.bnf;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.HashSet
;
import
org.h2.
server.web
.DbSchema
;
import
org.h2.
bnf.context
.DbSchema
;
import
org.h2.
server.web
.DbTableOrView
;
import
org.h2.
bnf.context
.DbTableOrView
;
import
org.h2.util.New
;
import
org.h2.util.New
;
import
org.h2.util.StringUtils
;
import
org.h2.util.StringUtils
;
...
@@ -29,12 +29,12 @@ public class Sentence {
...
@@ -29,12 +29,12 @@ public class Sentence {
/**
/**
* The token type for a keyword.
* The token type for a keyword.
*/
*/
static
final
int
KEYWORD
=
1
;
public
static
final
int
KEYWORD
=
1
;
/**
/**
* The token type for a function name.
* The token type for a function name.
*/
*/
static
final
int
FUNCTION
=
2
;
public
static
final
int
FUNCTION
=
2
;
private
static
final
long
MAX_PROCESSING_TIME
=
100
;
private
static
final
long
MAX_PROCESSING_TIME
=
100
;
...
@@ -63,7 +63,7 @@ public class Sentence {
...
@@ -63,7 +63,7 @@ public class Sentence {
/**
/**
* Start the timer to make sure processing doesn't take too long.
* Start the timer to make sure processing doesn't take too long.
*/
*/
void
start
()
{
public
void
start
()
{
stopAt
=
System
.
currentTimeMillis
()
+
MAX_PROCESSING_TIME
;
stopAt
=
System
.
currentTimeMillis
()
+
MAX_PROCESSING_TIME
;
}
}
...
@@ -72,7 +72,7 @@ public class Sentence {
...
@@ -72,7 +72,7 @@ public class Sentence {
* Processing auto-complete shouldn't take more than a few milliseconds.
* Processing auto-complete shouldn't take more than a few milliseconds.
* If processing is stopped, this methods throws an IllegalStateException
* If processing is stopped, this methods throws an IllegalStateException
*/
*/
void
stopIfRequired
()
{
public
void
stopIfRequired
()
{
if
(
System
.
currentTimeMillis
()
>
stopAt
)
{
if
(
System
.
currentTimeMillis
()
>
stopAt
)
{
throw
new
IllegalStateException
();
throw
new
IllegalStateException
();
}
}
...
@@ -214,7 +214,7 @@ public class Sentence {
...
@@ -214,7 +214,7 @@ public class Sentence {
*
*
* @return the next token map
* @return the next token map
*/
*/
HashMap
<
String
,
String
>
getNext
()
{
public
HashMap
<
String
,
String
>
getNext
()
{
return
next
;
return
next
;
}
}
...
...
h2/src/main/org/h2/
server/web
/DbColumn.java
→
h2/src/main/org/h2/
bnf/context
/DbColumn.java
浏览文件 @
cceb5a12
/*
/*
* Copyright 2004-2013 H2 Group. Multiple-Licensed under the H2 License,
* Copyright 2004-2013 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
* Initial Developer: H2 Group
*/
*/
package
org
.
h2
.
server
.
web
;
package
org
.
h2
.
bnf
.
context
;
import
java.sql.DatabaseMetaData
;
import
java.sql.DatabaseMetaData
;
import
java.sql.ResultSet
;
import
java.sql.ResultSet
;
import
java.sql.SQLException
;
import
java.sql.SQLException
;
/**
/**
* Keeps the meta data information of a column.
* Keeps the meta data information of a column.
* This class is used by the H2 Console.
* This class is used by the H2 Console.
*/
*/
class
DbColumn
{
public
class
DbColumn
{
/**
private
final
String
name
;
* The column name.
*/
private
final
String
quotedName
;
final
String
name
;
private
final
String
dataType
;
/**
* The quoted table name.
private
int
position
;
*/
final
String
quotedName
;
/**
* @return The data type name (including precision and the NOT NULL flag if
/**
* applicable).
* The data type name (including precision and the NOT NULL flag if
*/
* applicable).
public
String
getDataType
()
{
*/
return
dataType
;
final
String
dataType
;
}
DbColumn
(
DbContents
contents
,
ResultSet
rs
)
throws
SQLException
{
/**
name
=
rs
.
getString
(
"COLUMN_NAME"
);
* @return The column name.
quotedName
=
contents
.
quoteIdentifier
(
name
);
*/
String
type
=
rs
.
getString
(
"TYPE_NAME"
);
public
String
getName
()
{
int
size
=
rs
.
getInt
(
DbContents
.
findColumn
(
rs
,
"COLUMN_SIZE"
,
7
));
return
name
;
boolean
isSQLite
=
contents
.
isSQLite
;
}
if
(
size
>
0
&&
!
isSQLite
)
{
type
+=
"("
+
size
;
/**
int
prec
=
rs
.
getInt
(
DbContents
.
findColumn
(
rs
,
"DECIMAL_DIGITS"
,
9
));
* @return The quoted table name.
if
(
prec
>
0
)
{
*/
type
+=
", "
+
prec
;
public
String
getQuotedName
()
{
}
return
quotedName
;
type
+=
")"
;
}
}
if
(
rs
.
getInt
(
"NULLABLE"
)
==
DatabaseMetaData
.
columnNoNulls
)
{
/**
type
+=
" NOT NULL"
;
* @return Column index
}
*/
dataType
=
type
;
public
int
getPosition
()
{
}
return
position
;
}
}
public
DbColumn
(
DbContents
contents
,
ResultSet
rs
)
throws
SQLException
{
name
=
rs
.
getString
(
"COLUMN_NAME"
);
quotedName
=
contents
.
quoteIdentifier
(
name
);
String
type
=
rs
.
getString
(
"TYPE_NAME"
);
// A procedures column size is identified by PRECISION, for table this is COLUMN_SIZE
int
precisionColumnIndex
=
DbContents
.
findColumn
(
rs
,
"PRECISION"
,
0
);
int
size
;
if
(
precisionColumnIndex
==
0
){
size
=
rs
.
getInt
(
DbContents
.
findColumn
(
rs
,
"COLUMN_SIZE"
,
7
));
}
else
{
size
=
rs
.
getInt
(
precisionColumnIndex
);
}
position
=
rs
.
getInt
(
"ORDINAL_POSITION"
);
boolean
isSQLite
=
contents
.
isSQLite
();
if
(
size
>
0
&&
!
isSQLite
)
{
type
+=
"("
+
size
;
int
prec
=
rs
.
getInt
(
DbContents
.
findColumn
(
rs
,
"DECIMAL_DIGITS"
,
9
));
if
(
prec
>
0
)
{
type
+=
", "
+
prec
;
}
type
+=
")"
;
}
if
(
rs
.
getInt
(
"NULLABLE"
)
==
DatabaseMetaData
.
columnNoNulls
)
{
type
+=
" NOT NULL"
;
}
dataType
=
type
;
}
}
h2/src/main/org/h2/
server/web
/DbContents.java
→
h2/src/main/org/h2/
bnf/context
/DbContents.java
浏览文件 @
cceb5a12
差异被折叠。
点击展开。
h2/src/main/org/h2/
server/web
/DbContextRule.java
→
h2/src/main/org/h2/
bnf/context
/DbContextRule.java
浏览文件 @
cceb5a12
差异被折叠。
点击展开。
h2/src/main/org/h2/bnf/context/DbProcedure.java
0 → 100644
浏览文件 @
cceb5a12
/*
* Copyright 2004-2013 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package
org
.
h2
.
bnf
.
context
;
import
org.h2.util.New
;
import
java.sql.DatabaseMetaData
;
import
java.sql.ResultSet
;
import
java.sql.SQLException
;
import
java.util.ArrayList
;
/**
* Contains meta data information about a procedure.
* This class is used by the H2 Console.
*/
public
class
DbProcedure
{
private
final
DbSchema
schema
;
private
final
String
name
;
private
final
String
quotedName
;
private
boolean
returnsResult
;
private
DbColumn
[]
parameters
;
public
DbProcedure
(
DbSchema
schema
,
ResultSet
rs
)
throws
SQLException
{
this
.
schema
=
schema
;
name
=
rs
.
getString
(
"PROCEDURE_NAME"
);
returnsResult
=
rs
.
getShort
(
"PROCEDURE_TYPE"
)
==
DatabaseMetaData
.
procedureReturnsResult
;
quotedName
=
schema
.
getContents
().
quoteIdentifier
(
name
);
}
/**
* @return The schema this table belongs to.
*/
public
DbSchema
getSchema
()
{
return
schema
;
}
/**
* @return The column list.
*/
public
DbColumn
[]
getParameters
()
{
return
parameters
;
}
/**
* @return The table name.
*/
public
String
getName
()
{
return
name
;
}
/**
* @return The quoted table name.
*/
public
String
getQuotedName
()
{
return
quotedName
;
}
/**
* @return True if this function return a value
*/
public
boolean
isReturnsResult
()
{
return
returnsResult
;
}
/**
* Read the column for this table from the database meta data.
*
* @param meta the database meta data
*/
void
readParameters
(
DatabaseMetaData
meta
)
throws
SQLException
{
ResultSet
rs
=
meta
.
getProcedureColumns
(
null
,
schema
.
name
,
name
,
null
);
ArrayList
<
DbColumn
>
list
=
New
.
arrayList
();
while
(
rs
.
next
())
{
DbColumn
column
=
new
DbColumn
(
schema
.
getContents
(),
rs
);
if
(
column
.
getPosition
()>
0
)
{
//Not the return type
list
.
add
(
column
);
}
}
rs
.
close
();
parameters
=
new
DbColumn
[
list
.
size
()];
// Store the parameter in the good position [1-n]
for
(
int
i
=
0
;
i
<
parameters
.
length
;
i
++)
{
DbColumn
column
=
list
.
get
(
i
);
if
(
column
.
getPosition
()>
0
&&
column
.
getPosition
()
<=
parameters
.
length
)
{
parameters
[
column
.
getPosition
()
-
1
]
=
column
;
}
}
}
}
h2/src/main/org/h2/
server/web
/DbSchema.java
→
h2/src/main/org/h2/
bnf/context
/DbSchema.java
浏览文件 @
cceb5a12
/*
/*
* Copyright 2004-2013 H2 Group. Multiple-Licensed under the H2 License,
* Copyright 2004-2013 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
* Initial Developer: H2 Group
*/
*/
package
org
.
h2
.
server
.
web
;
package
org
.
h2
.
bnf
.
context
;
import
java.sql.DatabaseMetaData
;
import
java.sql.DatabaseMetaData
;
import
java.sql.ResultSet
;
import
java.sql.ResultSet
;
import
java.sql.SQLException
;
import
java.sql.SQLException
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
org.h2.util.New
;
import
org.h2.util.New
;
import
org.h2.util.StringUtils
;
import
org.h2.util.StringUtils
;
/**
/**
* Contains meta data information about a database schema.
* Contains meta data information about a database schema.
* This class is used by the H2 Console.
* This class is used by the H2 Console.
*/
*/
public
class
DbSchema
{
public
class
DbSchema
{
/**
/**
* Up to this many tables, the column type and indexes are listed.
* Up to this many tables, the column type and indexes are listed.
*/
*/
static
final
int
MAX_TABLES_LIST_INDEXES
=
100
;
public
static
final
int
MAX_TABLES_LIST_INDEXES
=
100
;
/**
/**
* Up to this many tables, the column names are listed.
* Up to this many tables, the column names are listed.
*/
*/
static
final
int
MAX_TABLES_LIST_COLUMNS
=
500
;
public
static
final
int
MAX_TABLES_LIST_COLUMNS
=
500
;
/**
/**
* The database content container.
* Up to this many tables, the column names are listed.
*/
*/
final
DbContents
contents
;
public
static
final
int
MAX_PROCEDURES_LIST_COLUMNS
=
500
;
/**
/**
* The schema name.
* The database content container.
*/
*/
final
String
name
;
private
final
DbContents
contents
;
/**
/**
* True if this is the default schema for this database.
* The schema name.
*/
*/
final
boolean
isDefault
;
public
final
String
name
;
/**
/**
* True if this is a system schema (for example the INFORMATION_SCHEMA).
* True if this is the default schema for this database.
*/
*/
final
boolean
isSystem
;
public
final
boolean
isDefault
;
/**
/**
* The quoted schema name.
* True if this is a system schema (for example the INFORMATION_SCHEMA).
*/
*/
final
String
quotedName
;
public
final
boolean
isSystem
;
/**
/**
* The table list.
* The quoted schema name.
*/
*/
DbTableOrView
[]
tables
;
public
final
String
quotedName
;
DbSchema
(
DbContents
contents
,
String
name
,
boolean
isDefault
)
{
/**
this
.
contents
=
contents
;
* The table list.
this
.
name
=
name
;
*/
this
.
quotedName
=
contents
.
quoteIdentifier
(
name
);
private
DbTableOrView
[]
tables
;
this
.
isDefault
=
isDefault
;
if
(
name
.
equals
(
"INFORMATION_SCHEMA"
))
{
/**
isSystem
=
true
;
* The procedures list.
}
else
if
(!
contents
.
isH2
&&
StringUtils
.
toUpperEnglish
(
name
).
startsWith
(
"INFO"
))
{
*/
isSystem
=
true
;
private
DbProcedure
[]
procedures
;
}
else
if
(
contents
.
isPostgreSQL
&&
StringUtils
.
toUpperEnglish
(
name
).
startsWith
(
"PG_"
))
{
isSystem
=
true
;
DbSchema
(
DbContents
contents
,
String
name
,
boolean
isDefault
)
{
}
else
if
(
contents
.
isDerby
&&
name
.
startsWith
(
"SYS"
))
{
this
.
contents
=
contents
;
isSystem
=
true
;
this
.
name
=
name
;
}
else
{
this
.
quotedName
=
contents
.
quoteIdentifier
(
name
);
isSystem
=
false
;
this
.
isDefault
=
isDefault
;
}
if
(
name
.
equals
(
"INFORMATION_SCHEMA"
))
{
}
isSystem
=
true
;
}
else
if
(!
contents
.
isH2
()
&&
StringUtils
.
toUpperEnglish
(
name
).
startsWith
(
"INFO"
))
{
/**
isSystem
=
true
;
* Read all tables for this schema from the database meta data.
}
else
if
(
contents
.
isPostgreSQL
()
&&
StringUtils
.
toUpperEnglish
(
name
).
startsWith
(
"PG_"
))
{
*
isSystem
=
true
;
* @param meta the database meta data
}
else
if
(
contents
.
isDerby
()
&&
name
.
startsWith
(
"SYS"
))
{
* @param tableTypes the table types to read
isSystem
=
true
;
*/
}
else
{
void
readTables
(
DatabaseMetaData
meta
,
String
[]
tableTypes
)
throws
SQLException
{
isSystem
=
false
;
ResultSet
rs
=
meta
.
getTables
(
null
,
name
,
null
,
tableTypes
);
}
ArrayList
<
DbTableOrView
>
list
=
New
.
arrayList
();
}
while
(
rs
.
next
())
{
DbTableOrView
table
=
new
DbTableOrView
(
this
,
rs
);
/**
if
(
contents
.
isOracle
&&
table
.
name
.
indexOf
(
'$'
)
>
0
)
{
* @return The database content container.
continue
;
*/
}
public
DbContents
getContents
()
{
list
.
add
(
table
);
return
contents
;
}
}
rs
.
close
();
tables
=
new
DbTableOrView
[
list
.
size
()];
/**
list
.
toArray
(
tables
);
* @return The table list.
if
(
tables
.
length
<
MAX_TABLES_LIST_COLUMNS
)
{
*/
for
(
DbTableOrView
tab
:
tables
)
{
public
DbTableOrView
[]
getTables
()
{
tab
.
readColumns
(
meta
);
return
tables
;
}
}
}
}
/**
* @return The procedure list.
}
*/
public
DbProcedure
[]
getProcedures
()
{
return
procedures
;
}
/**
* Read all tables for this schema from the database meta data.
*
* @param meta the database meta data
* @param tableTypes the table types to read
*/
public
void
readTables
(
DatabaseMetaData
meta
,
String
[]
tableTypes
)
throws
SQLException
{
ResultSet
rs
=
meta
.
getTables
(
null
,
name
,
null
,
tableTypes
);
ArrayList
<
DbTableOrView
>
list
=
New
.
arrayList
();
while
(
rs
.
next
())
{
DbTableOrView
table
=
new
DbTableOrView
(
this
,
rs
);
if
(
contents
.
isOracle
()
&&
table
.
getName
().
indexOf
(
'$'
)
>
0
)
{
continue
;
}
list
.
add
(
table
);
}
rs
.
close
();
tables
=
new
DbTableOrView
[
list
.
size
()];
list
.
toArray
(
tables
);
if
(
tables
.
length
<
MAX_TABLES_LIST_COLUMNS
)
{
for
(
DbTableOrView
tab
:
tables
)
{
tab
.
readColumns
(
meta
);
}
}
}
/**
* Read all procedures in the dataBase.
* @param meta the database meta data
* @throws SQLException Error while fetching procedures
*/
public
void
readProcedures
(
DatabaseMetaData
meta
)
throws
SQLException
{
ResultSet
rs
=
meta
.
getProcedures
(
null
,
name
,
null
);
ArrayList
<
DbProcedure
>
list
=
New
.
arrayList
();
while
(
rs
.
next
())
{
list
.
add
(
new
DbProcedure
(
this
,
rs
));
}
rs
.
close
();
procedures
=
new
DbProcedure
[
list
.
size
()];
list
.
toArray
(
procedures
);
if
(
procedures
.
length
<
MAX_PROCEDURES_LIST_COLUMNS
)
{
for
(
DbProcedure
procedure
:
procedures
)
{
procedure
.
readParameters
(
meta
);
}
}
}
}
h2/src/main/org/h2/
server/web
/DbTableOrView.java
→
h2/src/main/org/h2/
bnf/context
/DbTableOrView.java
浏览文件 @
cceb5a12
/*
/*
* Copyright 2004-2013 H2 Group. Multiple-Licensed under the H2 License,
* Copyright 2004-2013 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
* Initial Developer: H2 Group
*/
*/
package
org
.
h2
.
server
.
web
;
package
org
.
h2
.
bnf
.
context
;
import
java.sql.DatabaseMetaData
;
import
java.sql.DatabaseMetaData
;
import
java.sql.ResultSet
;
import
java.sql.ResultSet
;
import
java.sql.SQLException
;
import
java.sql.SQLException
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
org.h2.util.New
;
import
org.h2.util.New
;
/**
/**
* Contains meta data information about a table or a view.
* Contains meta data information about a table or a view.
* This class is used by the H2 Console.
* This class is used by the H2 Console.
*/
*/
public
class
DbTableOrView
{
public
class
DbTableOrView
{
/**
/**
* The schema this table belongs to.
* The schema this table belongs to.
*/
*/
final
DbSchema
schema
;
private
final
DbSchema
schema
;
/**
/**
* The table name.
* The table name.
*/
*/
final
String
name
;
private
final
String
name
;
/**
/**
* The quoted table name.
* The quoted table name.
*/
*/
final
String
quotedName
;
private
final
String
quotedName
;
/**
/**
* True if this represents a view.
* True if this represents a view.
*/
*/
final
boolean
isView
;
private
final
boolean
isView
;
/**
/**
* The column list.
* The column list.
*/
*/
DbColumn
[]
columns
;
private
DbColumn
[]
columns
;
DbTableOrView
(
DbSchema
schema
,
ResultSet
rs
)
throws
SQLException
{
public
DbTableOrView
(
DbSchema
schema
,
ResultSet
rs
)
throws
SQLException
{
this
.
schema
=
schema
;
this
.
schema
=
schema
;
name
=
rs
.
getString
(
"TABLE_NAME"
);
name
=
rs
.
getString
(
"TABLE_NAME"
);
String
type
=
rs
.
getString
(
"TABLE_TYPE"
);
String
type
=
rs
.
getString
(
"TABLE_TYPE"
);
isView
=
"VIEW"
.
equals
(
type
);
isView
=
"VIEW"
.
equals
(
type
);
quotedName
=
schema
.
contents
.
quoteIdentifier
(
name
);
quotedName
=
schema
.
getContents
().
quoteIdentifier
(
name
);
}
}
/**
/**
* Read the column for this table from the database meta data.
* @return The schema this table belongs to.
*
*/
* @param meta the database meta data
public
DbSchema
getSchema
()
{
*/
return
schema
;
void
readColumns
(
DatabaseMetaData
meta
)
throws
SQLException
{
}
ResultSet
rs
=
meta
.
getColumns
(
null
,
schema
.
name
,
name
,
null
);
ArrayList
<
DbColumn
>
list
=
New
.
arrayList
();
/**
while
(
rs
.
next
())
{
* @return The column list.
DbColumn
column
=
new
DbColumn
(
schema
.
contents
,
rs
);
*/
list
.
add
(
column
);
public
DbColumn
[]
getColumns
()
{
}
return
columns
;
rs
.
close
();
}
columns
=
new
DbColumn
[
list
.
size
()];
list
.
toArray
(
columns
);
/**
}
* @return The table name.
*/
}
public
String
getName
()
{
return
name
;
}
/**
* @return True if this represents a view.
*/
public
boolean
isView
()
{
return
isView
;
}
/**
* @return The quoted table name.
*/
public
String
getQuotedName
()
{
return
quotedName
;
}
/**
* Read the column for this table from the database meta data.
*
* @param meta the database meta data
*/
public
void
readColumns
(
DatabaseMetaData
meta
)
throws
SQLException
{
ResultSet
rs
=
meta
.
getColumns
(
null
,
schema
.
name
,
name
,
null
);
ArrayList
<
DbColumn
>
list
=
New
.
arrayList
();
while
(
rs
.
next
())
{
DbColumn
column
=
new
DbColumn
(
schema
.
getContents
(),
rs
);
list
.
add
(
column
);
}
rs
.
close
();
columns
=
new
DbColumn
[
list
.
size
()];
list
.
toArray
(
columns
);
}
}
h2/src/main/org/h2/res/help.csv
浏览文件 @
cceb5a12
...
@@ -167,7 +167,7 @@ CREATE DOMAIN [ IF NOT EXISTS ] newDomainName AS dataType
...
@@ -167,7 +167,7 @@ CREATE DOMAIN [ IF NOT EXISTS ] newDomainName AS dataType
Creates a new data type (domain)."
Creates a new data type (domain)."
"Commands (DDL)","CREATE INDEX","
"Commands (DDL)","CREATE INDEX","
CREATE
CREATE
{ [ UNIQUE ] [ HASH ] INDEX [ [ IF NOT EXISTS ] newIndexName ]
{ [ UNIQUE ] [ HASH ]
[ SPATIAL]
INDEX [ [ IF NOT EXISTS ] newIndexName ]
| PRIMARY KEY [ HASH ] }
| PRIMARY KEY [ HASH ] }
ON tableName ( indexColumn [,...] )
ON tableName ( indexColumn [,...] )
","
","
...
@@ -541,7 +541,7 @@ Default expressions are used if no explicit value was used when adding a row."
...
@@ -541,7 +541,7 @@ Default expressions are used if no explicit value was used when adding a row."
","
","
Comments can be used anywhere in a command and are ignored by the database."
Comments can be used anywhere in a command and are ignored by the database."
"Other Grammar","Compare","
"Other Grammar","Compare","
<> | <= | >= | = | < | > | !=
<> | <= | >= | = | < | > | !=
| &&
","
","
Comparison operator."
Comparison operator."
"Other Grammar","Condition","
"Other Grammar","Condition","
...
...
h2/src/main/org/h2/server/web/WebApp.java
浏览文件 @
cceb5a12
...
@@ -34,6 +34,10 @@ import java.util.Map;
...
@@ -34,6 +34,10 @@ import java.util.Map;
import
java.util.Properties
;
import
java.util.Properties
;
import
java.util.Random
;
import
java.util.Random
;
import
org.h2.bnf.Bnf
;
import
org.h2.bnf.Bnf
;
import
org.h2.bnf.context.DbColumn
;
import
org.h2.bnf.context.DbContents
;
import
org.h2.bnf.context.DbSchema
;
import
org.h2.bnf.context.DbTableOrView
;
import
org.h2.constant.ErrorCode
;
import
org.h2.constant.ErrorCode
;
import
org.h2.constant.SysProperties
;
import
org.h2.constant.SysProperties
;
import
org.h2.engine.Constants
;
import
org.h2.engine.Constants
;
...
@@ -469,20 +473,20 @@ public class WebApp {
...
@@ -469,20 +473,20 @@ public class WebApp {
private
static
int
addColumns
(
boolean
mainSchema
,
DbTableOrView
table
,
private
static
int
addColumns
(
boolean
mainSchema
,
DbTableOrView
table
,
StringBuilder
buff
,
int
treeIndex
,
boolean
showColumnTypes
,
StringBuilder
buff
,
int
treeIndex
,
boolean
showColumnTypes
,
StringBuilder
columnsBuffer
)
{
StringBuilder
columnsBuffer
)
{
DbColumn
[]
columns
=
table
.
columns
;
DbColumn
[]
columns
=
table
.
getColumns
()
;
for
(
int
i
=
0
;
columns
!=
null
&&
i
<
columns
.
length
;
i
++)
{
for
(
int
i
=
0
;
columns
!=
null
&&
i
<
columns
.
length
;
i
++)
{
DbColumn
column
=
columns
[
i
];
DbColumn
column
=
columns
[
i
];
if
(
columnsBuffer
.
length
()
>
0
)
{
if
(
columnsBuffer
.
length
()
>
0
)
{
columnsBuffer
.
append
(
' '
);
columnsBuffer
.
append
(
' '
);
}
}
columnsBuffer
.
append
(
column
.
name
);
columnsBuffer
.
append
(
column
.
getName
()
);
String
col
=
escapeIdentifier
(
column
.
name
);
String
col
=
escapeIdentifier
(
column
.
getName
()
);
String
level
=
mainSchema
?
", 1, 1"
:
", 2, 2"
;
String
level
=
mainSchema
?
", 1, 1"
:
", 2, 2"
;
buff
.
append
(
"setNode("
+
treeIndex
+
level
+
", 'column', '"
+
PageParser
.
escapeJavaScript
(
column
.
name
)
buff
.
append
(
"setNode("
+
treeIndex
+
level
+
", 'column', '"
+
PageParser
.
escapeJavaScript
(
column
.
getName
()
)
+
"', 'javascript:ins(\\'"
+
col
+
"\\')');\n"
);
+
"', 'javascript:ins(\\'"
+
col
+
"\\')');\n"
);
treeIndex
++;
treeIndex
++;
if
(
mainSchema
&&
showColumnTypes
)
{
if
(
mainSchema
&&
showColumnTypes
)
{
buff
.
append
(
"setNode("
+
treeIndex
+
", 2, 2, 'type', '"
+
PageParser
.
escapeJavaScript
(
column
.
dataType
)
buff
.
append
(
"setNode("
+
treeIndex
+
", 2, 2, 'type', '"
+
PageParser
.
escapeJavaScript
(
column
.
getDataType
()
)
+
"', null);\n"
);
+
"', null);\n"
);
treeIndex
++;
treeIndex
++;
}
}
...
@@ -585,57 +589,57 @@ public class WebApp {
...
@@ -585,57 +589,57 @@ public class WebApp {
boolean
showColumns
=
mainSchema
||
!
schema
.
isSystem
;
boolean
showColumns
=
mainSchema
||
!
schema
.
isSystem
;
String
indentation
=
", "
+
level
+
", "
+
(
showColumns
?
"1"
:
"2"
)
+
", "
;
String
indentation
=
", "
+
level
+
", "
+
(
showColumns
?
"1"
:
"2"
)
+
", "
;
String
indentNode
=
", "
+
(
level
+
1
)
+
", 2, "
;
String
indentNode
=
", "
+
(
level
+
1
)
+
", 2, "
;
DbTableOrView
[]
tables
=
schema
.
tables
;
DbTableOrView
[]
tables
=
schema
.
getTables
()
;
if
(
tables
==
null
)
{
if
(
tables
==
null
)
{
return
treeIndex
;
return
treeIndex
;
}
}
boolean
isOracle
=
schema
.
contents
.
isOracle
;
boolean
isOracle
=
schema
.
getContents
().
isOracle
()
;
boolean
notManyTables
=
tables
.
length
<
DbSchema
.
MAX_TABLES_LIST_INDEXES
;
boolean
notManyTables
=
tables
.
length
<
DbSchema
.
MAX_TABLES_LIST_INDEXES
;
for
(
DbTableOrView
table
:
tables
)
{
for
(
DbTableOrView
table
:
tables
)
{
if
(
table
.
isView
)
{
if
(
table
.
isView
()
)
{
continue
;
continue
;
}
}
int
tableId
=
treeIndex
;
int
tableId
=
treeIndex
;
String
tab
=
table
.
quotedName
;
String
tab
=
table
.
getQuotedName
()
;
if
(!
mainSchema
)
{
if
(!
mainSchema
)
{
tab
=
schema
.
quotedName
+
"."
+
tab
;
tab
=
schema
.
quotedName
+
"."
+
tab
;
}
}
tab
=
escapeIdentifier
(
tab
);
tab
=
escapeIdentifier
(
tab
);
buff
.
append
(
"setNode("
+
treeIndex
+
indentation
+
" 'table', '"
+
PageParser
.
escapeJavaScript
(
table
.
name
)
buff
.
append
(
"setNode("
+
treeIndex
+
indentation
+
" 'table', '"
+
PageParser
.
escapeJavaScript
(
table
.
getName
()
)
+
"', 'javascript:ins(\\'"
+
tab
+
"\\',true)');\n"
);
+
"', 'javascript:ins(\\'"
+
tab
+
"\\',true)');\n"
);
treeIndex
++;
treeIndex
++;
if
(
mainSchema
||
showColumns
)
{
if
(
mainSchema
||
showColumns
)
{
StringBuilder
columnsBuffer
=
new
StringBuilder
();
StringBuilder
columnsBuffer
=
new
StringBuilder
();
treeIndex
=
addColumns
(
mainSchema
,
table
,
buff
,
treeIndex
,
notManyTables
,
columnsBuffer
);
treeIndex
=
addColumns
(
mainSchema
,
table
,
buff
,
treeIndex
,
notManyTables
,
columnsBuffer
);
if
(!
isOracle
&&
notManyTables
)
{
if
(!
isOracle
&&
notManyTables
)
{
treeIndex
=
addIndexes
(
mainSchema
,
meta
,
table
.
name
,
schema
.
name
,
buff
,
treeIndex
);
treeIndex
=
addIndexes
(
mainSchema
,
meta
,
table
.
getName
()
,
schema
.
name
,
buff
,
treeIndex
);
}
}
buff
.
append
(
"addTable('"
+
PageParser
.
escapeJavaScript
(
table
.
name
)
+
"', '"
buff
.
append
(
"addTable('"
+
PageParser
.
escapeJavaScript
(
table
.
getName
()
)
+
"', '"
+
PageParser
.
escapeJavaScript
(
columnsBuffer
.
toString
())
+
"', "
+
tableId
+
");\n"
);
+
PageParser
.
escapeJavaScript
(
columnsBuffer
.
toString
())
+
"', "
+
tableId
+
");\n"
);
}
}
}
}
tables
=
schema
.
tables
;
tables
=
schema
.
getTables
()
;
for
(
DbTableOrView
view
:
tables
)
{
for
(
DbTableOrView
view
:
tables
)
{
if
(!
view
.
isView
)
{
if
(!
view
.
isView
()
)
{
continue
;
continue
;
}
}
int
tableId
=
treeIndex
;
int
tableId
=
treeIndex
;
String
tab
=
view
.
quotedName
;
String
tab
=
view
.
getQuotedName
()
;
if
(!
mainSchema
)
{
if
(!
mainSchema
)
{
tab
=
view
.
schema
.
quotedName
+
"."
+
tab
;
tab
=
view
.
getSchema
()
.
quotedName
+
"."
+
tab
;
}
}
tab
=
escapeIdentifier
(
tab
);
tab
=
escapeIdentifier
(
tab
);
buff
.
append
(
"setNode("
+
treeIndex
+
indentation
+
" 'view', '"
+
PageParser
.
escapeJavaScript
(
view
.
name
)
buff
.
append
(
"setNode("
+
treeIndex
+
indentation
+
" 'view', '"
+
PageParser
.
escapeJavaScript
(
view
.
getName
()
)
+
"', 'javascript:ins(\\'"
+
tab
+
"\\',true)');\n"
);
+
"', 'javascript:ins(\\'"
+
tab
+
"\\',true)');\n"
);
treeIndex
++;
treeIndex
++;
if
(
mainSchema
)
{
if
(
mainSchema
)
{
StringBuilder
columnsBuffer
=
new
StringBuilder
();
StringBuilder
columnsBuffer
=
new
StringBuilder
();
treeIndex
=
addColumns
(
mainSchema
,
view
,
buff
,
treeIndex
,
notManyTables
,
columnsBuffer
);
treeIndex
=
addColumns
(
mainSchema
,
view
,
buff
,
treeIndex
,
notManyTables
,
columnsBuffer
);
if
(
schema
.
contents
.
isH2
)
{
if
(
schema
.
getContents
().
isH2
()
)
{
PreparedStatement
prep
=
null
;
PreparedStatement
prep
=
null
;
try
{
try
{
prep
=
conn
.
prepareStatement
(
"SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME=?"
);
prep
=
conn
.
prepareStatement
(
"SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME=?"
);
prep
.
setString
(
1
,
view
.
name
);
prep
.
setString
(
1
,
view
.
getName
()
);
ResultSet
rs
=
prep
.
executeQuery
();
ResultSet
rs
=
prep
.
executeQuery
();
if
(
rs
.
next
())
{
if
(
rs
.
next
())
{
String
sql
=
rs
.
getString
(
"SQL"
);
String
sql
=
rs
.
getString
(
"SQL"
);
...
@@ -648,7 +652,7 @@ public class WebApp {
...
@@ -648,7 +652,7 @@ public class WebApp {
JdbcUtils
.
closeSilently
(
prep
);
JdbcUtils
.
closeSilently
(
prep
);
}
}
}
}
buff
.
append
(
"addTable('"
+
PageParser
.
escapeJavaScript
(
view
.
name
)
+
"', '"
buff
.
append
(
"addTable('"
+
PageParser
.
escapeJavaScript
(
view
.
getName
()
)
+
"', '"
+
PageParser
.
escapeJavaScript
(
columnsBuffer
.
toString
())
+
"', "
+
tableId
+
");\n"
);
+
PageParser
.
escapeJavaScript
(
columnsBuffer
.
toString
())
+
"', "
+
tableId
+
");\n"
);
}
}
}
}
...
@@ -663,16 +667,16 @@ public class WebApp {
...
@@ -663,16 +667,16 @@ public class WebApp {
session
.
loadBnf
();
session
.
loadBnf
();
Connection
conn
=
session
.
getConnection
();
Connection
conn
=
session
.
getConnection
();
DatabaseMetaData
meta
=
session
.
getMetaData
();
DatabaseMetaData
meta
=
session
.
getMetaData
();
isH2
=
contents
.
isH2
;
isH2
=
contents
.
isH2
()
;
StringBuilder
buff
=
new
StringBuilder
();
StringBuilder
buff
=
new
StringBuilder
();
buff
.
append
(
"setNode(0, 0, 0, 'database', '"
+
PageParser
.
escapeJavaScript
((
String
)
session
.
get
(
"url"
))
buff
.
append
(
"setNode(0, 0, 0, 'database', '"
+
PageParser
.
escapeJavaScript
((
String
)
session
.
get
(
"url"
))
+
"', null);\n"
);
+
"', null);\n"
);
int
treeIndex
=
1
;
int
treeIndex
=
1
;
DbSchema
defaultSchema
=
contents
.
defaultSchema
;
DbSchema
defaultSchema
=
contents
.
getDefaultSchema
()
;
treeIndex
=
addTablesAndViews
(
defaultSchema
,
true
,
buff
,
treeIndex
);
treeIndex
=
addTablesAndViews
(
defaultSchema
,
true
,
buff
,
treeIndex
);
DbSchema
[]
schemas
=
contents
.
schemas
;
DbSchema
[]
schemas
=
contents
.
getSchemas
()
;
for
(
DbSchema
schema
:
schemas
)
{
for
(
DbSchema
schema
:
schemas
)
{
if
(
schema
==
defaultSchema
||
schema
==
null
)
{
if
(
schema
==
defaultSchema
||
schema
==
null
)
{
continue
;
continue
;
...
@@ -983,7 +987,7 @@ public class WebApp {
...
@@ -983,7 +987,7 @@ public class WebApp {
result
=
buff
.
toString
();
result
=
buff
.
toString
();
session
.
put
(
"result"
,
result
);
session
.
put
(
"result"
,
result
);
}
catch
(
Throwable
e
)
{
}
catch
(
Throwable
e
)
{
session
.
put
(
"result"
,
getStackTrace
(
0
,
e
,
session
.
getContents
().
isH2
));
session
.
put
(
"result"
,
getStackTrace
(
0
,
e
,
session
.
getContents
().
isH2
()
));
}
}
return
"result.jsp"
;
return
"result.jsp"
;
}
}
...
@@ -1034,7 +1038,7 @@ public class WebApp {
...
@@ -1034,7 +1038,7 @@ public class WebApp {
// cancel
// cancel
}
}
}
catch
(
Throwable
e
)
{
}
catch
(
Throwable
e
)
{
result
=
"<br />"
+
getStackTrace
(
0
,
e
,
session
.
getContents
().
isH2
);
result
=
"<br />"
+
getStackTrace
(
0
,
e
,
session
.
getContents
().
isH2
()
);
error
=
formatAsError
(
e
.
getMessage
());
error
=
formatAsError
(
e
.
getMessage
());
}
}
String
sql
=
"@edit "
+
(
String
)
session
.
get
(
"resultSetSQL"
);
String
sql
=
"@edit "
+
(
String
)
session
.
get
(
"resultSetSQL"
);
...
@@ -1212,7 +1216,7 @@ public class WebApp {
...
@@ -1212,7 +1216,7 @@ public class WebApp {
}
}
Statement
stat
;
Statement
stat
;
DbContents
contents
=
session
.
getContents
();
DbContents
contents
=
session
.
getContents
();
if
(
forceEdit
||
(
allowEdit
&&
contents
.
isH2
))
{
if
(
forceEdit
||
(
allowEdit
&&
contents
.
isH2
()
))
{
stat
=
conn
.
createStatement
(
ResultSet
.
TYPE_SCROLL_INSENSITIVE
,
ResultSet
.
CONCUR_UPDATABLE
);
stat
=
conn
.
createStatement
(
ResultSet
.
TYPE_SCROLL_INSENSITIVE
,
ResultSet
.
CONCUR_UPDATABLE
);
}
else
{
}
else
{
stat
=
conn
.
createStatement
();
stat
=
conn
.
createStatement
();
...
@@ -1342,7 +1346,7 @@ public class WebApp {
...
@@ -1342,7 +1346,7 @@ public class WebApp {
return
buff
.
toString
();
return
buff
.
toString
();
}
catch
(
Throwable
e
)
{
}
catch
(
Throwable
e
)
{
// throwable: including OutOfMemoryError and so on
// throwable: including OutOfMemoryError and so on
return
getStackTrace
(
id
,
e
,
session
.
getContents
().
isH2
);
return
getStackTrace
(
id
,
e
,
session
.
getContents
().
isH2
()
);
}
finally
{
}
finally
{
session
.
executingStatement
=
null
;
session
.
executingStatement
=
null
;
}
}
...
@@ -1405,7 +1409,7 @@ public class WebApp {
...
@@ -1405,7 +1409,7 @@ public class WebApp {
prep
.
setInt
(
j
+
1
,
i
);
prep
.
setInt
(
j
+
1
,
i
);
}
}
}
}
if
(
session
.
getContents
().
isSQLite
)
{
if
(
session
.
getContents
().
isSQLite
()
)
{
// SQLite currently throws an exception on prep.execute()
// SQLite currently throws an exception on prep.execute()
prep
.
executeUpdate
();
prep
.
executeUpdate
();
}
else
{
}
else
{
...
@@ -1746,7 +1750,7 @@ public class WebApp {
...
@@ -1746,7 +1750,7 @@ public class WebApp {
}
}
ResultSetMetaData
meta
=
rs
.
getMetaData
();
ResultSetMetaData
meta
=
rs
.
getMetaData
();
int
type
=
meta
.
getColumnType
(
columnIndex
);
int
type
=
meta
.
getColumnType
(
columnIndex
);
if
(
session
.
getContents
().
isH2
)
{
if
(
session
.
getContents
().
isH2
()
)
{
rs
.
updateString
(
columnIndex
,
x
);
rs
.
updateString
(
columnIndex
,
x
);
return
;
return
;
}
}
...
...
h2/src/main/org/h2/server/web/WebSession.java
浏览文件 @
cceb5a12
...
@@ -17,6 +17,8 @@ import java.util.HashMap;
...
@@ -17,6 +17,8 @@ import java.util.HashMap;
import
java.util.Locale
;
import
java.util.Locale
;
import
org.h2.bnf.Bnf
;
import
org.h2.bnf.Bnf
;
import
org.h2.bnf.context.DbContents
;
import
org.h2.bnf.context.DbContextRule
;
import
org.h2.message.TraceSystem
;
import
org.h2.message.TraceSystem
;
import
org.h2.util.New
;
import
org.h2.util.New
;
...
@@ -120,12 +122,14 @@ class WebSession {
...
@@ -120,12 +122,14 @@ class WebSession {
DbContextRule
tableRule
=
new
DbContextRule
(
contents
,
DbContextRule
.
TABLE
);
DbContextRule
tableRule
=
new
DbContextRule
(
contents
,
DbContextRule
.
TABLE
);
DbContextRule
schemaRule
=
new
DbContextRule
(
contents
,
DbContextRule
.
SCHEMA
);
DbContextRule
schemaRule
=
new
DbContextRule
(
contents
,
DbContextRule
.
SCHEMA
);
DbContextRule
columnAliasRule
=
new
DbContextRule
(
contents
,
DbContextRule
.
COLUMN_ALIAS
);
DbContextRule
columnAliasRule
=
new
DbContextRule
(
contents
,
DbContextRule
.
COLUMN_ALIAS
);
DbContextRule
procedureRule
=
new
DbContextRule
(
contents
,
DbContextRule
.
PROCEDURE
);
newBnf
.
updateTopic
(
"column_name"
,
columnRule
);
newBnf
.
updateTopic
(
"column_name"
,
columnRule
);
newBnf
.
updateTopic
(
"new_table_alias"
,
newAliasRule
);
newBnf
.
updateTopic
(
"new_table_alias"
,
newAliasRule
);
newBnf
.
updateTopic
(
"table_alias"
,
aliasRule
);
newBnf
.
updateTopic
(
"table_alias"
,
aliasRule
);
newBnf
.
updateTopic
(
"column_alias"
,
columnAliasRule
);
newBnf
.
updateTopic
(
"column_alias"
,
columnAliasRule
);
newBnf
.
updateTopic
(
"table_name"
,
tableRule
);
newBnf
.
updateTopic
(
"table_name"
,
tableRule
);
newBnf
.
updateTopic
(
"schema_name"
,
schemaRule
);
newBnf
.
updateTopic
(
"schema_name"
,
schemaRule
);
newBnf
.
updateTopic
(
"expression"
,
procedureRule
);
newBnf
.
linkStatements
();
newBnf
.
linkStatements
();
bnf
=
newBnf
;
bnf
=
newBnf
;
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
...
...
h2/src/test/org/h2/test/TestAll.java
浏览文件 @
cceb5a12
...
@@ -144,6 +144,7 @@ import org.h2.test.synth.sql.TestSynth;
...
@@ -144,6 +144,7 @@ import org.h2.test.synth.sql.TestSynth;
import
org.h2.test.synth.thread.TestMulti
;
import
org.h2.test.synth.thread.TestMulti
;
import
org.h2.test.unit.TestAutoReconnect
;
import
org.h2.test.unit.TestAutoReconnect
;
import
org.h2.test.unit.TestBitField
;
import
org.h2.test.unit.TestBitField
;
import
org.h2.test.unit.TestBnf
;
import
org.h2.test.unit.TestCache
;
import
org.h2.test.unit.TestCache
;
import
org.h2.test.unit.TestClearReferences
;
import
org.h2.test.unit.TestClearReferences
;
import
org.h2.test.unit.TestCollation
;
import
org.h2.test.unit.TestCollation
;
...
@@ -608,6 +609,7 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1`
...
@@ -608,6 +609,7 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1`
new
TestAlterSchemaRename
().
runTest
(
this
);
new
TestAlterSchemaRename
().
runTest
(
this
);
new
TestAutoRecompile
().
runTest
(
this
);
new
TestAutoRecompile
().
runTest
(
this
);
new
TestBitField
().
runTest
(
this
);
new
TestBitField
().
runTest
(
this
);
new
TestBnf
().
runTest
(
this
);
new
TestBackup
().
runTest
(
this
);
new
TestBackup
().
runTest
(
this
);
new
TestBigDb
().
runTest
(
this
);
new
TestBigDb
().
runTest
(
this
);
new
TestBigResult
().
runTest
(
this
);
new
TestBigResult
().
runTest
(
this
);
...
...
h2/src/test/org/h2/test/unit/TestBnf.java
0 → 100644
浏览文件 @
cceb5a12
/*
* Copyright 2004-2013 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package
org
.
h2
.
test
.
unit
;
import
org.h2.bnf.Bnf
;
import
org.h2.bnf.context.DbContents
;
import
org.h2.bnf.context.DbContextRule
;
import
org.h2.bnf.context.DbProcedure
;
import
org.h2.bnf.context.DbSchema
;
import
org.h2.test.TestBase
;
import
java.sql.Connection
;
import
java.util.HashSet
;
import
java.util.Map
;
import
java.util.Set
;
/**
* Test Bnf Sql parser
* @author Nicolas Fortin
*/
public
class
TestBnf
extends
TestBase
{
/**
* Run just this test.
*
* @param a ignored
*/
public
static
void
main
(
String
...
a
)
throws
Exception
{
TestBase
.
createCaller
().
init
().
test
();
}
@Override
public
void
test
()
throws
Exception
{
deleteDb
(
"TestBnf"
);
Connection
conn
=
getConnection
(
"TestBnf"
);
try
{
testProcedures
(
conn
);
}
finally
{
conn
.
close
();
}
}
private
void
testProcedures
(
Connection
conn
)
throws
Exception
{
// Register a procedure and check if it is present in DbContents
conn
.
createStatement
().
execute
(
"DROP ALIAS IF EXISTS CUSTOM_PRINT"
);
conn
.
createStatement
().
execute
(
"CREATE ALIAS CUSTOM_PRINT AS $$ void print(String s) { System.out.println(s); } $$"
);
conn
.
createStatement
().
execute
(
"DROP TABLE IF EXISTS TABLE_WITH_STRING_FIELD"
);
conn
.
createStatement
().
execute
(
"CREATE TABLE TABLE_WITH_STRING_FIELD (STRING_FIELD VARCHAR(50), INT_FIELD integer)"
);
DbContents
dbContents
=
new
DbContents
();
dbContents
.
readContents
(
conn
.
getMetaData
());
DbSchema
defaultSchema
=
dbContents
.
getDefaultSchema
();
DbProcedure
[]
procedures
=
defaultSchema
.
getProcedures
();
Set
<
String
>
procedureName
=
new
HashSet
<
String
>(
procedures
.
length
);
for
(
DbProcedure
procedure
:
procedures
)
{
procedureName
.
add
(
procedure
.
getName
());
}
assertTrue
(
procedureName
.
contains
(
"CUSTOM_PRINT"
));
// Test completion
Bnf
bnf
=
Bnf
.
getInstance
(
null
);
DbContextRule
columnRule
=
new
DbContextRule
(
dbContents
,
DbContextRule
.
COLUMN
);
bnf
.
updateTopic
(
"column_name"
,
columnRule
);
bnf
.
updateTopic
(
"expression"
,
new
DbContextRule
(
dbContents
,
DbContextRule
.
PROCEDURE
));
bnf
.
linkStatements
();
// Test partial
Map
<
String
,
String
>
tokens
=
bnf
.
getNextTokenList
(
"SELECT CUSTOM_PR"
);
assertTrue
(
tokens
.
values
().
contains
(
"INT"
));
// Test parameters
tokens
=
bnf
.
getNextTokenList
(
"SELECT CUSTOM_PRINT("
);
assertTrue
(
tokens
.
values
().
contains
(
"STRING_FIELD"
));
assertFalse
(
tokens
.
values
().
contains
(
"INT_FIELD"
));
// Test parameters with spaces
tokens
=
bnf
.
getNextTokenList
(
"SELECT CUSTOM_PRINT ( "
);
assertTrue
(
tokens
.
values
().
contains
(
"STRING_FIELD"
));
assertFalse
(
tokens
.
values
().
contains
(
"INT_FIELD"
));
// Test parameters with close bracket
tokens
=
bnf
.
getNextTokenList
(
"SELECT CUSTOM_PRINT ( STRING_FIELD"
);
assertTrue
(
tokens
.
values
().
contains
(
")"
));
}
}
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论