001package gudusoft.gsqlparser.nodes;
002
003
004import gudusoft.gsqlparser.*;
005import gudusoft.gsqlparser.nodes.flink.TFlinkWithClause;
006import gudusoft.gsqlparser.nodes.hive.*;
007import gudusoft.gsqlparser.nodes.oracle.TPhysicalProperties;
008import gudusoft.gsqlparser.nodes.postgresql.TPartitionBoundSpecSqlNode;
009import gudusoft.gsqlparser.nodes.teradata.TIndexDefinition;
010import gudusoft.gsqlparser.stmt.TCreateTableSqlStatement;
011import gudusoft.gsqlparser.nodes.postgresql.TInheritsClause;
012
013import java.util.ArrayList;
014import java.util.EnumSet;
015
016public class TCreateTableSqlNode extends TParseTreeNode {
017
018    private TDistributeBy distributeBy;
019
020    public void setDistributeBy(TDistributeBy distributeBy) {
021        this.distributeBy = distributeBy;
022    }
023
024    public TDistributeBy getDistributeBy() {
025        return distributeBy;
026    }
027
028    private TBaseTablePartition tablePartition;
029
030    public void setTablePartition(TBaseTablePartition tablePartition) {
031        this.tablePartition = tablePartition;
032    }
033
034    public TBaseTablePartition getTablePartition() {
035        return tablePartition;
036    }
037
038    public void setPartitionBoundSpec(TPartitionBoundSpecSqlNode partitionBoundSpec) {
039        this.partitionBoundSpec = partitionBoundSpec;
040    }
041
042    public TPartitionBoundSpecSqlNode getPartitionBoundSpec() {
043        return partitionBoundSpec;
044    }
045
046    /**
047     * postgresql PartitionBoundSpec
048     * https://www.postgresql.org/docs/current/sql-createtable.html
049     */
050    private TPartitionBoundSpecSqlNode partitionBoundSpec;
051
052    public TTableProperties getTableProperties() {
053        return tableProperties;
054    }
055
056    public void setTableProperties(TTableProperties tableProperties) {
057        this.tableProperties = tableProperties;
058    }
059
060    private TTableProperties tableProperties;
061
062    private ArrayList<TConstant> locationFiles;
063
064    public void setLocationFiles(ArrayList<TConstant> locationFiles) {
065        this.locationFiles = locationFiles;
066    }
067
068    public ArrayList<TConstant> getLocationFiles() {
069        return locationFiles;
070    }
071
072    public void setOptionStartParenthesis(TSourceToken optionStartParenthesis) {
073        this.optionStartParenthesis = optionStartParenthesis;
074    }
075
076    public void setOptionEndParenthesis(TSourceToken optionEndParenthesis) {
077        this.optionEndParenthesis = optionEndParenthesis;
078    }
079
080    public TSourceToken getOptionStartParenthesis() {
081        return optionStartParenthesis;
082    }
083
084    public TSourceToken getOptionEndParenthesis() {
085        return optionEndParenthesis;
086    }
087
088    private TSourceToken optionStartParenthesis;
089    private TSourceToken optionEndParenthesis;
090
091    private TCreateTableSqlStatement.TableSourceType tableSourceType = TCreateTableSqlStatement.TableSourceType.normal;
092
093    private TObjectName cloneSourceTable = null;
094
095    private TDummy netezzaExternalTableOption = null;
096
097    public void setCloneSourceTable(TObjectName cloneSourceTable) {
098        this.cloneSourceTable = cloneSourceTable;
099        this.tableSourceType = TCreateTableSqlStatement.TableSourceType.clone;
100    }
101
102    public TObjectName getCloneSourceTable() {
103        return cloneSourceTable;
104    }
105
106    public void setNetezzaExternalTableOption(TDummy netezzaExternalTableOption) {
107        this.netezzaExternalTableOption = netezzaExternalTableOption;
108    }
109
110    public TDummy getNetezzaExternalTableOption() {
111        return netezzaExternalTableOption;
112    }
113
114    public TObjectName getComment(){
115        return this.tableComment;
116    }
117    public void setTableOptions(ArrayList<TCreateTableOption> tableOptions, boolean enableAppend) {
118        if (tableOptions == null) return;
119        for(TCreateTableOption option:tableOptions){
120            if (option.getCreateTableOptionType() == ECreateTableOption.etoComment){
121                this.tableComment = option.getComment();
122            }
123        }
124
125        if ((enableAppend) && (this.tableOptions != null)){
126            this.tableOptions.addAll(tableOptions);
127        }else{
128            this.tableOptions = tableOptions;
129        }
130    }
131
132    public void setTableOptions(ArrayList<TCreateTableOption> tableOptions) {
133
134        this.setTableOptions(tableOptions,false);
135//        if (tableOptions == null) return;
136//        for(TCreateTableOption option:tableOptions){
137//            if (option.getCreateTableOptionType() == ECreateTableOption.etoComment){
138//                this.tableComment = option.getComment();
139//            }
140//        }
141//
142//        this.tableOptions = tableOptions;
143
144    }
145
146    public void appendTableOption(TCreateTableOption tableOption) {
147        if (tableOption == null) return;
148        if (tableOptions == null){
149            tableOptions = new ArrayList<>();
150        }
151        tableOptions.add(tableOption);
152    }
153
154    public void addTableOptionByToken(TSourceToken st, ECreateTableOption createTableOption){
155        if (st == null) return;
156
157        TCreateTableOption newOption = new TCreateTableOption();
158        newOption.init(createTableOption,st);
159        switch (createTableOption){
160            case etoFileFormat:
161                newOption.setFileFormatType(st);
162                break;
163            case etoEncoding:
164                newOption.setEncoding(st);
165                break;
166        }
167
168        if (tableOptions == null){
169            tableOptions = new ArrayList<>();
170        }
171
172        tableOptions.add(newOption);
173    }
174    public ArrayList<TCreateTableOption> getTableOptions() {
175        return tableOptions;
176    }
177
178    private ArrayList<TCreateTableOption> tableOptions;
179
180    public void setOnFilegroup(TDummy onFilegroup) {
181        this.onFilegroup = onFilegroup;
182    }
183
184    public TDummy getOnFilegroup() {
185        return onFilegroup;
186    }
187
188    private TDummy onFilegroup = null;
189
190    private TPhysicalProperties physicalProperties;
191
192    public void setPhysicalProperties(TPhysicalProperties physicalProperties) {
193        this.physicalProperties = physicalProperties;
194    }
195
196    public void setTableOption(TCreateTableOption option){
197        if (option == null) return;
198        if (this.tableOptions == null){
199            this.tableOptions = new ArrayList<>();
200        }
201        this.tableOptions.add(option);
202    }
203
204    /**
205     * Oracle physical properties
206     *
207     * @return Oracle physical properties
208     */
209    public TPhysicalProperties getPhysicalProperties() {
210        return physicalProperties;
211    }
212
213    public void setTableKindByToken(TSourceToken st){
214        if (st == null) return;
215        if (st.toString().equalsIgnoreCase("set")){
216            tableKinds.add(ETableKind.etkSet);
217        }else if (st.toString().equalsIgnoreCase("multiset")){
218            tableKinds.add(ETableKind.etkMultiset);
219        }else if (st.toString().equalsIgnoreCase("volatile")){
220            tableKinds.add(ETableKind.etkVolatile);
221        }else if (st.toString().equalsIgnoreCase("global")){
222            tableKinds.add(ETableKind.etkGlobalTemporary);
223        }else if (st.toString().equalsIgnoreCase("temporary")){
224            tableKinds.add(ETableKind.etkTemporary);
225        }else if (st.toString().equalsIgnoreCase("temp")){
226            tableKinds.add(ETableKind.etkTemp);
227        }else if (st.toString().equalsIgnoreCase("external")){
228            tableKinds.add(ETableKind.etkExternal);
229            this.external = true;
230        }
231    }
232    public void setTableKindByNode(TDummy node) {
233        if ((TDummy) node.node1 == null) return;
234        TDummy node2 = (TDummy) node.node1;
235        setTableKindByToken(node2.st1);
236        setTableKindByToken(node2.st2);
237    }
238
239    private EnumSet<ETableKind> tableKinds = EnumSet.noneOf(ETableKind.class);
240
241    public void setTableKinds(EnumSet<ETableKind> tableKinds) {
242        this.tableKinds = tableKinds;
243    }
244
245    public EnumSet<ETableKind> getTableKinds() {
246
247        return tableKinds;
248    }
249
250    //private TObjectName asTableName;
251    private TTable asTable = null;
252
253    public TTable getAsTable() {
254        return asTable;
255    }
256
257    public void setAsTableName(TObjectName asTableName) {
258        asTable = new TTable();
259        asTableName.setObjectType(TObjectName.ttobjTable);
260        asTable.setTableName(asTableName);
261        asTable.setTableType(ETableSource.objectname);
262        asTable.setEffectType(ETableEffectType.tetCreateAs);
263    }
264
265
266
267    public void setExternalTable(boolean externalTable) {
268        this.externalTable = externalTable;
269    }
270
271    /**
272     * @deprecated As of v1.9.7.2 , replace by {@link #isExternal}
273     *
274     * @return true if it's an external table
275     */
276    public boolean isExternalTable() {
277
278        return externalTable;
279    }
280
281    private boolean externalTable;
282
283    private ArrayList <TIndexDefinition> indexDefinitions;
284
285    public void setIndexDefinitions(ArrayList<TIndexDefinition> indexDefinitions) {
286        this.indexDefinitions = indexDefinitions;
287    }
288
289    public ArrayList<TIndexDefinition> getIndexDefinitions() {
290
291        return indexDefinitions;
292    }
293
294    private boolean readable = false;
295    private boolean writable = false;
296    private boolean webTable = false;
297
298    public void setWebTable(boolean webTable) {
299        this.webTable = webTable;
300    }
301
302    public boolean isWebTable() {
303        return webTable;
304    }
305
306    private TConstant executeCmd;
307
308    public void setExecuteCmd(TConstant executeCmd) {
309        this.executeCmd = executeCmd;
310    }
311
312    public TConstant getExecuteCmd() {
313        return executeCmd;
314    }
315
316    public void setReadWritableByToken(TSourceToken st){
317        if (st == null) return;
318        if (st.toString().equalsIgnoreCase("readable")){
319            readable = true;
320        }else if (st.toString().equalsIgnoreCase("writable")){
321            writable = true;
322        }
323    }
324
325    public boolean isReadable() {
326        return readable;
327    }
328
329    public boolean isWritable() {
330        return writable;
331    }
332
333    private boolean external;
334    private boolean ifNotExists;
335    private TObjectName tableLocation;
336    private TObjectName tableComment;
337    private THiveTableProperties hiveTableProperties;
338    private THiveTablePartition hiveTablePartition;
339    private THiveTableBuckets hiveTableBuckets;
340    private THiveTableSkewed hiveTableSkewed;
341    private THiveRowFormat hiveRowFormat;
342    private THiveTableFileFormat hiveTableFileFormat;
343    private TObjectName likeTableName;
344
345    public void setDummyOfTemp(TDummy dummy){
346        if (dummy == null) return;
347        if (dummy.st1.toString().equalsIgnoreCase("external")){
348            this.external = true;
349        }
350    }
351
352    public void setExternal(boolean external) {
353        this.external = external;
354    }
355
356    public void setHiveRowFormat(THiveRowFormat hiveRowFormat) {
357        this.hiveRowFormat = hiveRowFormat;
358    }
359
360    public void setHiveTableBuckets(THiveTableBuckets hiveTableBuckets) {
361        this.hiveTableBuckets = hiveTableBuckets;
362    }
363
364    public void setHiveTableFileFormat(THiveTableFileFormat hiveTableFileFormat) {
365        this.hiveTableFileFormat = hiveTableFileFormat;
366    }
367
368    public void setHiveTablePartition(THiveTablePartition hiveTablePartition) {
369        this.hiveTablePartition = hiveTablePartition;
370    }
371
372    public void setHiveTableProperties(THiveTableProperties hiveTableProperties) {
373        this.hiveTableProperties = hiveTableProperties;
374    }
375
376    public void setHiveTableSkewed(THiveTableSkewed hiveTableSkewed) {
377        this.hiveTableSkewed = hiveTableSkewed;
378    }
379
380    public void setIfNotExists(boolean ifNotExists) {
381        this.ifNotExists = ifNotExists;
382    }
383
384    public void setLikeTableName(TObjectName likeTableName) {
385        if ((likeTableName != null)&&(tableSourceType == TCreateTableSqlStatement.TableSourceType.normal)){
386           tableSourceType = TCreateTableSqlStatement.TableSourceType.like;
387        }
388        this.likeTableName = likeTableName;
389    }
390
391    public void setTableComment(TObjectName tableComment) {
392        this.tableComment = tableComment;
393    }
394
395    public void setTableLocation(TObjectName tableLocation) {
396        this.tableLocation = tableLocation;
397    }
398
399    public boolean isExternal() {
400
401        return external;
402    }
403
404    public THiveRowFormat getHiveRowFormat() {
405        return hiveRowFormat;
406    }
407
408    public THiveTableBuckets getHiveTableBuckets() {
409        return hiveTableBuckets;
410    }
411
412    public THiveTableFileFormat getHiveTableFileFormat() {
413        return hiveTableFileFormat;
414    }
415
416    public THiveTablePartition getHiveTablePartition() {
417        return hiveTablePartition;
418    }
419
420    public THiveTableProperties getHiveTableProperties() {
421        return hiveTableProperties;
422    }
423
424    public THiveTableSkewed getHiveTableSkewed() {
425        return hiveTableSkewed;
426    }
427
428    public boolean isIfNotExists() {
429        return ifNotExists;
430    }
431
432    public TObjectName getLikeTableName() {
433        return likeTableName;
434    }
435
436    public TObjectName getTableComment() {
437        return tableComment;
438    }
439
440    public TObjectName getTableLocation() {
441        return tableLocation;
442    }
443
444    private TObjectName rowTypeName;
445    private TObjectName superTableName;
446
447    public void setRowTypeName(TObjectName rowTypeName) {
448        this.rowTypeName = rowTypeName;
449    }
450
451    public void setSuperTableName(TObjectName superTableName) {
452        this.superTableName = superTableName;
453    }
454
455    public TObjectName getRowTypeName() {
456
457        return rowTypeName;
458    }
459
460    public TObjectName getSuperTableName() {
461        return superTableName;
462    }
463
464
465    private TPTNodeList <TMySQLCreateTableOption> mySQLTableOptionList;
466
467    public void setMySQLTableOptionList(TPTNodeList<TMySQLCreateTableOption> mySQLTableOptionList) {
468        this.mySQLTableOptionList = mySQLTableOptionList;
469    }
470
471    public TPTNodeList<TMySQLCreateTableOption> getMySQLTableOptionList() {
472
473        return mySQLTableOptionList;
474    }
475
476    private TTable table = null;
477
478    public void setTableElementList(TTableElementList tableElementList) {
479        this.tableElementList = tableElementList;
480    }
481
482    private TTableElementList tableElementList = null;
483
484    public TObjectNameList getColumnList() {
485        return columnList;
486    }
487
488    public TTableElementList getTableElementList() {
489        return tableElementList;
490    }
491
492    public TTable getTable() {
493
494        return table;
495    }
496
497    public void setColumnList(TObjectNameList columnList) {
498        this.columnList = columnList;
499    }
500
501    public TSelectSqlNode getSubQueryNode() {
502        return subQueryNode;
503    }
504
505    private TObjectNameList columnList = null;
506    private TSelectSqlNode subQueryNode = null;
507
508    public void setExecuteSqlNode(TExecuteSqlNode executeSqlNode) {
509        this.executeSqlNode = executeSqlNode;
510    }
511
512    public TExecuteSqlNode getExecuteSqlNode() {
513
514        return executeSqlNode;
515    }
516
517    private TExecuteSqlNode executeSqlNode = null;//greenplum
518
519    public void setSubQueryNode(TSelectSqlNode subQueryNode) {
520        if (subQueryNode != null){
521            this.subQueryNode = subQueryNode;
522            tableSourceType = TCreateTableSqlStatement.TableSourceType.subquery;
523        }
524
525    }
526
527    public void init(Object arg1)
528    {
529        table = new TTable();
530        ((TObjectName)arg1).setObjectType(TObjectName.ttobjTable);
531        table.setTableName((TObjectName)arg1);
532        table.setTableType(ETableSource.objectname);
533        table.setEffectType(ETableEffectType.tetCreate);
534        table.setGsqlparser(((TObjectName)arg1).getGsqlparser());
535        if (table.getTableName().toString().startsWith("##")){
536            // SQL Server global temporary table (##tablename)
537            this.getTableKinds().add(ETableKind.etkGlobalTemporary);
538            table.getTableName().setTableKind(ETableKind.etkGlobalTemporary);
539        } else if (table.getTableName().toString().startsWith("#")){
540            // SQL Server local temporary table (#tablename)
541            this.getTableKinds().add(ETableKind.etkTemporary);
542            table.getTableName().setTableKind(ETableKind.etkTemporary);
543        }
544    }
545
546    public TCreateTableSqlStatement.TableSourceType getTableSourceType() {
547        return tableSourceType;
548    }
549
550    public void init(Object arg1, Object arg2){
551        tableSourceType = (TCreateTableSqlStatement.TableSourceType)arg1;
552        init(arg2);
553    }
554
555    public void setInheritsClause(TInheritsClause inheritsClause) {
556        this.inheritsClause = inheritsClause;
557    }
558
559    public TInheritsClause getInheritsClause() {
560        return inheritsClause;
561    }
562
563    private TInheritsClause inheritsClause;
564
565    /**
566     * Flink WITH clause for connector properties
567     */
568    private TFlinkWithClause flinkWithClause;
569
570    /**
571     * Get the Flink WITH clause containing connector properties.
572     * @return the Flink WITH clause, or null if not present
573     */
574    public TFlinkWithClause getFlinkWithClause() {
575        return flinkWithClause;
576    }
577
578    /**
579     * Set the Flink WITH clause.
580     * @param flinkWithClause the Flink WITH clause
581     */
582    public void setFlinkWithClause(TFlinkWithClause flinkWithClause) {
583        this.flinkWithClause = flinkWithClause;
584    }
585}