sql_tree 0.1.0 → 0.1.1

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.
@@ -4,21 +4,21 @@ describe SQLTree::Node::InsertQuery do
4
4
 
5
5
  it "should parse an insert query without field list correctly" do
6
6
  insert = SQLTree::Node::InsertQuery["INSERT INTO table VALUES (1, 'two', 3+4, MD5('$ecret'))"]
7
- insert.table.should == 'table'
7
+ insert.table.should == SQLTree::Node::TableReference.new('table')
8
8
  insert.fields.should be_nil
9
9
  insert.values.should have(4).items
10
- insert.values[0].should == SQLTree::Node::Value.new(1)
11
- insert.values[1].should == SQLTree::Node::Value.new('two')
12
- insert.values[2].should be_kind_of(SQLTree::Node::ArithmeticExpression)
13
- insert.values[3].should be_kind_of(SQLTree::Node::FunctionExpression)
10
+ insert.values[0].should == SQLTree::Node::Expression::Value.new(1)
11
+ insert.values[1].should == SQLTree::Node::Expression::Value.new('two')
12
+ insert.values[2].should be_kind_of(SQLTree::Node::Expression::BinaryOperator)
13
+ insert.values[3].should be_kind_of(SQLTree::Node::Expression::FunctionCall)
14
14
  end
15
15
 
16
16
  it "should parse an insert query with field list" do
17
17
  insert = SQLTree::Node::InsertQuery['INSERT INTO table ("field1", "field2") VALUES (1, 2)']
18
- insert.table.should == 'table'
18
+ insert.table.should == SQLTree::Node::TableReference.new('table')
19
19
  insert.fields.should have(2).items
20
- insert.fields[0].should == SQLTree::Node::Variable.new('field1')
21
- insert.fields[1].should == SQLTree::Node::Variable.new('field2')
22
20
  insert.values.should have(2).items
21
+ insert.fields[0].should == SQLTree::Node::Expression::Field.new('field1')
22
+ insert.fields[1].should == SQLTree::Node::Expression::Field.new('field2')
23
23
  end
24
24
  end
@@ -1,82 +1,82 @@
1
1
  require "#{File.dirname(__FILE__)}/../spec_helper"
2
2
 
3
- describe SQLTree::Node::Value do
3
+ describe SQLTree::Node::Expression::Value do
4
4
 
5
5
  describe '.parse' do
6
6
  it "should not parse a field name" do
7
- lambda { SQLTree::Node::Value['field_name'] }.should raise_error(SQLTree::Parser::UnexpectedToken)
7
+ lambda { SQLTree::Node::Expression::Value['field_name'] }.should raise_error(SQLTree::Parser::UnexpectedToken)
8
8
  end
9
9
 
10
10
  it "should parse an integer value correctly" do
11
- SQLTree::Node::Value['123'].value.should == 123
11
+ SQLTree::Node::Expression::Value['123'].value.should == 123
12
12
  end
13
13
 
14
14
  it "should parse a string correctly" do
15
- SQLTree::Node::Value["'123'"].value.should == '123'
15
+ SQLTree::Node::Expression::Value["'123'"].value.should == '123'
16
16
  end
17
17
 
18
18
  it "should parse a NULL value correctly" do
19
- SQLTree::Node::Value['NULL'].value.should == nil
19
+ SQLTree::Node::Expression::Value['NULL'].value.should == nil
20
20
  end
21
21
 
22
22
  end
23
23
  end
24
24
 
25
- describe SQLTree::Node::Variable do
25
+ describe SQLTree::Node::Expression::Variable do
26
26
 
27
27
  describe '.parse' do
28
28
  it "should parse a variable name correctly" do
29
- SQLTree::Node::Field['variable'].name.should == 'variable'
29
+ SQLTree::Node::Expression::Variable['variable'].name.should == 'variable'
30
30
  end
31
31
 
32
32
  it "should parse a quoted variable name correctly" do
33
- SQLTree::Node::Field['"variable"'].name.should == 'variable'
33
+ SQLTree::Node::Expression::Variable['"variable"'].name.should == 'variable'
34
34
  end
35
35
 
36
36
  it "should raise an error when parsing a reserved keyword as variable" do
