/*
* $Id: oracle-create-table.jj,v 1.1.1.1 2003/05/26 01:53:54 yoonforh Exp $
*
* Copyright (c) 2003 by Yoon Kyung Koo.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL YOON KYUNG KOO OR THE OTHER
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
options {
IGNORE_CASE = true;
UNICODE_INPUT = true; // accept non-ascii input
// DEBUG_PARSER = true;
}
PARSER_BEGIN(OracleCreateTableParser)
package yoonforh.codegen.parser;
import java.io.*;
import java.util.*;
/**
* refer to Oracle 9i SQL reference
*
* @version $Revision: 1.1.1.1 $
* created at 2003-04-14 15:21:19
* @author Yoon Kyung Koo
*/
public class OracleCreateTableParser {
/** test run */
public static void main(String[] args) throws ParseException, IOException {
if (args.length < 1) {
System.err.println("usage : java OracleCreateTableParser ");
System.exit(0);
}
OracleCreateTableParser parser = new OracleCreateTableParser(
new FileInputStream(args[0]));
/*
SimpleNode node = parser.SQLSheet();
node.dump(">");
*/
HashMap tableMap = new HashMap();
parser.SQLSheet(tableMap);
System.out.println("parse result map - " + tableMap);
}
public static class TableInfo implements Serializable {
private String name = null;
private ArrayList pkList = new ArrayList();
private HashMap fieldMap = new HashMap();
public TableInfo(String name) {
this.name = name;
}
public String getName() { return name; }
public ArrayList getPKList() { return pkList; }
public HashMap getFieldMap() { return fieldMap; }
public void setName(String name) { this.name = name; }
public void addPK(String pk) {
pkList.add(pk);
}
public void addField(String name, FieldType type) {
fieldMap.put(name, type);
}
public String toString() {
return "TableInfo(name - " + name
+ ", pk list - " + pkList
+ ", field map - " + fieldMap
+ ")";
}
}
public static class FieldType implements Serializable {
private String name = null;
private String size = null;
public FieldType(String name) {
this(name, null);
}
public FieldType(String name, String size) {
this.name = name;
this.size = size;
}
public String getName() { return name; }
public String getSize() { return size; }
public void setName(String name) { this.name = name; }
public void setSize(String size) { this.size = size; }
public String toString() {
return "FieldType(name - " + name + ", size - " + size + ")";
}
}
}
PARSER_END(OracleCreateTableParser)
/* WHITE SPACE */
SKIP :
{
" "
| "\t"
| "\n"
| "\r"
| "\f"
}
/* COMMENTS */
MORE :
{
"--" : IN_SINGLE_LINE_COMMENT
|
"/*" : IN_MULTI_LINE_COMMENT
}
SPECIAL_TOKEN :
{
: DEFAULT
}
SPECIAL_TOKEN :
{
: DEFAULT
}
MORE :
{
< ~[] >
}
SPECIAL_TOKEN :
{
: DEFAULT
}
MORE :
{
< ~[] >
}
/* ORACLE 9i RESERVED WORDS */
TOKEN :
{
< ACCESS : "access" >
| < ADD : "add" >
| < ALL : "all" >
| < ALTER : "alter" >
| < AND : "and" >
| < ANY : "any" >
| < AS : "as" >
| < ASC : "asc" >
| < AUDIT : "audit" >
| < BETWEEN : "between" >
| < BY : "by" >
| < CHAR : "char" >
| < CHECK : "check" >
| < CLUSTER : "cluster" >
| < COLUMN : "column" >
| < COMMENT : "comment" >
| < COMPRESS : "compress" >
| < CONNECT : "connect" >
| < CREATE : "create" >
| < CURRENT : "current" >
| < DATE : "date" >
| < DECIMAL : "decimal" >
| < DEFAULT_STRING : "default" >
| < DELETE : "delete" >
| < DESC : "desc" >
| < DISTINCT : "distinct" >
| < DROP : "drop" >
| < ELSE : "else" >
| < EXCLUSIVE : "exclusive" >
| < EXISTS : "exists" >
| < FILE : "file" >
| < FLOAT : "float" >
| < FOR : "for" >
| < FROM : "from" >
| < GRANT : "grant" >
| < GROUP : "group" >
| < HAVING : "having" >
| < IDENTIFIED : "identified" >
| < IMMEDIATE : "immediate" >
| < IN : "in" >
| < INCREMENT : "increment" >
| < INDEX : "index" >
| < INITIAL : "initial" >
| < INSERT : "insert" >
| < INTEGER : "integer" >
| < INTERSECT : "intersect" >
| < INTO : "into" >
| < IS : "is" >
| < LEVEL : "level" >
| < LIKE : "like" >
| < LOCK : "lock" >
| < LONG : "long" >
| < MAXEXTENTS : "maxextents" >
| < MINUS : "minus" >
| < MLSLABEL : "mlslabel" >
| < MODE : "mode" >
| < MODIFY : "modify" >
| < NOAUDIT : "noaudit" >
| < NOCOMPRESS : "nocompress" >
| < NOT : "not" >
| < NOWAIT : "nowait" >
| < NULL : "null" >
| < NUMBER : "number" >
| < OF : "of" >
| < OFFLINE : "offline" >
| < ON : "on" >
| < ONLINE : "online" >
| < OPTION : "option" >
| < OR : "or" >
| < ORDER : "order" >
| < PCTFREE : "pctfree" >
| < PRIOR : "prior" >
| < PRIVILEGES : "privileges" >
| < PUBLIC : "public" >
| < RAW : "raw" >
| < RENAME : "rename" >
| < RESOURCE : "resource" >
| < REVOKE : "revoke" >
| < ROW : "row" >
| < ROWID : "rowid" >
| < ROWNUM : "rownum" >
| < ROWS : "rows" >
| < SELECT : "select" >
| < SESSION : "session" >
| < SET : "set" >
| < SHARE : "share" >
| < SIZE : "size" >
| < SMALLINT : "smallint" >
| < START : "start" >
| < SUCCESSFUL : "successful" >
| < SYNONYM : "synonym" >
| < SYSDATE : "sysdate" >
| < TABLE : "table" >
| < THEN : "then" >
| < TO : "to" >
| < TRIGGER : "trigger" >
| < UID : "uid" >
| < UNION : "union" >
| < UNIQUE : "unique" >
| < UPDATE : "update" >
| < USER : "user" >
| < VALIDATE : "validate" >
| < VALUES : "values" >
| < VARCHAR : "varchar" >
| < VARCHAR2 : "varchar2" >
| < VIEW : "view" >
| < WHENEVER : "whenever" >
| < WHERE : "where" >
| < WITH : "with" >
}
/* UNRESERVED KEYWORDS */
TOKEN :
{
< ALWAYS : "always" >
| < ANALYZE : "analyze" >
| < ASSOCIATE : "associate" >
| < AT : "at" >
| < BFILE : "bfile" >
| < BITMAP : "bitmap" >
| < BLOB : "blob" >
| < BODY : "body" >
| < BUFFER_POOL : "buffer_pool" >
| < BYTE : "byte" >
| < CACHE : "cache" >
| < CALL : "call" >
| < CASCADE : "cascade" >
| < CASE : "case" >
| < CHARACTER : "character" >
| < CHUNK : "chunk" >
| < CLOB : "clob" >
| < COLUMN_VALUE : "column_value" >
| < COMMIT : "commit" >
| < COMPUTE : "compute" >
| < CONSTRAINT : "constraint" >
| < CONTEXT : "context" >
| < CONTROLFILE : "controlfile" >
| < CUBE : "cube" >
| < CURRVAL : "currval" >
| < CURSOR : "cursor" >
| < DATABASE : "database" >
| < DAY : "day" >
| < DBTIMEZONE : "dbtimezone" >
| < DEC : "dec" >
| < DEFERRABLE : "deferrable" >
| < DEFERRED : "deferred" >
| < DIMENSION : "dimension" >
| < DIRECTORY : "directory" >
| < DISABLE : "disable" >
| < DISASSOCIATE : "disassociate" >
| < DOUBLE : "double" >
| < ELEMENT : "element" >
| < ENABLE : "enable" >
| < END : "end" >
| < EQUALS_PATH : "equals_path" >
| < ESCAPE : "escape" >
| < EXCEPTIONS : "exceptions" >
| < EXPLAIN : "explain" >
| < EXTERNAL : "external" >
| < FIRST : "first" >
| < FOREIGN : "foreign" >
| < FREELIST : "freelist" >
| < FREELISTS : "freelists" >
| < FREEPOOLS : "freepools" >
| < FUNCTION : "function" >
| < GLOBAL : "global" >
| < GROUPING : "grouping" >
| < GROUPS : "groups" >
| < HASH : "hash" >
| < HEAP : "heap" >
| < HH : "hh" >
| < INCLUDING : "including" >
| < INDEXTYPE : "indextype" >
| < INDICATOR : "indicator" >
| < INITIALLY : "initially" >
| < INITRANS : "initrans" >
| < INT : "int" >
| < INTERVAL : "interval" >
| < JAVA : "java" >
| < KEEP : "keep" >
| < KEY : "key" >
| < LAST : "last" >
| < LESS_STRING : "less" >
| < LEVELS : "levels" >
| < LIBRARY : "library" >
| < LIKE2 : "like2" >
| < LIKE4 : "like4" >
| < LIKEC : "likec" >
| < LIMIT : "limit" >
| < LINK : "link" >
| < LIST : "list" >
| < LOB : "lob" >
| < LOCAL : "local" >
| < LOCATION : "location" >
| < LOCATOR : "locator" >
| < LOG : "log" >
| < LOGGING : "logging" >
| < MAPPING : "mapping" >
| < MATERIALIZED : "materialized" >
| < MAXTRANS : "maxtrans" >
| < MAXVALUE : "maxvalue" >
| < MERGE : "merge" >
| < MINEXTENTS : "minextents" >
| < MM : "mm" >
| < MONITORING : "monitoring" >
| < MONTH : "month" >
| < MOVEMENT : "movement" >
| < NATIONAL : "national" >
| < NCHAR : "nchar" >
| < NCLOB : "nclob" >
| < NESTED : "nested" >
| < NEW : "new" >
| < NEXT : "next" >
| < NEXTVAL : "nextval" >
| < NOCACHE : "nocache" >
| < NOLOGGING : "nologging" >
| < NOMAPPING : "nomapping" >
| < NOMONITORING : "nomonitoring" >
| < NOPARALLEL : "noparallel" >
| < NORELY : "norely" >
| < NOROWDEPENDENCIES : "norowdependencies" >
| < NOSORT : "nosort" >
| < NOVALIDATE : "novalidate" >
| < NULLS : "nulls" >
| < NUMERIC : "numeric" >
| < NVARCHAR2 : "nvarchar2" >
| < OBJECT : "object" >
| < ONLY : "only" >
| < OPERATOR : "operator" >
| < OPTIMAL : "optimal" >
| < ORGANIZATION : "organization" >
| < OUTLINE : "outline" >
| < OVERFLOW : "overflow" >
| < PACKAGE : "package" >
| < PARALLEL : "parallel" >
| < PARAMETERS : "parameters" >
| < PARTITION : "partition" >
| < PARTITIONS : "partitions" >
| < PCTHRESHOLD : "pcthreshold" >
| < PCTINCREASE : "pctincrease" >
| < PCTUSED : "pctused" >
| < PCTVERSION : "pctversion" >
| < PFILE : "pfile" >
| < PRECISION : "precision" >
| < PRESERVE : "preserve" >
| < PRIMARY : "primary" >
| < PROCEDURE : "procedure" >
| < QUOTE : "'" >
| < RANGE : "range" >
| < READS : "reads" >
| < REAL : "real" >
| < RECYCLE : "recycle" >
| < REF : "ref" >
| < REFERENCES : "references" >
| < REJECT : "reject" >
| < RELATIONAL : "relational" >
| < RELY : "rely" >
| < RETENTION : "retention" >
| < RETURN : "return" >
| < REVERSE : "reverse" >
| < ROLE : "role" >
| < ROLLBACK : "rollback" >
| < ROLLUP : "rollup" >
| < ROWDEPENDENCIES : "rowdependencies" >
| < SAVEPOINT : "savepoint" >
| < SCHEMA : "schema" >
| < SCOPE : "scope" >
| < SECOND : "second" >
| < SEGMENT : "segment" >
| < SEQUENCE : "sequence" >
| < SESSIONTIMEZONE : "sessiontimezone" >
| < SETS : "sets" >
| < SHARP : "#" >
| < SIBLINGS : "siblings" >
| < SOME : "some" >
| < SORT : "sort" >
| < SPFILE : "spfile" >
| < STATISTICS : "statistics" >
| < STORAGE : "storage" >
| < STORE : "store" >
| < SUBPARTITION : "subpartition" >
| < SUBPARTITIONS : "subpartitions" >
| < SUBSTITUTABLE : "substitutable" >
| < SUPPLEMENTAL : "supplemental" >
| < TABLESPACE : "tablespace" >
| < TEMPLATE : "template" >
| < TEMPORARY : "temporary" >
| < THAN : "than" >
| < TIME : "time" >
| < TIMESTAMP : "timestamp" >
| < TRUNCATE : "truncate" >
| < TYPE : "type" >
| < UNDER_PATH : "under_path" >
| < UNLIMITED : "unlimited" >
| < UROWID : "urowid" >
| < USING : "using" >
| < VALUE : "value" >
| < VARRAY : "varray" >
| < VARYING : "varying" >
| < WHEN : "when" >
| < XMLSCHEMA : "xmlschema" >
| < XMLTYPE : "xmltype" >
| < YEAR : "year" >
| < ZONE : "zone" >
}
TOKEN: /* Separators and operators */
{
< ASSIGN: ":=" >
| < CONCAT: "||" >
| < SEMICOLON: ";" >
| < DOT: "." >
| < ROWTYPE: "%ROWTYPE" >
| < TILDE: "~" >
| < JOINPLUS: "(+)" >
| < OPENPAREN: "(" >
| < CLOSEPAREN: ")" >
| < ASTERISK: "*" >
| < SLASH: "/" >
| < PLUS: "+" >
| < MINUS_OP: "-" >
| < QUESTIONMARK: "?" >
| < LESS: "<" >
| < LESSEQUAL: "<=" >
| < GREATER: ">" >
| < GREATEREQUAL: ">=" >
| < EQUAL: "=" >
| < NOTEQUAL: "!=" >
| < NOTEQUAL2: "<>" >
}
/* IDENTIFIER */
TOKEN:
{
< IDENTIFIER: ( )+ ( | |)* >
| < LETTER: ["a"-"z", "A"-"Z"] >
| < #SPECIAL_CHARS: "$" | "_">
| < BIND: ":" ("." )? >
| < CHAR_LITERAL: "'" (~["'"])* "'" ("'" (~["'"])* "'")*>
| < QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])* "\"" >
}
/* Numeric Constants */
TOKEN:
{
< DIGIT : [ "0" - "9" ] >
}
/***********************************************
* THE ORACLE CREATE TABLE GRAMMAR STARTS HERE *
***********************************************/
/*
* @param tableMap - map
*/
void SQLSheet(HashMap tableMap) :
{}
{
(
(
LOOKAHEAD(4)
CreateTableStatement(tableMap) ( "/" | ";" )
| LOOKAHEAD(3)
CreateIndexStatement() ( "/" | ";" )
| LOOKAHEAD(2)
SkipUnsupportedStatement()
)
)*
}
/*
* here we only deal with relation table creation
*/
void CreateTableStatement(HashMap tableMap) :
{
String tableName = null;
TableInfo tableInfo = null;
}
{
"create" [ "global" "temporary" ]
"table" [ LOOKAHEAD(2) Schema() "." ]
tableName = Table()
{
tableInfo = new TableInfo(tableName.toLowerCase());
tableMap.put(tableName.toLowerCase(), tableInfo);
}
[ "(" RelationalProperties(tableInfo) ")" ]
[ "on" "commit" ( "delete" | "preserve" ) "rows" ]
(LOOKAHEAD( PhysicalProperties() ) PhysicalProperties() | {})
(LOOKAHEAD( TableProperties(tableInfo) ) TableProperties(tableInfo) | {})
}
void SkipUnsupportedStatement() :
{}
{
(
(
|
|
| [ ]
|
|
|
|
|
|
| [ ]
|
|
| [ ]
|
|
|
|
|
|
|
|
|
|
|
| [ ]
|
|
)
| | | | |
| | | | |
| | | | | |
| | | | |