Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
7d1dc984
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,体验更适合开发者的 AI 搜索 >>
提交
7d1dc984
编写于
7月 19, 2016
作者:
R
Ryuta Kamizono
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix explain logging with binds
`binds` is an array of a query attribute since Active Record 5.0.
上级
a8a3a8cc
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
28 addition
and
17 deletion
+28
-17
activerecord/lib/active_record/explain.rb
activerecord/lib/active_record/explain.rb
+20
-9
activerecord/test/cases/adapters/postgresql/explain_test.rb
activerecord/test/cases/adapters/postgresql/explain_test.rb
+2
-2
activerecord/test/cases/adapters/sqlite3/explain_test.rb
activerecord/test/cases/adapters/sqlite3/explain_test.rb
+2
-2
activerecord/test/cases/explain_test.rb
activerecord/test/cases/explain_test.rb
+4
-4
未找到文件。
activerecord/lib/active_record/explain.rb
浏览文件 @
7d1dc984
...
...
@@ -16,15 +16,14 @@ def collecting_queries_for_explain # :nodoc:
# Makes the adapter execute EXPLAIN for the tuples of queries and bindings.
# Returns a formatted string ready to be logged.
def
exec_explain
(
queries
)
# :nodoc:
str
=
queries
.
map
do
|
sql
,
bind
|
[].
tap
do
|
msg
|
msg
<<
"EXPLAIN for:
#{
sql
}
"
unless
bind
.
empty?
bind_msg
=
bind
.
map
{
|
col
,
val
|
[
col
.
name
,
val
]}.
inspect
msg
.
last
<<
"
#{
bind_msg
}
"
end
msg
<<
connection
.
explain
(
sql
,
bind
)
end
.
join
(
"
\n
"
)
str
=
queries
.
map
do
|
sql
,
binds
|
msg
=
"EXPLAIN for:
#{
sql
}
"
unless
binds
.
empty?
msg
<<
" "
msg
<<
binds
.
map
{
|
attr
|
render_bind
(
attr
)
}.
inspect
end
msg
<<
"
\n
"
msg
<<
connection
.
explain
(
sql
,
binds
)
end
.
join
(
"
\n
"
)
# Overriding inspect to be more human readable, especially in the console.
...
...
@@ -34,5 +33,17 @@ def str.inspect
str
end
private
def
render_bind
(
attr
)
value
=
if
attr
.
type
.
binary?
&&
attr
.
value
"<
#{
attr
.
value_for_database
.
to_s
.
bytesize
}
bytes of binary data>"
else
connection
.
type_cast
(
attr
.
value_for_database
)
end
[
attr
.
name
,
value
]
end
end
end
activerecord/test/cases/adapters/postgresql/explain_test.rb
浏览文件 @
7d1dc984
...
...
@@ -7,14 +7,14 @@ class PostgreSQLExplainTest < ActiveRecord::PostgreSQLTestCase
def
test_explain_for_one_query
explain
=
Developer
.
where
(
id:
1
).
explain
assert_match
%r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" =
\$
?1
)
,
explain
assert_match
%r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" =
(?:
\$
1
\[\[
"id", 1
\]\]
|1)
)
,
explain
assert_match
%(QUERY PLAN)
,
explain
end
def
test_explain_with_eager_loading
explain
=
Developer
.
where
(
id:
1
).
includes
(
:audit_logs
).
explain
assert_match
%(QUERY PLAN)
,
explain
assert_match
%r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" =
\$
?1
)
,
explain
assert_match
%r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" =
(?:
\$
1
\[\[
"id", 1
\]\]
|1)
)
,
explain
assert_match
%(EXPLAIN for: SELECT "audit_logs".* FROM "audit_logs" WHERE "audit_logs"."developer_id" = 1)
,
explain
end
end
activerecord/test/cases/adapters/sqlite3/explain_test.rb
浏览文件 @
7d1dc984
...
...
@@ -7,13 +7,13 @@ class SQLite3ExplainTest < ActiveRecord::SQLite3TestCase
def
test_explain_for_one_query
explain
=
Developer
.
where
(
id:
1
).
explain
assert_match
%r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = (?:
\?
|1))
,
explain
assert_match
%r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = (?:
\?
\[\[
"id", 1
\]\]
|1))
,
explain
assert_match
(
/(SEARCH )?TABLE developers USING (INTEGER )?PRIMARY KEY/
,
explain
)
end
def
test_explain_with_eager_loading
explain
=
Developer
.
where
(
id:
1
).
includes
(
:audit_logs
).
explain
assert_match
%r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = (?:
\?
|1))
,
explain
assert_match
%r(EXPLAIN for: SELECT "developers".* FROM "developers" WHERE "developers"."id" = (?:
\?
\[\[
"id", 1
\]\]
|1))
,
explain
assert_match
(
/(SEARCH )?TABLE developers USING (INTEGER )?PRIMARY KEY/
,
explain
)
assert_match
%(EXPLAIN for: SELECT "audit_logs".* FROM "audit_logs" WHERE "audit_logs"."developer_id" = 1)
,
explain
assert_match
(
/(SCAN )?TABLE audit_logs/
,
explain
)
...
...
activerecord/test/cases/explain_test.rb
浏览文件 @
7d1dc984
...
...
@@ -46,11 +46,8 @@ def test_exec_explain_with_no_binds
end
def
test_exec_explain_with_binds
object
=
Struct
.
new
(
:name
)
cols
=
[
object
.
new
(
'wadus'
),
object
.
new
(
'chaflan'
)]
sqls
=
%w(foo bar)
binds
=
[[
[
cols
[
0
],
1
]],
[[
cols
[
1
],
2
]
]]
binds
=
[[
bind_param
(
'wadus'
,
1
)],
[
bind_param
(
'chaflan'
,
2
)
]]
queries
=
sqls
.
zip
(
binds
)
stub_explain_for_query_plans
([
"query plan foo
\n
"
,
"query plan bar
\n
"
])
do
...
...
@@ -83,5 +80,8 @@ def stub_explain_for_query_plans(query_plans = ['query plan foo', 'query plan ba
end
end
def
bind_param
(
name
,
value
)
ActiveRecord
::
Relation
::
QueryAttribute
.
new
(
name
,
value
,
ActiveRecord
::
Type
::
Value
.
new
)
end
end
end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录