37
- lambda { SQLTree::Node::Field['select'] }.should raise_error(SQLTree::Parser::UnexpectedToken)
37
+ lambda { SQLTree::Node::Expression::Variable['select'] }.should raise_error(SQLTree::Parser::UnexpectedToken)
38
38
  end
39
39
 
40
40
  it "should parse a quoted reserved keyword as variable name correctly" do
41
- SQLTree::Node::Field['"select"'].name.should == 'select'
41
+ SQLTree::Node::Expression::Variable['"select"'].name.should == 'select'
42
42
  end
43
43
  end
44
44
  end
45
45
 
46
- describe SQLTree::Node::Field do
46
+ describe SQLTree::Node::Expression::Field do
47
47
  describe '.parse' do
48
48
  it "should parse a field name with table name correclty" do
49
- field = SQLTree::Node::Field['table.field']
49
+ field = SQLTree::Node::Expression::Field['table.field']
50
50
  field.table.should == 'table'
51
51
  field.name.should == 'field'
52
52
  end
53
53
 
54
54
  it "should parse a field name without table name correclty" do
55
- field = SQLTree::Node::Field['field']
55
+ field = SQLTree::Node::Expression::Field['field']
56
56
  field.table.should be_nil
57
57
  field.name.should == 'field'
58
58
  end
59
59
 
60
60
  it "should parse a quoted field name without table name correclty" do
61
- field = SQLTree::Node::Field['"field"']
61
+ field = SQLTree::Node::Expression::Field['"field"']
62
62
  field.table.should be_nil
63
63
  field.name.should == 'field'
64
64
  end
65
65
 
66
66
  it "should parse a quoted field name with quoted table name correclty" do
67
- field = SQLTree::Node::Field['"table"."field"']
67
+ field = SQLTree::Node::Expression::Field['"table"."field"']
68
68
  field.table.should == 'table'
69
69
  field.name.should == 'field'
70
70
  end
71
71
 
72
72
  it "should parse a quoted field name with non-quoted table name correclty" do
73
- field = SQLTree::Node::Field['table."field"']
73
+ field = SQLTree::Node::Expression::Field['table."field"']
74
74
  field.table.should == 'table'
75
75
  field.name.should == 'field'
76
76
  end
77
77
 
78
78
  it "should parse a non-quoted field name with quoted table name correclty" do
79
- field = SQLTree::Node::Field['"table".field']
79
+ field = SQLTree::Node::Expression::Field['"table".field']
80
80
  field.table.should == 'table'
81
81
  field.name.should == 'field'
82
82
  end
@@ -18,9 +18,9 @@ describe SQLTree::Node::SelectQuery do
18
18
 
19
19
  tree.select.length.should == 2
20
20
  tree.from.length.should == 2
21
- tree.where.should be_kind_of(SQLTree::Node::ComparisonExpression)
22
- tree.group_by.first.should be_kind_of(SQLTree::Node::Field)
23
- tree.having.should be_kind_of(SQLTree::Node::ComparisonExpression)
21
+ tree.where.should be_kind_of(SQLTree::Node::Expression::BinaryOperator)
22
+ tree.group_by.first.should be_kind_of(SQLTree::Node::Expression::Field)
23
+ tree.having.should be_kind_of(SQLTree::Node::Expression::BinaryOperator)
24
24
  end
25
25
  end
26
26
 
@@ -92,7 +92,7 @@ describe SQLTree::Node::Ordering do
92
92
 
93
93
  it "should parse an ordering without direction" do
94
94
  ordering = SQLTree::Node::Ordering["MD5(3 + 6) DESC"]
95
- ordering.expression.should be_kind_of(SQLTree::Node::FunctionExpression)
95
+ ordering.expression.should be_kind_of(SQLTree::Node::Expression::FunctionCall)
96
96
  ordering.direction.should == :desc
97
97
  end
98
98
 
@@ -2,65 +2,61 @@ require "#{File.dirname(__FILE__)}/../spec_helper"
2
2
 
3
3
  describe SQLTree::Tokenizer do
4
4
 
5
- before(:all) do
6
- @tokenizer = SQLTree::Tokenizer.new
7
- end
8
-
9
5
  context "recognizing single tokens" do
10
6
  it "should tokenize SQL query keywords" do
