ar-sybase-jdbc-adapter 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -52,6 +52,33 @@ The problems here are:
52
52
 
53
53
  I am not a Sybase expert, so *Please let me know if you are aware of more efficient ways to do limit and offset.*
54
54
 
55
+ == Limit and Count in Sybase ASE
56
+
57
+ There is another interesting issue with Sybase DB I have just discovered. To implement "limit" I add "TOP <limit>" to the
58
+ query and it works fine. To check how many records this query returns the obvios thing is to run something like
59
+
60
+ select count(*) from (select top 10 * from table_name) t -- DOES NOT WORK!
61
+
62
+ But it does not work! The result of this query will be total number of rows in the table. So the only solution will be to
63
+ fall back to `cursor` and get `@@rowcount` to get the number of rows.
64
+
65
+ declare crsr insensitive scroll cursor for
66
+ select * from <original query>
67
+ go
68
+ open crsr
69
+
70
+ set cursor rows <limit> for crsr
71
+ fetch absolute <offset> from crsr
72
+
73
+ select @@rowcount
74
+
75
+ close crsr
76
+ deallocate crsr
77
+
78
+
79
+
80
+
81
+
55
82
  == Known issues
56
83
 
57
84
  I am aware of a very strange issue where the driver does not work when the very first query uses "limit()".
@@ -1,9 +1,17 @@
1
1
  module Arel
2
2
  module Visitors
3
3
  class SybaseJtds < Arel::Visitors::ToSql
4
+
5
+ def select_count? o
6
+ sel = o.cores.length == 1 && o.cores.first
7
+ projections = sel.projections.length == 1 && sel.projections
8
+ Arel::Nodes::Count === projections.first
9
+ end
10
+
11
+
4
12
  def visit_Arel_Nodes_SelectStatement o
5
- if o.offset
6
- sql = super # if offset use the Java limit/offset parser
13
+ if o.offset || (o.limit && select_count?(o))
14
+ sql = super # if offset OR (limit & count) use the Java limit/offset/count parser
7
15
  else
8
16
  limit = o.limit
9
17
  o.limit = nil
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
+ - 1
7
8
  - 0
8
- - 2
9
- version: 0.0.2
9
+ version: 0.1.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - arkadiy kraportov