Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
d91117f2
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d91117f2
编写于
4月 11, 2014
作者:
Y
Yves Senn
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #14692 from senny/pg/reload_type_map_for_unknown_types
PostgreSQL automatic type map reload
上级
d0b5484b
9f62344d
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
74 addition
and
16 deletion
+74
-16
activerecord/CHANGELOG.md
activerecord/CHANGELOG.md
+13
-0
activerecord/lib/active_record/connection_adapters/postgresql/database_statements.rb
...ord/connection_adapters/postgresql/database_statements.rb
+1
-4
activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
...ecord/connection_adapters/postgresql/schema_statements.rb
+1
-3
activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
...b/active_record/connection_adapters/postgresql_adapter.rb
+20
-3
activerecord/test/cases/adapters/postgresql/domain_test.rb
activerecord/test/cases/adapters/postgresql/domain_test.rb
+0
-3
activerecord/test/cases/adapters/postgresql/enum_test.rb
activerecord/test/cases/adapters/postgresql/enum_test.rb
+0
-2
activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb
...test/cases/adapters/postgresql/postgresql_adapter_test.rb
+39
-0
activerecord/test/cases/adapters/postgresql/range_test.rb
activerecord/test/cases/adapters/postgresql/range_test.rb
+0
-1
未找到文件。
activerecord/CHANGELOG.md
浏览文件 @
d91117f2
*
PostgreSQL adapter only warns once for every missing OID per connection.
Fixes #14275.
*Matthew Draper*, *Yves Senn*
*
PostgreSQL adapter automatically reloads it's type map when encountering
unknown OIDs.
Fixes #14678.
*Matthew Draper*, *Yves Senn*
*
Fix insertion of records via
`has_many :through`
association with scope.
Fixes #3548.
...
...
activerecord/lib/active_record/connection_adapters/postgresql/database_statements.rb
浏览文件 @
d91117f2
...
...
@@ -142,10 +142,7 @@ def exec_query(sql, name = 'SQL', binds = [])
fields
.
each_with_index
do
|
fname
,
i
|
ftype
=
result
.
ftype
i
fmod
=
result
.
fmod
i
types
[
fname
]
=
type_map
.
fetch
(
ftype
,
fmod
)
{
|
oid
,
mod
|
warn
"unknown OID:
#{
fname
}
(
#{
oid
}
) (
#{
sql
}
)"
OID
::
Identity
.
new
}
types
[
fname
]
=
get_oid_type
(
ftype
,
fmod
,
fname
)
end
ret
=
ActiveRecord
::
Result
.
new
(
fields
,
result
.
values
,
types
)
...
...
activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
浏览文件 @
d91117f2
...
...
@@ -182,9 +182,7 @@ def indexes(table_name, name = nil)
def
columns
(
table_name
)
# Limit, precision, and scale are all handled by the superclass.
column_definitions
(
table_name
).
map
do
|
column_name
,
type
,
default
,
notnull
,
oid
,
fmod
|
oid
=
type_map
.
fetch
(
oid
.
to_i
,
fmod
.
to_i
)
{
OID
::
Identity
.
new
}
oid
=
get_oid_type
(
oid
.
to_i
,
fmod
.
to_i
,
column_name
)
PostgreSQLColumn
.
new
(
column_name
,
default
,
oid
,
type
,
notnull
==
'f'
)
end
end
...
...
activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
浏览文件 @
d91117f2
...
...
@@ -559,6 +559,17 @@ def type_map
@type_map
end
def
get_oid_type
(
oid
,
fmod
,
column_name
)
if
!
type_map
.
key?
(
oid
)
initialize_type_map
(
type_map
,
[
oid
])
end
type_map
.
fetch
(
oid
,
fmod
)
{
warn
"unknown OID
#{
oid
}
: failed to recognize type of '
#{
column_name
}
'. It will be treated as String."
type_map
[
oid
]
=
OID
::
Identity
.
new
}
end
def
reload_type_map
type_map
.
clear
initialize_type_map
(
type_map
)
...
...
@@ -583,19 +594,25 @@ def add_oid(row, records_by_oid, type_map)
type_map
end
def
initialize_type_map
(
type_map
)
def
initialize_type_map
(
type_map
,
oids
=
nil
)
if
supports_ranges?
result
=
execute
(
<<-
SQL
,
'SCHEMA'
)
query
=
<<-
SQL
SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype
FROM pg_type as t
LEFT JOIN pg_range as r ON oid = rngtypid
SQL
else
result
=
execute
(
<<-
SQL
,
'SCHEMA'
)
query
=
<<-
SQL
SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, t.typtype, t.typbasetype
FROM pg_type as t
SQL
end
if
oids
query
+=
"WHERE t.oid::integer IN (%s)"
%
oids
.
join
(
", "
)
end
result
=
execute
(
query
,
'SCHEMA'
)
ranges
,
nodes
=
result
.
partition
{
|
row
|
row
[
'typtype'
]
==
'r'
}
enums
,
nodes
=
nodes
.
partition
{
|
row
|
row
[
'typtype'
]
==
'e'
}
domains
,
nodes
=
nodes
.
partition
{
|
row
|
row
[
'typtype'
]
==
'd'
}
...
...
activerecord/test/cases/adapters/postgresql/domain_test.rb
浏览文件 @
d91117f2
...
...
@@ -19,9 +19,6 @@ def setup
t
.
column
:price
,
:custom_money
end
end
# reload type map after creating the enum type
@connection
.
send
(
:reload_type_map
)
end
teardown
do
...
...
activerecord/test/cases/adapters/postgresql/enum_test.rb
浏览文件 @
d91117f2
...
...
@@ -21,8 +21,6 @@ def setup
t
.
column
:current_mood
,
:mood
end
end
# reload type map after creating the enum type
@connection
.
send
(
:reload_type_map
)
end
teardown
do
...
...
activerecord/test/cases/adapters/postgresql/postgresql_adapter_test.rb
浏览文件 @
d91117f2
# encoding: utf-8
require
"cases/helper"
require
'support/ddl_helper'
require
'support/connection_helper'
module
ActiveRecord
module
ConnectionAdapters
class
PostgreSQLAdapterTest
<
ActiveRecord
::
TestCase
include
DdlHelper
include
ConnectionHelper
def
setup
@connection
=
ActiveRecord
::
Base
.
connection
...
...
@@ -357,6 +359,43 @@ def test_raise_error_when_cannot_translate_exception
end
end
def
test_reload_type_map_for_newly_defined_types
@connection
.
execute
"CREATE TYPE feeling AS ENUM ('good', 'bad')"
result
=
@connection
.
select_all
"SELECT 'good'::feeling"
assert_instance_of
(
PostgreSQLAdapter
::
OID
::
Enum
,
result
.
column_types
[
"feeling"
])
ensure
@connection
.
execute
"DROP TYPE IF EXISTS feeling"
reset_connection
end
def
test_only_reload_type_map_once_for_every_unknown_type
silence_warnings
do
assert_queries
2
,
ignore_none:
true
do
@connection
.
select_all
"SELECT NULL::anyelement"
end
assert_queries
1
,
ignore_none:
true
do
@connection
.
select_all
"SELECT NULL::anyelement"
end
assert_queries
2
,
ignore_none:
true
do
@connection
.
select_all
"SELECT NULL::anyarray"
end
end
ensure
reset_connection
end
def
test_only_warn_on_first_encounter_of_unknown_oid
warning
=
capture
(
:stderr
)
{
@connection
.
select_all
"SELECT NULL::anyelement"
@connection
.
select_all
"SELECT NULL::anyelement"
@connection
.
select_all
"SELECT NULL::anyelement"
}
assert_match
(
/\Aunknown OID \d+: failed to recognize type of 'anyelement'. It will be treated as String.\n\z/
,
warning
)
ensure
reset_connection
end
private
def
insert
(
ctx
,
data
)
binds
=
data
.
map
{
|
name
,
value
|
...
...
activerecord/test/cases/adapters/postgresql/range_test.rb
浏览文件 @
d91117f2
...
...
@@ -34,7 +34,6 @@ def setup
@connection
.
add_column
'postgresql_ranges'
,
'float_range'
,
'floatrange'
end
@connection
.
send
:reload_type_map
PostgresqlRange
.
reset_column_information
rescue
ActiveRecord
::
StatementInvalid
skip
"do not test on PG without range"
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录