11
- @tokenizer.tokenize('WHERE').should tokenize_to(:where)
7
+ SQLTree::Tokenizer.tokenize('WHERE').should tokenize_to(:where)
12
8
  end
13
9
 
14
10
  it "should tokenize expression keywords" do
15
- @tokenizer.tokenize('and').should tokenize_to(:and)
11
+ SQLTree::Tokenizer.tokenize('and').should tokenize_to(:and)
16
12
  end
17
13
 
18
14
  it "should tokenize muliple separate keywords" do
19
- @tokenizer.tokenize('SELECT DISTINCT').should tokenize_to(:select, :distinct)
15
+ SQLTree::Tokenizer.tokenize('SELECT DISTINCT').should tokenize_to(:select, :distinct)
20
16
  end
21
17
 
22
18
  it "should ignore excessive whitespace" do
23
- @tokenizer.tokenize("\tSELECT DISTINCT \r\r").should tokenize_to(:select, :distinct)
19
+ SQLTree::Tokenizer.tokenize("\tSELECT DISTINCT \r\r").should tokenize_to(:select, :distinct)
24
20
  end
25
21
 
26
22
  it "should tokenize variables" do
27
- @tokenizer.tokenize("var").should tokenize_to(sql_var('var'))
23
+ SQLTree::Tokenizer.tokenize("var").should tokenize_to(sql_var('var'))
28
24
  end
29
25
 
30
26
  it "should tokenize quoted variables" do
31
- @tokenizer.tokenize('"var"').should tokenize_to(sql_var('var'))
27
+ SQLTree::Tokenizer.tokenize('"var"').should tokenize_to(sql_var('var'))
32
28
  end
33
29
 
34
30
  it "should tokenize quoted variables even when they are a reserved keyword" do
35
- @tokenizer.tokenize('"where"').should tokenize_to(sql_var('where'))
31
+ SQLTree::Tokenizer.tokenize('"where"').should tokenize_to(sql_var('where'))
36
32
  end
37
33
 
38
34
  it "should tokenize strings" do
39
- @tokenizer.tokenize("'hello' ' world '").should tokenize_to('hello', ' world ')
35
+ SQLTree::Tokenizer.tokenize("'hello' ' world '").should tokenize_to('hello', ' world ')
40
36
  end
41
37
 
42
38
  it "should tokenize numbers" do
43
- @tokenizer.tokenize("1 -2 3.14 -4.0").should tokenize_to(1, -2, 3.14, -4.0)
39
+ SQLTree::Tokenizer.tokenize("1 -2 3.14 -4.0").should tokenize_to(1, -2, 3.14, -4.0)
44
40
  end
45
41
 
46
42
  it "should tokenize logical operators" do
47
- @tokenizer.tokenize("< = <> >=").should tokenize_to(:lt, :eq, :ne, :gte)
43
+ SQLTree::Tokenizer.tokenize("< = <> >=").should tokenize_to(:lt, :eq, :ne, :gte)
48
44
  end
49
45
 
50
46
  it "should tokenize arithmetic operators" do
51
- @tokenizer.tokenize("+ - / * %").should tokenize_to(:plus, :minus, :divide, :multiply, :modulo)
47
+ SQLTree::Tokenizer.tokenize("+ - / * % || &").should tokenize_to(:plus, :minus, :divide, :multiply, :modulo, :concat, :binary_and)
52
48
  end
53
49
 
54
50
  it "should tokenize parentheses" do
55
- @tokenizer.tokenize("(a)").should tokenize_to(lparen, sql_var('a'), rparen)
51
+ SQLTree::Tokenizer.tokenize("(a)").should tokenize_to(lparen, sql_var('a'), rparen)
56
52
  end
57
53
 
58
54
  it "should tokenize dots" do
59
- @tokenizer.tokenize('a."b"').should tokenize_to(sql_var('a'), dot, sql_var('b'))
55
+ SQLTree::Tokenizer.tokenize('a."b"').should tokenize_to(sql_var('a'), dot, sql_var('b'))
60
56
  end
61
57
 
62
58
  it "should tokenize commas" do
63
- @tokenizer.tokenize('a , "b"').should tokenize_to(sql_var('a'), comma, sql_var('b'))
59
+ SQLTree::Tokenizer.tokenize('a , "b"').should tokenize_to(sql_var('a'), comma, sql_var('b'))
64
60
  end
