Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
suliangchun
dbeaver
提交
b7083e42
D
dbeaver
项目概览
suliangchun
/
dbeaver
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dbeaver
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b7083e42
编写于
2月 02, 2021
作者:
S
Serge Rider
提交者:
GitHub
2月 02, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #11182 from dbeaver/postgresql-escape-string#11173
#11173 PostgreSQL escape string Former-commit-id:
c31cef0b
上级
9e2607b8
09687b7c
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
249 addition
and
7 deletion
+249
-7
plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties
...ss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties
+8
-0
plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_ru.properties
...dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_ru.properties
+8
-0
plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml
plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml
+4
-1
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreConstants.java
...rc/org/jkiss/dbeaver/ext/postgresql/PostgreConstants.java
+3
-0
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataSource.java
...jkiss/dbeaver/ext/postgresql/model/PostgreDataSource.java
+42
-2
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDatabase.java
...g/jkiss/dbeaver/ext/postgresql/model/PostgreDatabase.java
+6
-0
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDialect.java
...rg/jkiss/dbeaver/ext/postgresql/model/PostgreDialect.java
+2
-1
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreSetting.java
...rg/jkiss/dbeaver/ext/postgresql/model/PostgreSetting.java
+84
-0
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/impls/PostgreServerPostgreSQL.java
...r/ext/postgresql/model/impls/PostgreServerPostgreSQL.java
+8
-0
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/sql/PostgreEscapeStringRule.java
...s/dbeaver/ext/postgresql/sql/PostgreEscapeStringRule.java
+80
-0
plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLPartitionScanner.java
...ss/dbeaver/ui/editors/sql/syntax/SQLPartitionScanner.java
+4
-3
未找到文件。
plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle.properties
浏览文件 @
b7083e42
...
...
@@ -303,6 +303,12 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreLanguage.userDefined.name=Use
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreLanguage.userDefined.description
=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreLanguage.validatorId.name
=
Validator Id
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreLanguage.validatorId.description
=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting.name.name
=
Name
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting.name.description
=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting.value.name
=
Value
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting.value.description
=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting.unit.name
=
Unit
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting.unit.description
=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreProcedure.kind.name
=
Type
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreProcedure.objectId.name
=
Object ID
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreProcedure.aggregate.name
=
Aggregate
...
...
@@ -628,6 +634,8 @@ tree.information.node.name=System Info
tree.information.node.tip
=
Information
tree.language.node.name
=
Language
tree.languages.node.name
=
Languages
tree.setting.node.name
=
Setting
tree.settings.node.name
=
Settings
tree.mview.node.name
=
Materialized View
tree.mviews.node.name
=
Materialized Views
tree.mviews.node.tip
=
Materialized views
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/OSGI-INF/l10n/bundle_ru.properties
浏览文件 @
b7083e42
...
...
@@ -268,6 +268,12 @@ meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreLanguage.userDefined.descript
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreLanguage.userDefined.name
=
\u
041E
\u
043F
\u0440\u0435\u0434\u0435\u
043B
\u0451\u
043D
\u
043F
\u
043E
\u
043B
\u
044C
\u0437\u
043E
\u0432\u0430\u0442\u0435\u
043B
\u0435\u
043C
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreLanguage.validatorId.description
=
Validator Id
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreLanguage.validatorId.name
=
\u
041A
\u
043E
\u0434
\u0432\u0430\u
043B
\u0438\u0434\u0430\u0442\u
043E
\u0440\u0430
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting.name.name
=
\u
041D
\u0430\u0437\u0432\u0430\u
043D
\u0438\u0435
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting.name.description
=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting.value.name
=
\u0417\u
043D
\u0430\u0447\u0435\u
043D
\u0438\u0435
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting.value.description
=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting.unit.name
=
\u0415\u0434
.
\u0438\u0437\u
043C.
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting.unit.description
=
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreMaterializedView.tablespace.description
=
\u0422\u0430\u0431\u
043B
\u0438\u0447\u
043D
\u
043E
\u0435
\u
043F
\u0440\u
043E
\u0441\u0442\u0440\u0430\u
043D
\u0441\u0442\u0432\u
043E
\u
043C
\u0430\u0442\u0435\u0440\u0438\u0430\u
043B
\u0438\u0437\u
043E
\u0432\u0430\u
043D
\u
043D
\u
043E
\u0433\u
043E
\u
043F
\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u
043B
\u0435\u
043D
\u0438\u
044F
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreMaterializedView.tablespace.name
=
\u0422\u0430\u0431\u
043B
\u0438\u0447\u
043D
\u
043E
\u0435
\u
043F
\u0440\u
043E
\u0441\u0442\u0440\u0430\u
043D
\u0441\u0442\u0432\u
043E
meta.org.jkiss.dbeaver.ext.postgresql.model.PostgreMaterializedView.withData.name
=
\u
041D
\u0430\u
043F
\u
043E
\u
043B
\u
043D
\u0435\u
043D
\u
043E
...
...
@@ -599,6 +605,8 @@ tree.information.node.name = \u0421\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0
tree.information.node.tip
=
\u0418\u
043D
\u0444\u
043E
\u0440\u
043C
\u0430\u0446\u0438\u
044F
tree.language.node.name
=
\u
042F
\u0437\u
044B
\u
043A
tree.languages.node.name
=
\u
042F
\u0437\u
044B
\u
043A
\u0438
tree.setting.node.name
=
\u
041D
\u0430\u0441\u0442\u0440\u
043E
\u0439\u
043A
\u0430
tree.settings.node.name
=
\u
041D
\u0430\u0441\u0442\u0440\u
043E
\u0439\u
043A
\u0438
tree.locks.node.name
=
\u0411\u
043B
\u
043E
\u
043A
\u0438\u0440\u
043E
\u0432\u
043A
\u0438
tree.locks.node.tip
=
\u0414\u0438\u0441\u
043F
\u0435\u0442\u0447\u0435\u0440
\u0431\u
043B
\u
043E
\u
043A
\u0438\u0440\u
043E
\u0432\u
043E
\u
043A
\u0441\u0435\u0440\u0432\u0435\u0440\u0430
tree.mview.node.name
=
\u
041C
\u0430\u0442
.
\u
043F
\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u
043B
\u0435\u
043D
\u0438\u0435
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/plugin.xml
浏览文件 @
b7083e42
...
...
@@ -261,7 +261,10 @@
</folder>
<folder
type=
"org.jkiss.dbeaver.ext.postgresql.model.PostgreAvailableExtension"
label=
"%tree.avalextensions.node.name"
icon=
"#extensions"
description=
"%tree.extensions.node.tip"
visibleIf=
"object.dataSource.serverType.supportsExtensions()"
>
<items
label=
"%tree.avalextension.node.name"
path=
"extension"
property=
"availableExtensions"
icon=
"#extension"
/>
</folder>
</folder>
<folder
type=
"org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting"
label=
"%tree.settings.node.name"
icon=
"#settings"
description=
"Settings"
>
<items
label=
"%tree.setting.node.name"
path=
"setting"
property=
"settings"
icon=
"#setting"
/>
</folder>
</folder>
</items>
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/PostgreConstants.java
浏览文件 @
b7083e42
...
...
@@ -75,6 +75,9 @@ public class PostgreConstants {
public
static
final
String
TEMP_SCHEMA_PREFIX
=
"pg_temp_"
;
public
static
final
String
PUBLIC_SCHEMA_NAME
=
"public"
;
// Settings names from 'pg_options' view
public
static
final
String
OPTION_STANDARD_CONFORMING_STRINGS
=
"standard_conforming_strings"
;
public
static
final
String
PG_OBJECT_CLASS
=
"org.postgresql.util.PGobject"
;
public
static
final
String
PG_ARRAY_CLASS
=
"org.postgresql.jdbc.PgArray"
;
public
static
final
String
PG_INTERVAL_CLASS
=
"org.postgresql.util.PGInterval"
;
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDataSource.java
浏览文件 @
b7083e42
...
...
@@ -68,6 +68,7 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont
private
static
final
Log
log
=
Log
.
getLog
(
PostgreDataSource
.
class
);
private
DatabaseCache
databaseCache
;
private
SettingCache
settingCache
;
private
String
activeDatabaseName
;
private
PostgreServerExtension
serverExtension
;
private
String
serverVersion
;
...
...
@@ -95,7 +96,7 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont
this
,
activeDatabaseName
);
databaseCache
.
setCache
(
Collections
.
singletonList
(
defDatabase
));
settingCache
=
new
SettingCache
();
}
@Override
...
...
@@ -119,7 +120,7 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont
activeDatabaseName
=
PostgreConstants
.
DEFAULT_DATABASE
;
}
databaseCache
=
new
DatabaseCache
();
settingCache
=
new
SettingCache
();
DBPConnectionConfiguration
configuration
=
getContainer
().
getActualConnectionConfiguration
();
final
boolean
showNDD
=
CommonUtils
.
getBoolean
(
configuration
.
getProviderProperty
(
PostgreConstants
.
PROP_SHOW_NON_DEFAULT_DB
),
false
);
List
<
PostgreDatabase
>
dbList
=
new
ArrayList
<>();
...
...
@@ -132,6 +133,12 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont
databaseCache
.
setCache
(
dbList
);
// Initiate default context
getDefaultInstance
().
checkInstanceConnection
(
monitor
,
false
);
try
{
// Preload some settings, if available
settingCache
.
getObject
(
monitor
,
this
,
PostgreConstants
.
OPTION_STANDARD_CONFORMING_STRINGS
);
}
catch
(
DBException
e
)
{
// ignore
}
}
private
void
loadAvailableDatabases
(
@NotNull
DBRProgressMonitor
monitor
,
DBPConnectionConfiguration
configuration
,
List
<
PostgreDatabase
>
dbList
)
throws
DBException
{
...
...
@@ -280,6 +287,18 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont
return
databaseCache
.
getCachedObject
(
name
);
}
public
SettingCache
getSettingCache
()
{
return
settingCache
;
}
public
Collection
<
PostgreSetting
>
getSettings
()
{
return
settingCache
.
getCachedObjects
();
}
public
PostgreSetting
getSetting
(
String
name
)
{
return
settingCache
.
getCachedObject
(
name
);
}
@Override
public
void
initialize
(
@NotNull
DBRProgressMonitor
monitor
)
throws
DBException
...
...
@@ -611,6 +630,27 @@ public class PostgreDataSource extends JDBCDataSource implements DBSInstanceCont
}
}
static
class
SettingCache
extends
JDBCObjectLookupCache
<
PostgreDataSource
,
PostgreSetting
>
{
@NotNull
@Override
public
JDBCStatement
prepareLookupStatement
(
@NotNull
JDBCSession
session
,
@NotNull
PostgreDataSource
owner
,
@Nullable
PostgreSetting
object
,
@Nullable
String
objectName
)
throws
SQLException
{
if
(
object
!=
null
||
objectName
!=
null
)
{
final
JDBCPreparedStatement
dbStat
=
session
.
prepareStatement
(
"select * from pg_catalog.pg_settings where name=?"
);
dbStat
.
setString
(
1
,
object
!=
null
?
object
.
getName
()
:
objectName
);
return
dbStat
;
}
return
session
.
prepareStatement
(
"select * from pg_catalog.pg_settings"
);
}
@Nullable
@Override
protected
PostgreSetting
fetchObject
(
@NotNull
JDBCSession
session
,
@NotNull
PostgreDataSource
owner
,
@NotNull
JDBCResultSet
dbResult
)
throws
SQLException
,
DBException
{
return
new
PostgreSetting
(
owner
,
dbResult
);
}
}
private
final
Pattern
ERROR_POSITION_PATTERN
=
Pattern
.
compile
(
"\\n\\s*\\p{L}+\\s*: ([0-9]+)"
);
@Nullable
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDatabase.java
浏览文件 @
b7083e42
...
...
@@ -440,6 +440,12 @@ public class PostgreDatabase extends JDBCRemoteInstance
return
languageCache
.
getAllObjects
(
monitor
,
this
);
}
@Association
public
Collection
<
PostgreSetting
>
getSettings
(
DBRProgressMonitor
monitor
)
throws
DBException
{
checkInstanceConnection
(
monitor
);
return
getDataSource
().
getSettingCache
().
getAllObjects
(
monitor
,
getDataSource
());
}
@Association
public
Collection
<
PostgreCharset
>
getEncodings
(
DBRProgressMonitor
monitor
)
throws
DBException
{
if
(!
getDataSource
().
getServerType
().
supportsEncodings
())
{
...
...
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreDialect.java
浏览文件 @
b7083e42
...
...
@@ -22,6 +22,7 @@ import org.jkiss.dbeaver.ext.postgresql.PostgreConstants;
import
org.jkiss.dbeaver.ext.postgresql.edit.PostgreTableColumnManager
;
import
org.jkiss.dbeaver.ext.postgresql.model.data.PostgreBinaryFormatter
;
import
org.jkiss.dbeaver.ext.postgresql.sql.PostgreDollarQuoteRule
;
import
org.jkiss.dbeaver.ext.postgresql.sql.PostgreEscapeStringRule
;
import
org.jkiss.dbeaver.model.DBPDataKind
;
import
org.jkiss.dbeaver.model.DBPDataSource
;
import
org.jkiss.dbeaver.model.DBPDataSourceContainer
;
...
...
@@ -745,7 +746,6 @@ public class PostgreDialect extends JDBCSQLDialect implements TPRuleProvider {
removeSQLKeyword
(
"LENGTH"
);
if
(
dataSource
instanceof
PostgreDataSource
)
{
((
PostgreDataSource
)
dataSource
).
getServerType
().
configureDialect
(
this
);
serverExtension
=
((
PostgreDataSource
)
dataSource
).
getServerType
();
serverExtension
.
configureDialect
(
this
);
}
...
...
@@ -876,6 +876,7 @@ public class PostgreDialect extends JDBCSQLDialect implements TPRuleProvider {
public
void
extendRules
(
@Nullable
DBPDataSourceContainer
dataSource
,
@NotNull
List
<
TPRule
>
rules
,
@NotNull
RulePosition
position
)
{
if
(
position
==
RulePosition
.
INITIAL
||
position
==
RulePosition
.
PARTITION
)
{
rules
.
add
(
new
PostgreDollarQuoteRule
(
dataSource
,
position
==
RulePosition
.
PARTITION
));
rules
.
add
(
new
PostgreEscapeStringRule
());
}
}
}
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/PostgreSetting.java
0 → 100644
浏览文件 @
b7083e42
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2021 DBeaver Corp and others
*
* Licensed 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.jkiss.dbeaver.ext.postgresql.model
;
import
org.jkiss.code.NotNull
;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.model.DBPDataSource
;
import
org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils
;
import
org.jkiss.dbeaver.model.meta.Property
;
import
org.jkiss.dbeaver.model.struct.DBSObject
;
import
java.sql.ResultSet
;
public
class
PostgreSetting
implements
DBSObject
{
private
final
PostgreDataSource
database
;
private
final
String
name
;
private
final
String
value
;
private
final
String
unit
;
private
final
String
description
;
protected
PostgreSetting
(
PostgreDataSource
database
,
ResultSet
dbResult
)
{
this
.
database
=
database
;
this
.
name
=
JDBCUtils
.
safeGetString
(
dbResult
,
"name"
);
this
.
value
=
JDBCUtils
.
safeGetString
(
dbResult
,
"setting"
);
this
.
unit
=
JDBCUtils
.
safeGetString
(
dbResult
,
"unit"
);
this
.
description
=
JDBCUtils
.
safeGetString
(
dbResult
,
"short_desc"
);
}
@NotNull
@Property
(
viewable
=
true
,
order
=
1
)
@Override
public
String
getName
()
{
return
name
;
}
@Nullable
@Property
(
viewable
=
true
,
order
=
2
)
public
String
getValue
()
{
return
value
;
}
@Nullable
@Property
(
viewable
=
true
,
order
=
3
)
public
String
getUnit
()
{
return
unit
;
}
@Nullable
@Override
public
String
getDescription
()
{
return
description
;
}
@Override
public
boolean
isPersisted
()
{
return
true
;
}
@Nullable
@Override
public
DBSObject
getParentObject
()
{
return
database
;
}
@NotNull
@Override
public
DBPDataSource
getDataSource
()
{
return
database
.
getDataSource
();
}
}
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/impls/PostgreServerPostgreSQL.java
浏览文件 @
b7083e42
...
...
@@ -16,7 +16,9 @@
*/
package
org.jkiss.dbeaver.ext.postgresql.model.impls
;
import
org.jkiss.dbeaver.ext.postgresql.PostgreConstants
;
import
org.jkiss.dbeaver.ext.postgresql.model.PostgreDataSource
;
import
org.jkiss.dbeaver.ext.postgresql.model.PostgreSetting
;
/**
* PostgreServerPostgreSQL
...
...
@@ -53,4 +55,10 @@ public class PostgreServerPostgreSQL extends PostgreServerExtensionBase {
public
boolean
supportsDatabaseSize
()
{
return
true
;
}
@Override
public
boolean
supportsBackslashStringEscape
()
{
final
PostgreSetting
setting
=
dataSource
.
getSetting
(
PostgreConstants
.
OPTION_STANDARD_CONFORMING_STRINGS
);
return
setting
!=
null
&&
"off"
.
equals
(
setting
.
getValue
());
}
}
plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/sql/PostgreEscapeStringRule.java
0 → 100644
浏览文件 @
b7083e42
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2021 DBeaver Corp and others
*
* Licensed 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.jkiss.dbeaver.ext.postgresql.sql
;
import
org.jkiss.dbeaver.model.sql.parser.tokens.SQLTokenType
;
import
org.jkiss.dbeaver.model.text.parser.*
;
/**
* This rule matches string literals with C-Style escapes, as
* described in <b>4.1.2.2</b> chapter of PostgreSQL documentation.
*
* @see <a href="https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE">4.1.2.2. String Constants with C-Style Escapes</a>
*/
public
class
PostgreEscapeStringRule
implements
TPPredicateRule
{
private
final
TPToken
stringToken
=
new
TPTokenDefault
(
SQLTokenType
.
T_STRING
);
@Override
public
TPToken
getSuccessToken
()
{
return
stringToken
;
}
@Override
public
TPToken
evaluate
(
TPCharacterScanner
scanner
,
boolean
resume
)
{
int
ch
=
scanner
.
read
();
int
chRead
=
1
;
if
(
ch
!=
'e'
&&
ch
!=
'E'
)
{
scanner
.
unread
();
return
TPTokenAbstract
.
UNDEFINED
;
}
ch
=
scanner
.
read
();
chRead
++;
if
(
ch
!=
'\''
)
{
scanner
.
unread
();
scanner
.
unread
();
return
TPTokenAbstract
.
UNDEFINED
;
}
do
{
ch
=
scanner
.
read
();
chRead
++;
if
(
ch
==
'\\'
&&
(
ch
=
scanner
.
read
())
==
'\''
)
{
// Don't care about other escape sequences
continue
;
}
if
(
ch
==
'\''
)
{
return
stringToken
;
}
}
while
(
ch
!=
TPCharacterScanner
.
EOF
);
while
(
chRead
--
>
0
)
{
scanner
.
unread
();
}
return
TPTokenAbstract
.
UNDEFINED
;
}
@Override
public
TPToken
evaluate
(
TPCharacterScanner
scanner
)
{
return
evaluate
(
scanner
,
false
);
}
}
plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLPartitionScanner.java
浏览文件 @
b7083e42
...
...
@@ -124,20 +124,21 @@ public class SQLPartitionScanner extends RuleBasedPartitionScanner implements TP
boolean
hasDoubleQuoteRule
=
false
;
String
[][]
identifierQuoteStrings
=
dialect
.
getIdentifierQuoteStrings
();
String
[][]
stringQuoteStrings
=
dialect
.
getStringQuoteStrings
();
char
stringEscapeCharacter
=
dialect
.
getStringEscapeCharacter
();
if
(
identifierQuoteStrings
!=
null
)
{
for
(
String
[]
quoteString
:
identifierQuoteStrings
)
{
rules
.
add
(
new
MultiLineRule
(
quoteString
[
0
],
quoteString
[
1
],
sqlQuotedToken
,
dialect
.
getStringEscapeCharacter
()
));
rules
.
add
(
new
MultiLineRule
(
quoteString
[
0
],
quoteString
[
1
],
sqlQuotedToken
,
stringEscapeCharacter
));
if
(
quoteString
[
1
].
equals
(
SQLConstants
.
STR_QUOTE_DOUBLE
)
&&
quoteString
[
0
].
equals
(
quoteString
[
1
]))
{
hasDoubleQuoteRule
=
true
;
}
}
}
if
(!
hasDoubleQuoteRule
)
{
rules
.
add
(
new
MultiLineRule
(
SQLConstants
.
STR_QUOTE_DOUBLE
,
SQLConstants
.
STR_QUOTE_DOUBLE
,
sqlQuotedToken
,
dialect
.
getStringEscapeCharacter
()
));
rules
.
add
(
new
MultiLineRule
(
SQLConstants
.
STR_QUOTE_DOUBLE
,
SQLConstants
.
STR_QUOTE_DOUBLE
,
sqlQuotedToken
,
stringEscapeCharacter
));
}
if
(!
ArrayUtils
.
isEmpty
(
stringQuoteStrings
))
{
for
(
String
[]
quotes
:
stringQuoteStrings
)
{
rules
.
add
(
new
MultiLineRule
(
quotes
[
0
],
quotes
[
1
],
sqlStringToken
,
dialect
.
getStringEscapeCharacter
()
));
rules
.
add
(
new
MultiLineRule
(
quotes
[
0
],
quotes
[
1
],
sqlStringToken
,
stringEscapeCharacter
));
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录