Added list_parsers and list_producers methods, in response to <Pine.LNX.4.44.02112111...
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Parser / Sybase.pm
CommitLineData
16dc9970 1package SQL::Translator::Parser::Sybase;
2
3#-----------------------------------------------------
49e1eb70 4# $Id: Sybase.pm,v 1.2 2002-11-20 04:03:04 kycl4rk Exp $
16dc9970 5#
6# File : SQL/Translator/Parser/Sybase.pm
7# Programmer : Ken Y. Clark, kclark@logsoft.com
8# Created : 2002/02/27
9# Purpose : parser for Sybase (dbschema.pl)
10#-----------------------------------------------------
11
12my $grammar = q{
13
14 { our ( %tables ) }
15
16 file : statement(s) { \%tables }
17# { print "statements: ", join("\n", @{$item[1]}), "\n" }
18# | <error>
19
20 statement : create
21 | junk
22# {
23# print "statement: ", join("\n", @{$item[1]}), "\n";
24# $return = @{$item[1]};
25# print "statement: '", $item[1], "'\n";
26# $return = $item[1];
27# }
28 | <error>
29
30 junk : comment
31 | use
32 | setuser
33 | if
34 | print
35 | else
36 | begin
37 | end
38 | grant
39 | exec
40 | GO
41
42 GO : /go/
43# { print "GO: ", $item[1], "\n" }
44
45 use : /use/i /.*/
46# { print "USE: ", $item[2], "\n" }
47
48 setuser : /setuser/i /.*/
49# { print "SETUSER: ", $item[2], "\n" }
50
51 if : /if/i /.*/
52# { print "IF: ", $item[2], "\n" }
53
54 print : /\s*/ /print/i /.*/
55# { print "PRINT: ", $item[3], "\n" }
56
57 else : /else/i /.*/
58# { print "ELSE: ", $item[2], "\n" }
59
60 begin : /begin/i
61# { print "BEGIN\n" }
62
63 end : /end/i
64# { print "END\n" }
65
66 grant : /grant/i /.*/
67# { print "GRANT: ", $item[2], "\n" }
68
69 exec : /exec/i /.*/
70# { print "EXEC: ", $item[2], "\n" }
71
72 comment : /^\s*\/\*.*\*\//m
73# { print "COMMENT: ", $item[-1], "\n" }
74
75 create : create_table table_name '(' field(s /,/) ')' lock(?)
76 {
77# print "TABLE $item[2]: ",
78# join(', ', map{$_->{'name'}}@{$item[4]}), "\n";
79 my $i = 0;
80 for my $line ( @{ $item[4] } ) {
81 if ( $line->{'type'} eq 'field' ) {
82 my $field_name = $line->{'name'};
83 $tables{ $item{'table_name'} }
84 {'fields'}{$field_name} =
85 { %$line, order => $i };
86 $i++;
87
88 if ( $line->{'is_primary_key'} ) {
89 push
49e1eb70 90 @{ $tables{ $item{'table_name'} }{'indices'} },
16dc9970 91 {
92 type => 'primary_key',
93 fields => [ $field_name ],
94 };
95 }
96 }
97 else {
49e1eb70 98 push @{ $tables{ $item{'table_name'} }{'indices'} },
16dc9970 99 $line;
100 }
101 $tables{ $item{'table_name'} }{'type'} =
102 $item{'table_type'}[0];
103 }
104 }
105 | <error>
106
107 blank : /\s*/
108
109 field : field_name data_type null(?)
110 {
111 $return = {
112 type => 'field',
113 name => $item{'field_name'},
114 data_type => $item{'data_type'}{'type'},
115 size => $item{'data_type'}{'size'},
116 null => $item{'null'}[0],
117# default => $item{'default_val'}[0],
118# is_auto_inc => $item{'auto_inc'}[0],
119# is_primary_key => $item{'primary_key'}[0],
120 }
121 }
122 | <error>
123
124 index : primary_key_index
125 | unique_index
126 | normal_index
127
128 table_name : WORD '.' WORD
129 { $return = $item[3] }
130
131 field_name : WORD
132
133 index_name : WORD
134
135 data_type : WORD field_size(?)
136 {
137 $return = {
138 type => $item[1],
139 size => $item[2][0]
140 }
141 }
142
143 lock : /lock/i /datarows/i
144
145 field_type : WORD
146
147 field_size : '(' num_range ')' { $item{'num_range'} }
148
149 num_range : DIGITS ',' DIGITS
150 { $return = $item[1].','.$item[3] }
151 | DIGITS
152 { $return = $item[1] }
153
154
155 create_table : /create/i /table/i
156
157 null : /not/i /null/i
158 { $return = 0 }
159 | /null/i
160 { $return = 1 }
161
162 default_val : /default/i /(?:')?[\w\d.-]*(?:')?/ { $item[2]=~s/'//g; $return=$item[2] }
163
164 auto_inc : /auto_increment/i { 1 }
165
166 primary_key : /primary/i /key/i { 1 }
167
168 primary_key_index : primary_key index_name(?) '(' field_name(s /,/) ')'
169 {
170 $return = {
171 name => $item{'index_name'}[0],
172 type => 'primary_key',
173 fields => $item[4],
174 }
175 }
176
177 normal_index : key index_name(?) '(' field_name(s /,/) ')'
178 {
179 $return = {
180 name => $item{'index_name'}[0],
181 type => 'normal',
182 fields => $item[4],
183 }
184 }
185
186 unique_index : /unique/i key index_name(?) '(' field_name(s /,/) ')'
187 {
188 $return = {
189 name => $item{'index_name'}[0],
190 type => 'unique',
191 fields => $item[5],
192 }
193 }
194
195 key : /key/i
196 | /index/i
197
198 table_type : /TYPE=/i /\w+/ { $item[2] }
199
200 WORD : /[\w#]+/
201
202 DIGITS : /\d+/
203
204 COMMA : ','
205
206};
207
2081;
209
210#-----------------------------------------------------
211# Every hero becomes a bore at last.
212# Ralph Waldo Emerson
213#-----------------------------------------------------
214
215=head1 NAME
216
217SQL::Translator::Parser::Sybase - parser for Sybase
218
219=head1 SYNOPSIS
220
221 use SQL::Translator::Parser::Sybase;
222
223=head1 DESCRIPTION
224
225Blah blah blah.
226
227=head1 AUTHOR
228
229Ken Y. Clark, kclark@logsoft.com
230
231=head1 SEE ALSO
232
233perl(1).
234
235=cut