1 package SQL::Translator::Parser::Sybase;
3 #-----------------------------------------------------
4 # $Id: Sybase.pm,v 1.1.1.1 2002-03-01 02:26:25 kycl4rk Exp $
6 # File : SQL/Translator/Parser/Sybase.pm
7 # Programmer : Ken Y. Clark, kclark@logsoft.com
9 # Purpose : parser for Sybase (dbschema.pl)
10 #-----------------------------------------------------
16 file : statement(s) { \%tables }
17 # { print "statements: ", join("\n", @{$item[1]}), "\n" }
23 # print "statement: ", join("\n", @{$item[1]}), "\n";
24 # $return = @{$item[1]};
25 # print "statement: '", $item[1], "'\n";
43 # { print "GO: ", $item[1], "\n" }
46 # { print "USE: ", $item[2], "\n" }
48 setuser : /setuser/i /.*/
49 # { print "SETUSER: ", $item[2], "\n" }
52 # { print "IF: ", $item[2], "\n" }
54 print : /\s*/ /print/i /.*/
55 # { print "PRINT: ", $item[3], "\n" }
58 # { print "ELSE: ", $item[2], "\n" }
67 # { print "GRANT: ", $item[2], "\n" }
70 # { print "EXEC: ", $item[2], "\n" }
72 comment : /^\s*\/\*.*\*\//m
73 # { print "COMMENT: ", $item[-1], "\n" }
75 create : create_table table_name '(' field(s /,/) ')' lock(?)
77 # print "TABLE $item[2]: ",
78 # join(', ', map{$_->{'name'}}@{$item[4]}), "\n";
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 };
88 if ( $line->{'is_primary_key'} ) {
90 @{ $tables{ $item{'table_name'} }{'indeces'} },
92 type => 'primary_key',
93 fields => [ $field_name ],
98 push @{ $tables{ $item{'table_name'} }{'indeces'} },
101 $tables{ $item{'table_name'} }{'type'} =
102 $item{'table_type'}[0];
109 field : field_name data_type null(?)
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],
124 index : primary_key_index
128 table_name : WORD '.' WORD
129 { $return = $item[3] }
135 data_type : WORD field_size(?)
143 lock : /lock/i /datarows/i
147 field_size : '(' num_range ')' { $item{'num_range'} }
149 num_range : DIGITS ',' DIGITS
150 { $return = $item[1].','.$item[3] }
152 { $return = $item[1] }
155 create_table : /create/i /table/i
157 null : /not/i /null/i
162 default_val : /default/i /(?:')?[\w\d.-]*(?:')?/ { $item[2]=~s/'//g; $return=$item[2] }
164 auto_inc : /auto_increment/i { 1 }
166 primary_key : /primary/i /key/i { 1 }
168 primary_key_index : primary_key index_name(?) '(' field_name(s /,/) ')'
171 name => $item{'index_name'}[0],
172 type => 'primary_key',
177 normal_index : key index_name(?) '(' field_name(s /,/) ')'
180 name => $item{'index_name'}[0],
186 unique_index : /unique/i key index_name(?) '(' field_name(s /,/) ')'
189 name => $item{'index_name'}[0],
198 table_type : /TYPE=/i /\w+/ { $item[2] }
210 #-----------------------------------------------------
211 # Every hero becomes a bore at last.
212 # Ralph Waldo Emerson
213 #-----------------------------------------------------
217 SQL::Translator::Parser::Sybase - parser for Sybase
221 use SQL::Translator::Parser::Sybase;
229 Ken Y. Clark, kclark@logsoft.com