package SQL::Translator::Parser::PostgreSQL;
# -------------------------------------------------------------------
-# $Id: PostgreSQL.pm,v 1.50 2007-11-13 19:25:04 mwz444 Exp $
-# -------------------------------------------------------------------
-# Copyright (C) 2002-4 SQLFairy Authors
+# Copyright (C) 2002-2009 SQLFairy Authors
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
use strict;
use vars qw[ $DEBUG $VERSION $GRAMMAR @EXPORT_OK ];
-$VERSION = sprintf "%d.%02d", q$Revision: 1.50 $ =~ /(\d+)\.(\d+)/;
+$VERSION = '1.99';
$DEBUG = 0 unless defined $DEBUG;
use Data::Dumper;
| connect
| update
| set
+ | select
+ | copy
+ | readin_symbol
| <error>
connect : /^\s*\\\connect.*\n/
}
}
+revoke : /revoke/i WORD(s /,/) /on/i SCHEMA(?) schema_name /from/i name_with_opt_quotes(s /,/) ';'
+ { 1 }
+
grant : /grant/i WORD(s /,/) /on/i TABLE(?) table_name /to/i name_with_opt_quotes(s /,/) ';'
{
my $table_info = $item{'table_name'};
}
}
+grant : /grant/i WORD(s /,/) /on/i SCHEMA(?) schema_name /to/i name_with_opt_quotes(s /,/) ';'
+ { 1 }
+
drop : /drop/i /[^;]*/ ';'
string :
#
# Create table.
#
-create : create_table table_name '(' create_definition(s? /,/) ')' table_option(s?) ';'
+create : CREATE temporary_table(?) TABLE table_name '(' create_definition(s? /,/) ')' table_option(s?) ';'
{
my $table_info = $item{'table_name'};
my $schema_name = $table_info->{'schema_name'};
$tables{ $table_name }{'schema_name'} = $schema_name;
$tables{ $table_name }{'table_name'} = $table_name;
+ $tables{ $table_name }{'temporary'} = $item[2][0];
+
if ( @table_comments ) {
$tables{ $table_name }{'comments'} = [ @table_comments ];
@table_comments = ();
}
my @constraints;
- for my $definition ( @{ $item[4] } ) {
+ for my $definition ( @{ $item[6] } ) {
if ( $definition->{'supertype'} eq 'field' ) {
my $field_name = $definition->{'name'};
$tables{ $table_name }{'fields'}{ $field_name } =
}
}
- for my $option ( @{ $item[6] } ) {
+ for my $option ( @{ $item[8] } ) {
$tables{ $table_name }{'table_options(s?)'}{ $option->{'type'} } =
$option;
}
schema_qualification : name_with_opt_quotes '.'
+schema_name : name_with_opt_quotes
+
field_name : name_with_opt_quotes
name_with_opt_quotes : double_quote(?) NAME double_quote(?) { $item[2] }
parens_value_list : '(' VALUE(s /,/) ')'
{ $item[2] }
-parens_word_list : '(' WORD(s /,/) ')'
+
+parens_word_list : '(' name_with_opt_quotes(s /,/) ')'
{ $item[2] }
field_size : '(' num_range ')' { $item{'num_range'} }
storage_type : /(plain|external|extended|main)/i
+temporary: /temp(orary)?\\b/i
+
+temporary_table: temporary
+ {
+ 1;
+ }
+
alter_default_val : SET default_val
{
$return = { value => $item[2]->{'value'} }
restrict_or_cascade : /restrict/i |
/cascade/i
+# Handle functions that can be called
+select : SELECT select_function ';'
+ { 1 }
+
+# Read the setval function but don't do anything with it because this parser
+# isn't handling sequences
+select_function : schema_qualification(?) /setval/i '(' VALUE /,/ VALUE /,/ /(true|false)/i ')'
+ { 1 }
+
+# Skipping all COPY commands
+copy : COPY WORD /[^;]+/ ';' { 1 }
+ { 1 }
+
+# The "\." allows reading in from STDIN but this isn't needed for schema
+# creation, so it is skipped.
+readin_symbol : '\.'
+ {1}
+
#
# End basically useless stuff. - ky
#
create_index : CREATE /index/i
-default_val : DEFAULT /(\d+|'[^']*'|\w+\(.*?\))|\w+/
+default_val : DEFAULT /(\d+|'[^']*'|\w+\(.*\))|\w+/
{
my $val = defined $item[2] ? $item[2] : '';
$val =~ s/^'|'$//g;
TABLE : /table/i
+SCHEMA : /schema/i
+
SEMICOLON : /\s*;\n?/
SEQUENCE : /sequence/i
+SELECT : /select/i
+
+COPY : /copy/i
+
INTEGER : /\d+/
WORD : /\w+/
name => $tdata->{'table_name'},
) or die "Couldn't create table '$table_name': " . $schema->error;
+ $table->extra(temporary => 1) if $tdata->{'temporary'};
+
$table->comments( $tdata->{'comments'} );
my @fields = sort {
name => $idata->{'name'},
type => uc $idata->{'type'},
fields => $idata->{'fields'},
- ) or die $table->error;
+ ) or die $table->error . ' ' . $table->name;
}
for my $cdata ( @{ $tdata->{'constraints'} || [] } ) {