@@ -495,6 +495,8 @@ class TConverter : public IPGParseEvents {
495
495
return ParseTransactionStmt (CAST_NODE (TransactionStmt, node));
496
496
case T_IndexStmt:
497
497
return ParseIndexStmt (CAST_NODE (IndexStmt, node)) != nullptr ;
498
+ case T_CreateSeqStmt:
499
+ return ParseCreateSeqStmt (CAST_NODE (CreateSeqStmt, node)) != nullptr ;
498
500
default :
499
501
NodeNotImplemented (value, node);
500
502
return false ;
@@ -2650,6 +2652,87 @@ class TConverter : public IPGParseEvents {
2650
2652
return State.Statements .back ();
2651
2653
}
2652
2654
2655
+ [[nodiscard]]
2656
+ TAstNode* ParseCreateSeqStmt (const CreateSeqStmt* value) {
2657
+
2658
+ std::vector<TAstNode*> options;
2659
+
2660
+ TString mode = (value->if_not_exists ) ? " create_if_not_exists" : " create" ;
2661
+ options.push_back (QL (QA (" mode" ), QA (mode)));
2662
+
2663
+ auto [sink, key] = ParseQualifiedPgObjectName (
2664
+ value->sequence ->catalogname ,
2665
+ value->sequence ->schemaname ,
2666
+ value->sequence ->relname ,
2667
+ " pgSequence"
2668
+ );
2669
+
2670
+ if (!sink || !key) {
2671
+ return nullptr ;
2672
+ }
2673
+
2674
+ const auto relPersistence = static_cast <NPg::ERelPersistence>(value->sequence ->relpersistence );
2675
+ switch (relPersistence) {
2676
+ case NPg::ERelPersistence::Temp:
2677
+ options.push_back (QL (QA (" temporary" )));
2678
+ break ;
2679
+ case NPg::ERelPersistence::Unlogged:
2680
+ AddError (" UNLOGGED sequence not supported" );
2681
+ return nullptr ;
2682
+ break ;
2683
+ case NPg::ERelPersistence::Permanent:
2684
+ break ;
2685
+ }
2686
+
2687
+ for (int i = 0 ; i < ListLength (value->options ); ++i) {
2688
+ auto rawNode = ListNodeNth (value->options , i);
2689
+
2690
+ switch (NodeTag (rawNode)) {
2691
+ case T_DefElem: {
2692
+ const auto * defElem = CAST_NODE (DefElem, rawNode);
2693
+ TStringBuf nameElem = defElem->defname ;
2694
+ if (defElem->arg ) {
2695
+ switch (NodeTag (defElem->arg ))
2696
+ {
2697
+ case T_Integer:
2698
+ options.emplace_back (QL (QA (nameElem), QA (ToString (intVal (defElem->arg )))));
2699
+ break ;
2700
+ case T_Float:
2701
+ options.emplace_back (QL (QA (nameElem), QA (strVal (defElem->arg ))));
2702
+ break ;
2703
+ case T_TypeName: {
2704
+ const auto * typeName = reinterpret_cast <PG_TypeName*>(defElem->arg );
2705
+ options.emplace_back (QL (QA (nameElem),
2706
+ QA (StrVal (ListNodeNth (typeName->names , ListLength (typeName->names ) - 1 )))));
2707
+ break ;
2708
+ }
2709
+ default :
2710
+ NodeNotImplemented (defElem->arg );
2711
+ return nullptr ;
2712
+ }
2713
+ }
2714
+ break ;
2715
+ }
2716
+ default :
2717
+ NodeNotImplemented (rawNode);
2718
+ return nullptr ;
2719
+ }
2720
+ }
2721
+
2722
+ if (value->for_identity ) {
2723
+ options.push_back (QL (QA (" for_identity" )));
2724
+ }
2725
+
2726
+ options.push_back (QL (QA (" owner_id" ), QA (ToString (value->ownerId ))));
2727
+
2728
+ State.Statements .push_back (
2729
+ L (A (" let" ), A (" world" ),
2730
+ L (A (" Write!" ), A (" world" ), sink, key, L (A (" Void" )),
2731
+ QVL (options.data (), options.size ()))));
2732
+
2733
+ return State.Statements .back ();
2734
+ }
2735
+
2653
2736
TFromDesc ParseFromClause (const Node* node) {
2654
2737
switch (NodeTag (node)) {
2655
2738
case T_RangeVar:
@@ -4780,7 +4863,7 @@ TVector<NYql::TAstParseResult> PGToYqlStatements(const TString& query, const NSQ
4780
4863
TConverter converter (results, settings, query, stmtParseInfo, true );
4781
4864
NYql::PGParse (query, converter);
4782
4865
for (auto & res : results) {
4783
- res.ActualSyntaxType = NYql::ESyntaxType::Pg;
4866
+ res.ActualSyntaxType = NYql::ESyntaxType::Pg;
4784
4867
}
4785
4868
return results;
4786
4869
}
0 commit comments