65
61
  end
66
62
 
@@ -68,18 +64,18 @@ describe SQLTree::Tokenizer do
68
64
  # # Combination is currently done in the parsing phase.
69
65
  # context "combining double keywords" do
70
66
  # it "should tokenize double keywords" do
71
- # @tokenizer.tokenize('NOT LIKE').should tokenize_to(:not_like)
67
+ # SQLTree::Tokenizer.tokenize('NOT LIKE').should tokenize_to(:not_like)
72
68
  # end
73
69
  # end
74
70
 
75
71
  context "when tokenizing full queries or query fragments" do
76
72
  it "should tokenize a full SQL query" do
77
- @tokenizer.tokenize("SELECT a.* FROM a_table AS a WHERE a.id > 1").should tokenize_to(
73
+ SQLTree::Tokenizer.tokenize("SELECT a.* FROM a_table AS a WHERE a.id > 1").should tokenize_to(
78
74
  :select, sql_var('a'), dot, :multiply, :from, sql_var('a_table'), :as, sql_var('a'), :where, sql_var('a'), dot, sql_var('id'), :gt, 1)
79
75
  end
80
76
 
81
77
  it "should tokenize a function call" do
82
- @tokenizer.tokenize("MD5('test')").should tokenize_to(sql_var('MD5'), lparen, 'test', rparen)
78
+ SQLTree::Tokenizer.tokenize("MD5('test')").should tokenize_to(sql_var('MD5'), lparen, 'test', rparen)
83
79
  end
84
80
  end
85
81
 
@@ -4,18 +4,18 @@ describe SQLTree::Node::UpdateQuery do
4
4
 
5
5
  it "should parse a delete query without WHERE clause correctly" do
6
6
  update = SQLTree::Node::UpdateQuery["UPDATE table SET field1 = 1, field2 = 5 - 3"]
7
- update.table.should == 'table'
7
+ update.table.should == SQLTree::Node::TableReference.new("table")
8
8
  update.updates.should have(2).items
9
- update.updates[0].field.should == 'field1'
10
- update.updates[0].expression.should == SQLTree::Node::Value.new(1)
11
- update.updates[1].field.should == 'field2'
12
- update.updates[1].expression.should be_kind_of(SQLTree::Node::ArithmeticExpression)
9
+ update.updates[0].field.should == SQLTree::Node::Expression::Field.new("field1")
10
+ update.updates[0].expression.should == SQLTree::Node::Expression::Value.new(1)
11
+ update.updates[1].field.should == SQLTree::Node::Expression::Field.new("field2")
12
+ update.updates[1].expression.should be_kind_of(SQLTree::Node::Expression)
13
13
  update.where.should be_nil
14
14
  end
15
15
 
16
16
  it "should parse a delete query without WHERE clause correctly" do
17
17
  update = SQLTree::Node::UpdateQuery["UPDATE table SET field = 1 WHERE id = 17"]
18
- update.table.should == 'table'
18
+ update.table.should == SQLTree::Node::TableReference.new("table")
19
19
  update.updates.should have(1).item
20
20
  update.where.should be_kind_of(SQLTree::Node::Expression)
21
21
  end
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
3
3
 
4
4
  # Do not modify the version and date values by hand, because this will
5
5
  # automatically by them gem release script.
6
- s.version = "0.1.0"
7
- s.date = "2009-10-09"
6
+ s.version = "0.1.1"
7
+ s.date = "2009-10-17"
8
8
 
9
9
  s.summary = "A pure Ruby library to represent SQL queries with a syntax tree for inspection and modification."
10
10
  s.description = <<-EOS
@@ -22,6 +22,6 @@ Gem::Specification.new do |s|
22
22
 
23
23
  # Do not modify the files and test_files values by hand, because this will
24
24
  # automatically by them gem release script.
25
- s.files = %w(spec/unit/select_query_spec.rb spec/unit/insert_query_spec.rb spec/spec_helper.rb lib/sql_tree/tokenizer.rb lib/sql_tree/node/variable.rb lib/sql_tree/node/join.rb .gitignore lib/sql_tree/node/ordering.rb LICENSE spec/lib/matchers.rb lib/sql_tree/parser.rb sql_tree.gemspec spec/unit/tokenizer_spec.rb spec/unit/expression_node_spec.rb spec/unit/delete_query_spec.rb lib/sql_tree/node/select_expression.rb lib/sql_tree/node/assignment.rb spec/unit/leaf_node_spec.rb lib/sql_tree/token.rb lib/sql_tree/node/table_reference.rb lib/sql_tree/node/source.rb lib/sql_tree/node/insert_query.rb lib/sql_tree/node/field.rb Rakefile tasks/github-gem.rake spec/unit/update_query_spec.rb spec/integration/parse_and_generate_spec.rb lib/sql_tree/node/select_query.rb lib/sql_tree/node.rb README.rdoc spec/integration/api_spec.rb lib/sql_tree/node/value.rb lib/sql_tree/node/expression.rb lib/sql_tree/node/delete_query.rb lib/sql_tree.rb lib/sql_tree/node/update_query.rb)
25
+ s.files = %w(spec/unit/select_query_spec.rb spec/unit/insert_query_spec.rb spec/spec_helper.rb lib/sql_tree/tokenizer.rb lib/sql_tree/node/join.rb .gitignore lib/sql_tree/node/ordering.rb LICENSE spec/lib/matchers.rb lib/sql_tree/parser.rb sql_tree.gemspec spec/unit/tokenizer_spec.rb spec/unit/expression_node_spec.rb spec/unit/delete_query_spec.rb spec/unit/leaf_node_spec.rb lib/sql_tree/token.rb lib/sql_tree/node/table_reference.rb lib/sql_tree/node/source.rb lib/sql_tree/node/insert_query.rb Rakefile tasks/github-gem.rake spec/unit/update_query_spec.rb spec/integration/parse_and_generate_spec.rb lib/sql_tree/node/select_query.rb lib/sql_tree/node.rb README.rdoc spec/integration/api_spec.rb lib/sql_tree/node/expression.rb lib/sql_tree/node/delete_query.rb lib/sql_tree/node/select_declaration.rb lib/sql_tree.rb lib/sql_tree/node/update_query.rb)
26
26
  s.test_files = %w(spec/unit/select_query_spec.rb spec/unit/insert_query_spec.rb spec/unit/tokenizer_spec.rb spec/unit/expression_node_spec.rb spec/unit/delete_query_spec.rb spec/unit/leaf_node_spec.rb spec/unit/update_query_spec.rb spec/integration/parse_and_generate_spec.rb spec/integration/api_spec.rb)
27
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sql_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Willem van Bergen
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-09 00:00:00 +02:00
12
+ date: 2009-10-17 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -26,7 +26,6 @@ files:
26
26
  - spec/unit/insert_query_spec.rb
27
27
  - spec/spec_helper.rb
28
28
  - lib/sql_tree/tokenizer.rb
29
- - lib/sql_tree/node/variable.rb
30
29
  - lib/sql_tree/node/join.rb
31
30
  - .gitignore
32
31
  - lib/sql_tree/node/ordering.rb
@@ -37,14 +36,11 @@ files:
37
36
  - spec/unit/tokenizer_spec.rb
38
37
  - spec/unit/expression_node_spec.rb
39
38
  - spec/unit/delete_query_spec.rb
40
- - lib/sql_tree/node/select_expression.rb
41
- - lib/sql_tree/node/assignment.rb
42
39
  - spec/unit/leaf_node_spec.rb
43
40
  - lib/sql_tree/token.rb
44
41
  - lib/sql_tree/node/table_reference.rb
45
42
  - lib/sql_tree/node/source.rb
46
43
  - lib/sql_tree/node/insert_query.rb
47
- - lib/sql_tree/node/field.rb
48
44
  - Rakefile
49
45
  - tasks/github-gem.rake
50
46
  - spec/unit/update_query_spec.rb
@@ -53,9 +49,9 @@ files:
53
49
  - lib/sql_tree/node.rb
54
50
  - README.rdoc
55
51
  - spec/integration/api_spec.rb
56
- - lib/sql_tree/node/value.rb
57
52
  - lib/sql_tree/node/expression.rb
58
53
  - lib/sql_tree/node/delete_query.rb
54
+ - lib/sql_tree/node/select_declaration.rb
59
55
  - lib/sql_tree.rb
60
56
  - lib/sql_tree/node/update_query.rb
61
57
  has_rdoc: true
@@ -87,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
83
  requirements: []
88
84
 
89
85
  rubyforge_project:
90
- rubygems_version: 1.3.5
86
+ rubygems_version: 1.3.4
91
87
  signing_key:
92
88
  specification_version: 3
93
89
  summary: A pure Ruby library to represent SQL queries with a syntax tree for inspection and modification.
@@ -1,22 +0,0 @@
1
- module SQLTree::Node
2
-
3
- class Assignment < Base
4
-
5
- attr_accessor :field, :expression
6
-
7
- def initialize(field, expression = nil)
8
- @field, @expression = field, expression
9
- end
10
-
11
- def to_sql
12
- "#{quote_var(field)} = #{expression.to_sql}"
13
- end
14
-
15
- def self.parse(tokens)
16
- assignment = self.new(SQLTree::Node::Variable.parse(tokens).name)
17
- tokens.consume(SQLTree::Token::EQ)
18
- assignment.expression = SQLTree::Node::Expression.parse(tokens)
19
- assignment
20
- end
21
- end
22
- end
@@ -1,49 +0,0 @@
1
- module SQLTree::Node
2
-
3
- class Field < Base
4
-
5
- attr_accessor :name, :table
6
-
7
- alias :field :name
8
- alias :field= :name=
9
-
10
- def initialize(name, table = nil)
11
- @name = name
12
- @table = table
13
- end
14
-
15
- def quote_var(name)
16
- return '*' if name == :all
17
- super(name)
18
- end
19
-
20
- def to_sql
21
- @table.nil? ? quote_var(@name) : quote_var(@table) + '.' + quote_var(@name)
22
- end
23
-
24
- def ==(other)
25
- other.name == self.name && other.table == self.table
26
- end
27
-
28
- def self.parse(tokens)
29
- field_or_table = case tokens.next
30
- when SQLTree::Token::MULTIPLY then :all
31
- when SQLTree::Token::Variable then tokens.current.literal
32
- else raise SQLTree::Parser::UnexpectedToken.new(tokens.current)
33
- end
34
-
35
- if tokens.peek == SQLTree::Token::DOT
36
- table = field_or_table
37
- tokens.consume(SQLTree::Token::DOT)
38
- field = case tokens.next
39
- when SQLTree::Token::MULTIPLY then :all
40
- when SQLTree::Token::Variable then tokens.current.literal
41
- else raise SQLTree::Parser::UnexpectedToken.new(tokens.current)
42
- end
43
- self.new(field, table)
44
- else
45
- self.new(field_or_table)
46
- end
47
- end
48
- end
49
- end
@@ -1,45 +0,0 @@
1
- module SQLTree::Node
2
-
3
- class SelectExpression < Base
4
-
5
- attr_accessor :expression, :variable
6
-
7
- def initialize(expression, variable = nil)
8
- @expression = expression
9
- @variable = variable
10
- end
11
-
12
- def to_sql
13
- sql = @expression.to_sql
14
- sql << " AS " << quote_var(@variable) if @variable
15
- return sql
16
- end
17
-
18
- def self.parse(tokens)
19
- if tokens.peek == SQLTree::Token::MULTIPLY
20
- tokens.consume(SQLTree::Token::MULTIPLY)
21
- return SQLTree::Node::ALL_FIELDS
22
- else
23
- expression = SQLTree::Node::Expression.parse(tokens)
24
- expr = SQLTree::Node::SelectExpression.new(expression)
25
- if tokens.peek == SQLTree::Token::AS
26
- tokens.consume(SQLTree::Token::AS)
27
- expr.variable = SQLTree::Node::Variable.parse(tokens).name
28
- end
29
- return expr
30
- end
31
- end
32
-
33
- def ==(other)
34
- other.expression == self.expression && other.variable == self.variable
35
- end
36
- end
37
-
38
- class AllFieldsExpression < Expression
39
- def to_sql
40
- '*'
41
- end
42
- end
43
-
44
- ALL_FIELDS = AllFieldsExpression.new
45
- end