From 42711e47aaa816dc73a4e2f24b0f1bbd91bb8c98 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Tue, 20 Jan 2026 11:50:56 +0000 Subject: [PATCH] Add PostgreSQL 18 support (dev branch) - Add versions/18 directory with package.json pointing to 18-latest-dev branch - Update fetch-protos.js to include version 18 and handle dev branches - Add protos/18/pg_query.proto fetched from 18-latest-dev branch - Copy templates and configuration files for version 18 - WASM build and tests passing (41/41 tests) Note: This is a development branch tracking pganalyze/libpg_query 18-latest-dev which is still WIP (3/12 tasks complete). Core SQL parsing works but PL/pgSQL type support is incomplete. --- protos/18/pg_query.proto | 4234 ++++++++++++++++++++++++++++++ scripts/fetch-protos.js | 8 +- versions/18/LICENSE | 22 + versions/18/Makefile | 99 + versions/18/package.json | 52 + versions/18/scripts/build.js | 39 + versions/18/src/index.ts | 315 +++ versions/18/src/libpg-query.d.ts | 22 + versions/18/src/wasm_wrapper.c | 47 + versions/18/test/errors.test.js | 325 +++ versions/18/test/parsing.test.js | 89 + versions/18/tsconfig.esm.json | 9 + versions/18/tsconfig.json | 18 + 13 files changed, 5276 insertions(+), 3 deletions(-) create mode 100644 protos/18/pg_query.proto create mode 100644 versions/18/LICENSE create mode 100644 versions/18/Makefile create mode 100644 versions/18/package.json create mode 100644 versions/18/scripts/build.js create mode 100644 versions/18/src/index.ts create mode 100644 versions/18/src/libpg-query.d.ts create mode 100644 versions/18/src/wasm_wrapper.c create mode 100644 versions/18/test/errors.test.js create mode 100644 versions/18/test/parsing.test.js create mode 100644 versions/18/tsconfig.esm.json create mode 100644 versions/18/tsconfig.json diff --git a/protos/18/pg_query.proto b/protos/18/pg_query.proto new file mode 100644 index 00000000..3f8bf1a4 --- /dev/null +++ b/protos/18/pg_query.proto @@ -0,0 +1,4234 @@ +// This file is autogenerated by ./scripts/generate_protobuf_and_funcs.rb + +syntax = "proto3"; + +package pg_query; + +message ParseResult { + int32 version = 1; + repeated RawStmt stmts = 2; +} + +message ScanResult { + int32 version = 1; + repeated ScanToken tokens = 2; +} + +message Node { + oneof node { + Alias alias = 1 [json_name="Alias"]; + RangeVar range_var = 2 [json_name="RangeVar"]; + TableFunc table_func = 3 [json_name="TableFunc"]; + IntoClause into_clause = 4 [json_name="IntoClause"]; + Var var = 5 [json_name="Var"]; + Param param = 6 [json_name="Param"]; + Aggref aggref = 7 [json_name="Aggref"]; + GroupingFunc grouping_func = 8 [json_name="GroupingFunc"]; + WindowFunc window_func = 9 [json_name="WindowFunc"]; + WindowFuncRunCondition window_func_run_condition = 10 [json_name="WindowFuncRunCondition"]; + MergeSupportFunc merge_support_func = 11 [json_name="MergeSupportFunc"]; + SubscriptingRef subscripting_ref = 12 [json_name="SubscriptingRef"]; + FuncExpr func_expr = 13 [json_name="FuncExpr"]; + NamedArgExpr named_arg_expr = 14 [json_name="NamedArgExpr"]; + OpExpr op_expr = 15 [json_name="OpExpr"]; + DistinctExpr distinct_expr = 16 [json_name="DistinctExpr"]; + NullIfExpr null_if_expr = 17 [json_name="NullIfExpr"]; + ScalarArrayOpExpr scalar_array_op_expr = 18 [json_name="ScalarArrayOpExpr"]; + BoolExpr bool_expr = 19 [json_name="BoolExpr"]; + SubLink sub_link = 20 [json_name="SubLink"]; + SubPlan sub_plan = 21 [json_name="SubPlan"]; + AlternativeSubPlan alternative_sub_plan = 22 [json_name="AlternativeSubPlan"]; + FieldSelect field_select = 23 [json_name="FieldSelect"]; + FieldStore field_store = 24 [json_name="FieldStore"]; + RelabelType relabel_type = 25 [json_name="RelabelType"]; + CoerceViaIO coerce_via_io = 26 [json_name="CoerceViaIO"]; + ArrayCoerceExpr array_coerce_expr = 27 [json_name="ArrayCoerceExpr"]; + ConvertRowtypeExpr convert_rowtype_expr = 28 [json_name="ConvertRowtypeExpr"]; + CollateExpr collate_expr = 29 [json_name="CollateExpr"]; + CaseExpr case_expr = 30 [json_name="CaseExpr"]; + CaseWhen case_when = 31 [json_name="CaseWhen"]; + CaseTestExpr case_test_expr = 32 [json_name="CaseTestExpr"]; + ArrayExpr array_expr = 33 [json_name="ArrayExpr"]; + RowExpr row_expr = 34 [json_name="RowExpr"]; + RowCompareExpr row_compare_expr = 35 [json_name="RowCompareExpr"]; + CoalesceExpr coalesce_expr = 36 [json_name="CoalesceExpr"]; + MinMaxExpr min_max_expr = 37 [json_name="MinMaxExpr"]; + SQLValueFunction sqlvalue_function = 38 [json_name="SQLValueFunction"]; + XmlExpr xml_expr = 39 [json_name="XmlExpr"]; + JsonFormat json_format = 40 [json_name="JsonFormat"]; + JsonReturning json_returning = 41 [json_name="JsonReturning"]; + JsonValueExpr json_value_expr = 42 [json_name="JsonValueExpr"]; + JsonConstructorExpr json_constructor_expr = 43 [json_name="JsonConstructorExpr"]; + JsonIsPredicate json_is_predicate = 44 [json_name="JsonIsPredicate"]; + JsonBehavior json_behavior = 45 [json_name="JsonBehavior"]; + JsonExpr json_expr = 46 [json_name="JsonExpr"]; + JsonTablePath json_table_path = 47 [json_name="JsonTablePath"]; + JsonTablePathScan json_table_path_scan = 48 [json_name="JsonTablePathScan"]; + JsonTableSiblingJoin json_table_sibling_join = 49 [json_name="JsonTableSiblingJoin"]; + NullTest null_test = 50 [json_name="NullTest"]; + BooleanTest boolean_test = 51 [json_name="BooleanTest"]; + MergeAction merge_action = 52 [json_name="MergeAction"]; + CoerceToDomain coerce_to_domain = 53 [json_name="CoerceToDomain"]; + CoerceToDomainValue coerce_to_domain_value = 54 [json_name="CoerceToDomainValue"]; + SetToDefault set_to_default = 55 [json_name="SetToDefault"]; + CurrentOfExpr current_of_expr = 56 [json_name="CurrentOfExpr"]; + NextValueExpr next_value_expr = 57 [json_name="NextValueExpr"]; + InferenceElem inference_elem = 58 [json_name="InferenceElem"]; + ReturningExpr returning_expr = 59 [json_name="ReturningExpr"]; + TargetEntry target_entry = 60 [json_name="TargetEntry"]; + RangeTblRef range_tbl_ref = 61 [json_name="RangeTblRef"]; + JoinExpr join_expr = 62 [json_name="JoinExpr"]; + FromExpr from_expr = 63 [json_name="FromExpr"]; + OnConflictExpr on_conflict_expr = 64 [json_name="OnConflictExpr"]; + Query query = 65 [json_name="Query"]; + TypeName type_name = 66 [json_name="TypeName"]; + ColumnRef column_ref = 67 [json_name="ColumnRef"]; + ParamRef param_ref = 68 [json_name="ParamRef"]; + A_Expr a_expr = 69 [json_name="A_Expr"]; + TypeCast type_cast = 70 [json_name="TypeCast"]; + CollateClause collate_clause = 71 [json_name="CollateClause"]; + RoleSpec role_spec = 72 [json_name="RoleSpec"]; + FuncCall func_call = 73 [json_name="FuncCall"]; + A_Star a_star = 74 [json_name="A_Star"]; + A_Indices a_indices = 75 [json_name="A_Indices"]; + A_Indirection a_indirection = 76 [json_name="A_Indirection"]; + A_ArrayExpr a_array_expr = 77 [json_name="A_ArrayExpr"]; + ResTarget res_target = 78 [json_name="ResTarget"]; + MultiAssignRef multi_assign_ref = 79 [json_name="MultiAssignRef"]; + SortBy sort_by = 80 [json_name="SortBy"]; + WindowDef window_def = 81 [json_name="WindowDef"]; + RangeSubselect range_subselect = 82 [json_name="RangeSubselect"]; + RangeFunction range_function = 83 [json_name="RangeFunction"]; + RangeTableFunc range_table_func = 84 [json_name="RangeTableFunc"]; + RangeTableFuncCol range_table_func_col = 85 [json_name="RangeTableFuncCol"]; + RangeTableSample range_table_sample = 86 [json_name="RangeTableSample"]; + ColumnDef column_def = 87 [json_name="ColumnDef"]; + TableLikeClause table_like_clause = 88 [json_name="TableLikeClause"]; + IndexElem index_elem = 89 [json_name="IndexElem"]; + DefElem def_elem = 90 [json_name="DefElem"]; + LockingClause locking_clause = 91 [json_name="LockingClause"]; + XmlSerialize xml_serialize = 92 [json_name="XmlSerialize"]; + PartitionElem partition_elem = 93 [json_name="PartitionElem"]; + PartitionSpec partition_spec = 94 [json_name="PartitionSpec"]; + PartitionBoundSpec partition_bound_spec = 95 [json_name="PartitionBoundSpec"]; + PartitionRangeDatum partition_range_datum = 96 [json_name="PartitionRangeDatum"]; + PartitionCmd partition_cmd = 97 [json_name="PartitionCmd"]; + RangeTblEntry range_tbl_entry = 98 [json_name="RangeTblEntry"]; + RTEPermissionInfo rtepermission_info = 99 [json_name="RTEPermissionInfo"]; + RangeTblFunction range_tbl_function = 100 [json_name="RangeTblFunction"]; + TableSampleClause table_sample_clause = 101 [json_name="TableSampleClause"]; + WithCheckOption with_check_option = 102 [json_name="WithCheckOption"]; + SortGroupClause sort_group_clause = 103 [json_name="SortGroupClause"]; + GroupingSet grouping_set = 104 [json_name="GroupingSet"]; + WindowClause window_clause = 105 [json_name="WindowClause"]; + RowMarkClause row_mark_clause = 106 [json_name="RowMarkClause"]; + WithClause with_clause = 107 [json_name="WithClause"]; + InferClause infer_clause = 108 [json_name="InferClause"]; + OnConflictClause on_conflict_clause = 109 [json_name="OnConflictClause"]; + CTESearchClause ctesearch_clause = 110 [json_name="CTESearchClause"]; + CTECycleClause ctecycle_clause = 111 [json_name="CTECycleClause"]; + CommonTableExpr common_table_expr = 112 [json_name="CommonTableExpr"]; + MergeWhenClause merge_when_clause = 113 [json_name="MergeWhenClause"]; + ReturningOption returning_option = 114 [json_name="ReturningOption"]; + ReturningClause returning_clause = 115 [json_name="ReturningClause"]; + TriggerTransition trigger_transition = 116 [json_name="TriggerTransition"]; + JsonOutput json_output = 117 [json_name="JsonOutput"]; + JsonArgument json_argument = 118 [json_name="JsonArgument"]; + JsonFuncExpr json_func_expr = 119 [json_name="JsonFuncExpr"]; + JsonTablePathSpec json_table_path_spec = 120 [json_name="JsonTablePathSpec"]; + JsonTable json_table = 121 [json_name="JsonTable"]; + JsonTableColumn json_table_column = 122 [json_name="JsonTableColumn"]; + JsonKeyValue json_key_value = 123 [json_name="JsonKeyValue"]; + JsonParseExpr json_parse_expr = 124 [json_name="JsonParseExpr"]; + JsonScalarExpr json_scalar_expr = 125 [json_name="JsonScalarExpr"]; + JsonSerializeExpr json_serialize_expr = 126 [json_name="JsonSerializeExpr"]; + JsonObjectConstructor json_object_constructor = 127 [json_name="JsonObjectConstructor"]; + JsonArrayConstructor json_array_constructor = 128 [json_name="JsonArrayConstructor"]; + JsonArrayQueryConstructor json_array_query_constructor = 129 [json_name="JsonArrayQueryConstructor"]; + JsonAggConstructor json_agg_constructor = 130 [json_name="JsonAggConstructor"]; + JsonObjectAgg json_object_agg = 131 [json_name="JsonObjectAgg"]; + JsonArrayAgg json_array_agg = 132 [json_name="JsonArrayAgg"]; + RawStmt raw_stmt = 133 [json_name="RawStmt"]; + InsertStmt insert_stmt = 134 [json_name="InsertStmt"]; + DeleteStmt delete_stmt = 135 [json_name="DeleteStmt"]; + UpdateStmt update_stmt = 136 [json_name="UpdateStmt"]; + MergeStmt merge_stmt = 137 [json_name="MergeStmt"]; + SelectStmt select_stmt = 138 [json_name="SelectStmt"]; + SetOperationStmt set_operation_stmt = 139 [json_name="SetOperationStmt"]; + ReturnStmt return_stmt = 140 [json_name="ReturnStmt"]; + PLAssignStmt plassign_stmt = 141 [json_name="PLAssignStmt"]; + CreateSchemaStmt create_schema_stmt = 142 [json_name="CreateSchemaStmt"]; + AlterTableStmt alter_table_stmt = 143 [json_name="AlterTableStmt"]; + AlterTableCmd alter_table_cmd = 144 [json_name="AlterTableCmd"]; + ATAlterConstraint atalter_constraint = 145 [json_name="ATAlterConstraint"]; + ReplicaIdentityStmt replica_identity_stmt = 146 [json_name="ReplicaIdentityStmt"]; + AlterCollationStmt alter_collation_stmt = 147 [json_name="AlterCollationStmt"]; + AlterDomainStmt alter_domain_stmt = 148 [json_name="AlterDomainStmt"]; + GrantStmt grant_stmt = 149 [json_name="GrantStmt"]; + ObjectWithArgs object_with_args = 150 [json_name="ObjectWithArgs"]; + AccessPriv access_priv = 151 [json_name="AccessPriv"]; + GrantRoleStmt grant_role_stmt = 152 [json_name="GrantRoleStmt"]; + AlterDefaultPrivilegesStmt alter_default_privileges_stmt = 153 [json_name="AlterDefaultPrivilegesStmt"]; + CopyStmt copy_stmt = 154 [json_name="CopyStmt"]; + VariableSetStmt variable_set_stmt = 155 [json_name="VariableSetStmt"]; + VariableShowStmt variable_show_stmt = 156 [json_name="VariableShowStmt"]; + CreateStmt create_stmt = 157 [json_name="CreateStmt"]; + Constraint constraint = 158 [json_name="Constraint"]; + CreateTableSpaceStmt create_table_space_stmt = 159 [json_name="CreateTableSpaceStmt"]; + DropTableSpaceStmt drop_table_space_stmt = 160 [json_name="DropTableSpaceStmt"]; + AlterTableSpaceOptionsStmt alter_table_space_options_stmt = 161 [json_name="AlterTableSpaceOptionsStmt"]; + AlterTableMoveAllStmt alter_table_move_all_stmt = 162 [json_name="AlterTableMoveAllStmt"]; + CreateExtensionStmt create_extension_stmt = 163 [json_name="CreateExtensionStmt"]; + AlterExtensionStmt alter_extension_stmt = 164 [json_name="AlterExtensionStmt"]; + AlterExtensionContentsStmt alter_extension_contents_stmt = 165 [json_name="AlterExtensionContentsStmt"]; + CreateFdwStmt create_fdw_stmt = 166 [json_name="CreateFdwStmt"]; + AlterFdwStmt alter_fdw_stmt = 167 [json_name="AlterFdwStmt"]; + CreateForeignServerStmt create_foreign_server_stmt = 168 [json_name="CreateForeignServerStmt"]; + AlterForeignServerStmt alter_foreign_server_stmt = 169 [json_name="AlterForeignServerStmt"]; + CreateForeignTableStmt create_foreign_table_stmt = 170 [json_name="CreateForeignTableStmt"]; + CreateUserMappingStmt create_user_mapping_stmt = 171 [json_name="CreateUserMappingStmt"]; + AlterUserMappingStmt alter_user_mapping_stmt = 172 [json_name="AlterUserMappingStmt"]; + DropUserMappingStmt drop_user_mapping_stmt = 173 [json_name="DropUserMappingStmt"]; + ImportForeignSchemaStmt import_foreign_schema_stmt = 174 [json_name="ImportForeignSchemaStmt"]; + CreatePolicyStmt create_policy_stmt = 175 [json_name="CreatePolicyStmt"]; + AlterPolicyStmt alter_policy_stmt = 176 [json_name="AlterPolicyStmt"]; + CreateAmStmt create_am_stmt = 177 [json_name="CreateAmStmt"]; + CreateTrigStmt create_trig_stmt = 178 [json_name="CreateTrigStmt"]; + CreateEventTrigStmt create_event_trig_stmt = 179 [json_name="CreateEventTrigStmt"]; + AlterEventTrigStmt alter_event_trig_stmt = 180 [json_name="AlterEventTrigStmt"]; + CreatePLangStmt create_plang_stmt = 181 [json_name="CreatePLangStmt"]; + CreateRoleStmt create_role_stmt = 182 [json_name="CreateRoleStmt"]; + AlterRoleStmt alter_role_stmt = 183 [json_name="AlterRoleStmt"]; + AlterRoleSetStmt alter_role_set_stmt = 184 [json_name="AlterRoleSetStmt"]; + DropRoleStmt drop_role_stmt = 185 [json_name="DropRoleStmt"]; + CreateSeqStmt create_seq_stmt = 186 [json_name="CreateSeqStmt"]; + AlterSeqStmt alter_seq_stmt = 187 [json_name="AlterSeqStmt"]; + DefineStmt define_stmt = 188 [json_name="DefineStmt"]; + CreateDomainStmt create_domain_stmt = 189 [json_name="CreateDomainStmt"]; + CreateOpClassStmt create_op_class_stmt = 190 [json_name="CreateOpClassStmt"]; + CreateOpClassItem create_op_class_item = 191 [json_name="CreateOpClassItem"]; + CreateOpFamilyStmt create_op_family_stmt = 192 [json_name="CreateOpFamilyStmt"]; + AlterOpFamilyStmt alter_op_family_stmt = 193 [json_name="AlterOpFamilyStmt"]; + DropStmt drop_stmt = 194 [json_name="DropStmt"]; + TruncateStmt truncate_stmt = 195 [json_name="TruncateStmt"]; + CommentStmt comment_stmt = 196 [json_name="CommentStmt"]; + SecLabelStmt sec_label_stmt = 197 [json_name="SecLabelStmt"]; + DeclareCursorStmt declare_cursor_stmt = 198 [json_name="DeclareCursorStmt"]; + ClosePortalStmt close_portal_stmt = 199 [json_name="ClosePortalStmt"]; + FetchStmt fetch_stmt = 200 [json_name="FetchStmt"]; + IndexStmt index_stmt = 201 [json_name="IndexStmt"]; + CreateStatsStmt create_stats_stmt = 202 [json_name="CreateStatsStmt"]; + StatsElem stats_elem = 203 [json_name="StatsElem"]; + AlterStatsStmt alter_stats_stmt = 204 [json_name="AlterStatsStmt"]; + CreateFunctionStmt create_function_stmt = 205 [json_name="CreateFunctionStmt"]; + FunctionParameter function_parameter = 206 [json_name="FunctionParameter"]; + AlterFunctionStmt alter_function_stmt = 207 [json_name="AlterFunctionStmt"]; + DoStmt do_stmt = 208 [json_name="DoStmt"]; + InlineCodeBlock inline_code_block = 209 [json_name="InlineCodeBlock"]; + CallStmt call_stmt = 210 [json_name="CallStmt"]; + CallContext call_context = 211 [json_name="CallContext"]; + RenameStmt rename_stmt = 212 [json_name="RenameStmt"]; + AlterObjectDependsStmt alter_object_depends_stmt = 213 [json_name="AlterObjectDependsStmt"]; + AlterObjectSchemaStmt alter_object_schema_stmt = 214 [json_name="AlterObjectSchemaStmt"]; + AlterOwnerStmt alter_owner_stmt = 215 [json_name="AlterOwnerStmt"]; + AlterOperatorStmt alter_operator_stmt = 216 [json_name="AlterOperatorStmt"]; + AlterTypeStmt alter_type_stmt = 217 [json_name="AlterTypeStmt"]; + RuleStmt rule_stmt = 218 [json_name="RuleStmt"]; + NotifyStmt notify_stmt = 219 [json_name="NotifyStmt"]; + ListenStmt listen_stmt = 220 [json_name="ListenStmt"]; + UnlistenStmt unlisten_stmt = 221 [json_name="UnlistenStmt"]; + TransactionStmt transaction_stmt = 222 [json_name="TransactionStmt"]; + CompositeTypeStmt composite_type_stmt = 223 [json_name="CompositeTypeStmt"]; + CreateEnumStmt create_enum_stmt = 224 [json_name="CreateEnumStmt"]; + CreateRangeStmt create_range_stmt = 225 [json_name="CreateRangeStmt"]; + AlterEnumStmt alter_enum_stmt = 226 [json_name="AlterEnumStmt"]; + ViewStmt view_stmt = 227 [json_name="ViewStmt"]; + LoadStmt load_stmt = 228 [json_name="LoadStmt"]; + CreatedbStmt createdb_stmt = 229 [json_name="CreatedbStmt"]; + AlterDatabaseStmt alter_database_stmt = 230 [json_name="AlterDatabaseStmt"]; + AlterDatabaseRefreshCollStmt alter_database_refresh_coll_stmt = 231 [json_name="AlterDatabaseRefreshCollStmt"]; + AlterDatabaseSetStmt alter_database_set_stmt = 232 [json_name="AlterDatabaseSetStmt"]; + DropdbStmt dropdb_stmt = 233 [json_name="DropdbStmt"]; + AlterSystemStmt alter_system_stmt = 234 [json_name="AlterSystemStmt"]; + ClusterStmt cluster_stmt = 235 [json_name="ClusterStmt"]; + VacuumStmt vacuum_stmt = 236 [json_name="VacuumStmt"]; + VacuumRelation vacuum_relation = 237 [json_name="VacuumRelation"]; + ExplainStmt explain_stmt = 238 [json_name="ExplainStmt"]; + CreateTableAsStmt create_table_as_stmt = 239 [json_name="CreateTableAsStmt"]; + RefreshMatViewStmt refresh_mat_view_stmt = 240 [json_name="RefreshMatViewStmt"]; + CheckPointStmt check_point_stmt = 241 [json_name="CheckPointStmt"]; + DiscardStmt discard_stmt = 242 [json_name="DiscardStmt"]; + LockStmt lock_stmt = 243 [json_name="LockStmt"]; + ConstraintsSetStmt constraints_set_stmt = 244 [json_name="ConstraintsSetStmt"]; + ReindexStmt reindex_stmt = 245 [json_name="ReindexStmt"]; + CreateConversionStmt create_conversion_stmt = 246 [json_name="CreateConversionStmt"]; + CreateCastStmt create_cast_stmt = 247 [json_name="CreateCastStmt"]; + CreateTransformStmt create_transform_stmt = 248 [json_name="CreateTransformStmt"]; + PrepareStmt prepare_stmt = 249 [json_name="PrepareStmt"]; + ExecuteStmt execute_stmt = 250 [json_name="ExecuteStmt"]; + DeallocateStmt deallocate_stmt = 251 [json_name="DeallocateStmt"]; + DropOwnedStmt drop_owned_stmt = 252 [json_name="DropOwnedStmt"]; + ReassignOwnedStmt reassign_owned_stmt = 253 [json_name="ReassignOwnedStmt"]; + AlterTSDictionaryStmt alter_tsdictionary_stmt = 254 [json_name="AlterTSDictionaryStmt"]; + AlterTSConfigurationStmt alter_tsconfiguration_stmt = 255 [json_name="AlterTSConfigurationStmt"]; + PublicationTable publication_table = 256 [json_name="PublicationTable"]; + PublicationObjSpec publication_obj_spec = 257 [json_name="PublicationObjSpec"]; + CreatePublicationStmt create_publication_stmt = 258 [json_name="CreatePublicationStmt"]; + AlterPublicationStmt alter_publication_stmt = 259 [json_name="AlterPublicationStmt"]; + CreateSubscriptionStmt create_subscription_stmt = 260 [json_name="CreateSubscriptionStmt"]; + AlterSubscriptionStmt alter_subscription_stmt = 261 [json_name="AlterSubscriptionStmt"]; + DropSubscriptionStmt drop_subscription_stmt = 262 [json_name="DropSubscriptionStmt"]; + Integer integer = 263 [json_name="Integer"]; + Float float = 264 [json_name="Float"]; + Boolean boolean = 265 [json_name="Boolean"]; + String string = 266 [json_name="String"]; + BitString bit_string = 267 [json_name="BitString"]; + List list = 268 [json_name="List"]; + IntList int_list = 269 [json_name="IntList"]; + OidList oid_list = 270 [json_name="OidList"]; + A_Const a_const = 271 [json_name="A_Const"]; + } +} + +message Integer +{ + int32 ival = 1; /* machine integer */ +} + +message Float +{ + string fval = 1; /* string */ +} + +message Boolean +{ + bool boolval = 1; +} + +message String +{ + string sval = 1; /* string */ +} + +message BitString +{ + string bsval = 1; /* string */ +} + +message List +{ + repeated Node items = 1; +} + +message OidList +{ + repeated Node items = 1; +} + +message IntList +{ + repeated Node items = 1; +} + +message A_Const +{ + oneof val { + Integer ival = 1; + Float fval = 2; + Boolean boolval = 3; + String sval = 4; + BitString bsval = 5; + } + bool isnull = 10; + int32 location = 11; +} + +message Alias +{ + string aliasname = 1 [json_name="aliasname"]; + repeated Node colnames = 2 [json_name="colnames"]; +} + +message RangeVar +{ + string catalogname = 1 [json_name="catalogname"]; + string schemaname = 2 [json_name="schemaname"]; + string relname = 3 [json_name="relname"]; + bool inh = 4 [json_name="inh"]; + string relpersistence = 5 [json_name="relpersistence"]; + Alias alias = 6 [json_name="alias"]; + int32 location = 7 [json_name="location"]; +} + +message TableFunc +{ + TableFuncType functype = 1 [json_name="functype"]; + repeated Node ns_uris = 2 [json_name="ns_uris"]; + repeated Node ns_names = 3 [json_name="ns_names"]; + Node docexpr = 4 [json_name="docexpr"]; + Node rowexpr = 5 [json_name="rowexpr"]; + repeated Node colnames = 6 [json_name="colnames"]; + repeated Node coltypes = 7 [json_name="coltypes"]; + repeated Node coltypmods = 8 [json_name="coltypmods"]; + repeated Node colcollations = 9 [json_name="colcollations"]; + repeated Node colexprs = 10 [json_name="colexprs"]; + repeated Node coldefexprs = 11 [json_name="coldefexprs"]; + repeated Node colvalexprs = 12 [json_name="colvalexprs"]; + repeated Node passingvalexprs = 13 [json_name="passingvalexprs"]; + repeated uint64 notnulls = 14 [json_name="notnulls"]; + Node plan = 15 [json_name="plan"]; + int32 ordinalitycol = 16 [json_name="ordinalitycol"]; + int32 location = 17 [json_name="location"]; +} + +message IntoClause +{ + RangeVar rel = 1 [json_name="rel"]; + repeated Node col_names = 2 [json_name="colNames"]; + string access_method = 3 [json_name="accessMethod"]; + repeated Node options = 4 [json_name="options"]; + OnCommitAction on_commit = 5 [json_name="onCommit"]; + string table_space_name = 6 [json_name="tableSpaceName"]; + Query view_query = 7 [json_name="viewQuery"]; + bool skip_data = 8 [json_name="skipData"]; +} + +message Var +{ + Node xpr = 1 [json_name="xpr"]; + int32 varno = 2 [json_name="varno"]; + int32 varattno = 3 [json_name="varattno"]; + uint32 vartype = 4 [json_name="vartype"]; + int32 vartypmod = 5 [json_name="vartypmod"]; + uint32 varcollid = 6 [json_name="varcollid"]; + repeated uint64 varnullingrels = 7 [json_name="varnullingrels"]; + uint32 varlevelsup = 8 [json_name="varlevelsup"]; + VarReturningType varreturningtype = 9 [json_name="varreturningtype"]; + int32 location = 10 [json_name="location"]; +} + +message Param +{ + Node xpr = 1 [json_name="xpr"]; + ParamKind paramkind = 2 [json_name="paramkind"]; + int32 paramid = 3 [json_name="paramid"]; + uint32 paramtype = 4 [json_name="paramtype"]; + int32 paramtypmod = 5 [json_name="paramtypmod"]; + uint32 paramcollid = 6 [json_name="paramcollid"]; + int32 location = 7 [json_name="location"]; +} + +message Aggref +{ + Node xpr = 1 [json_name="xpr"]; + uint32 aggfnoid = 2 [json_name="aggfnoid"]; + uint32 aggtype = 3 [json_name="aggtype"]; + uint32 aggcollid = 4 [json_name="aggcollid"]; + uint32 inputcollid = 5 [json_name="inputcollid"]; + repeated Node aggargtypes = 6 [json_name="aggargtypes"]; + repeated Node aggdirectargs = 7 [json_name="aggdirectargs"]; + repeated Node args = 8 [json_name="args"]; + repeated Node aggorder = 9 [json_name="aggorder"]; + repeated Node aggdistinct = 10 [json_name="aggdistinct"]; + Node aggfilter = 11 [json_name="aggfilter"]; + bool aggstar = 12 [json_name="aggstar"]; + bool aggvariadic = 13 [json_name="aggvariadic"]; + string aggkind = 14 [json_name="aggkind"]; + uint32 agglevelsup = 15 [json_name="agglevelsup"]; + AggSplit aggsplit = 16 [json_name="aggsplit"]; + int32 aggno = 17 [json_name="aggno"]; + int32 aggtransno = 18 [json_name="aggtransno"]; + int32 location = 19 [json_name="location"]; +} + +message GroupingFunc +{ + Node xpr = 1 [json_name="xpr"]; + repeated Node args = 2 [json_name="args"]; + repeated Node refs = 3 [json_name="refs"]; + uint32 agglevelsup = 4 [json_name="agglevelsup"]; + int32 location = 5 [json_name="location"]; +} + +message WindowFunc +{ + Node xpr = 1 [json_name="xpr"]; + uint32 winfnoid = 2 [json_name="winfnoid"]; + uint32 wintype = 3 [json_name="wintype"]; + uint32 wincollid = 4 [json_name="wincollid"]; + uint32 inputcollid = 5 [json_name="inputcollid"]; + repeated Node args = 6 [json_name="args"]; + Node aggfilter = 7 [json_name="aggfilter"]; + repeated Node run_condition = 8 [json_name="runCondition"]; + uint32 winref = 9 [json_name="winref"]; + bool winstar = 10 [json_name="winstar"]; + bool winagg = 11 [json_name="winagg"]; + int32 location = 12 [json_name="location"]; +} + +message WindowFuncRunCondition +{ + Node xpr = 1 [json_name="xpr"]; + uint32 opno = 2 [json_name="opno"]; + uint32 inputcollid = 3 [json_name="inputcollid"]; + bool wfunc_left = 4 [json_name="wfunc_left"]; + Node arg = 5 [json_name="arg"]; +} + +message MergeSupportFunc +{ + Node xpr = 1 [json_name="xpr"]; + uint32 msftype = 2 [json_name="msftype"]; + uint32 msfcollid = 3 [json_name="msfcollid"]; + int32 location = 4 [json_name="location"]; +} + +message SubscriptingRef +{ + Node xpr = 1 [json_name="xpr"]; + uint32 refcontainertype = 2 [json_name="refcontainertype"]; + uint32 refelemtype = 3 [json_name="refelemtype"]; + uint32 refrestype = 4 [json_name="refrestype"]; + int32 reftypmod = 5 [json_name="reftypmod"]; + uint32 refcollid = 6 [json_name="refcollid"]; + repeated Node refupperindexpr = 7 [json_name="refupperindexpr"]; + repeated Node reflowerindexpr = 8 [json_name="reflowerindexpr"]; + Node refexpr = 9 [json_name="refexpr"]; + Node refassgnexpr = 10 [json_name="refassgnexpr"]; +} + +message FuncExpr +{ + Node xpr = 1 [json_name="xpr"]; + uint32 funcid = 2 [json_name="funcid"]; + uint32 funcresulttype = 3 [json_name="funcresulttype"]; + bool funcretset = 4 [json_name="funcretset"]; + bool funcvariadic = 5 [json_name="funcvariadic"]; + CoercionForm funcformat = 6 [json_name="funcformat"]; + uint32 funccollid = 7 [json_name="funccollid"]; + uint32 inputcollid = 8 [json_name="inputcollid"]; + repeated Node args = 9 [json_name="args"]; + int32 location = 10 [json_name="location"]; +} + +message NamedArgExpr +{ + Node xpr = 1 [json_name="xpr"]; + Node arg = 2 [json_name="arg"]; + string name = 3 [json_name="name"]; + int32 argnumber = 4 [json_name="argnumber"]; + int32 location = 5 [json_name="location"]; +} + +message OpExpr +{ + Node xpr = 1 [json_name="xpr"]; + uint32 opno = 2 [json_name="opno"]; + uint32 opresulttype = 3 [json_name="opresulttype"]; + bool opretset = 4 [json_name="opretset"]; + uint32 opcollid = 5 [json_name="opcollid"]; + uint32 inputcollid = 6 [json_name="inputcollid"]; + repeated Node args = 7 [json_name="args"]; + int32 location = 8 [json_name="location"]; +} + +message DistinctExpr +{ + Node xpr = 1 [json_name="xpr"]; + uint32 opno = 2 [json_name="opno"]; + uint32 opresulttype = 3 [json_name="opresulttype"]; + bool opretset = 4 [json_name="opretset"]; + uint32 opcollid = 5 [json_name="opcollid"]; + uint32 inputcollid = 6 [json_name="inputcollid"]; + repeated Node args = 7 [json_name="args"]; + int32 location = 8 [json_name="location"]; +} + +message NullIfExpr +{ + Node xpr = 1 [json_name="xpr"]; + uint32 opno = 2 [json_name="opno"]; + uint32 opresulttype = 3 [json_name="opresulttype"]; + bool opretset = 4 [json_name="opretset"]; + uint32 opcollid = 5 [json_name="opcollid"]; + uint32 inputcollid = 6 [json_name="inputcollid"]; + repeated Node args = 7 [json_name="args"]; + int32 location = 8 [json_name="location"]; +} + +message ScalarArrayOpExpr +{ + Node xpr = 1 [json_name="xpr"]; + uint32 opno = 2 [json_name="opno"]; + bool use_or = 3 [json_name="useOr"]; + uint32 inputcollid = 4 [json_name="inputcollid"]; + repeated Node args = 5 [json_name="args"]; + int32 location = 6 [json_name="location"]; +} + +message BoolExpr +{ + Node xpr = 1 [json_name="xpr"]; + BoolExprType boolop = 2 [json_name="boolop"]; + repeated Node args = 3 [json_name="args"]; + int32 location = 4 [json_name="location"]; +} + +message SubLink +{ + Node xpr = 1 [json_name="xpr"]; + SubLinkType sub_link_type = 2 [json_name="subLinkType"]; + int32 sub_link_id = 3 [json_name="subLinkId"]; + Node testexpr = 4 [json_name="testexpr"]; + repeated Node oper_name = 5 [json_name="operName"]; + Node subselect = 6 [json_name="subselect"]; + int32 location = 7 [json_name="location"]; +} + +message SubPlan +{ + Node xpr = 1 [json_name="xpr"]; + SubLinkType sub_link_type = 2 [json_name="subLinkType"]; + Node testexpr = 3 [json_name="testexpr"]; + repeated Node param_ids = 4 [json_name="paramIds"]; + int32 plan_id = 5 [json_name="plan_id"]; + string plan_name = 6 [json_name="plan_name"]; + uint32 first_col_type = 7 [json_name="firstColType"]; + int32 first_col_typmod = 8 [json_name="firstColTypmod"]; + uint32 first_col_collation = 9 [json_name="firstColCollation"]; + bool use_hash_table = 10 [json_name="useHashTable"]; + bool unknown_eq_false = 11 [json_name="unknownEqFalse"]; + bool parallel_safe = 12 [json_name="parallel_safe"]; + repeated Node set_param = 13 [json_name="setParam"]; + repeated Node par_param = 14 [json_name="parParam"]; + repeated Node args = 15 [json_name="args"]; + double startup_cost = 16 [json_name="startup_cost"]; + double per_call_cost = 17 [json_name="per_call_cost"]; +} + +message AlternativeSubPlan +{ + Node xpr = 1 [json_name="xpr"]; + repeated Node subplans = 2 [json_name="subplans"]; +} + +message FieldSelect +{ + Node xpr = 1 [json_name="xpr"]; + Node arg = 2 [json_name="arg"]; + int32 fieldnum = 3 [json_name="fieldnum"]; + uint32 resulttype = 4 [json_name="resulttype"]; + int32 resulttypmod = 5 [json_name="resulttypmod"]; + uint32 resultcollid = 6 [json_name="resultcollid"]; +} + +message FieldStore +{ + Node xpr = 1 [json_name="xpr"]; + Node arg = 2 [json_name="arg"]; + repeated Node newvals = 3 [json_name="newvals"]; + repeated Node fieldnums = 4 [json_name="fieldnums"]; + uint32 resulttype = 5 [json_name="resulttype"]; +} + +message RelabelType +{ + Node xpr = 1 [json_name="xpr"]; + Node arg = 2 [json_name="arg"]; + uint32 resulttype = 3 [json_name="resulttype"]; + int32 resulttypmod = 4 [json_name="resulttypmod"]; + uint32 resultcollid = 5 [json_name="resultcollid"]; + CoercionForm relabelformat = 6 [json_name="relabelformat"]; + int32 location = 7 [json_name="location"]; +} + +message CoerceViaIO +{ + Node xpr = 1 [json_name="xpr"]; + Node arg = 2 [json_name="arg"]; + uint32 resulttype = 3 [json_name="resulttype"]; + uint32 resultcollid = 4 [json_name="resultcollid"]; + CoercionForm coerceformat = 5 [json_name="coerceformat"]; + int32 location = 6 [json_name="location"]; +} + +message ArrayCoerceExpr +{ + Node xpr = 1 [json_name="xpr"]; + Node arg = 2 [json_name="arg"]; + Node elemexpr = 3 [json_name="elemexpr"]; + uint32 resulttype = 4 [json_name="resulttype"]; + int32 resulttypmod = 5 [json_name="resulttypmod"]; + uint32 resultcollid = 6 [json_name="resultcollid"]; + CoercionForm coerceformat = 7 [json_name="coerceformat"]; + int32 location = 8 [json_name="location"]; +} + +message ConvertRowtypeExpr +{ + Node xpr = 1 [json_name="xpr"]; + Node arg = 2 [json_name="arg"]; + uint32 resulttype = 3 [json_name="resulttype"]; + CoercionForm convertformat = 4 [json_name="convertformat"]; + int32 location = 5 [json_name="location"]; +} + +message CollateExpr +{ + Node xpr = 1 [json_name="xpr"]; + Node arg = 2 [json_name="arg"]; + uint32 coll_oid = 3 [json_name="collOid"]; + int32 location = 4 [json_name="location"]; +} + +message CaseExpr +{ + Node xpr = 1 [json_name="xpr"]; + uint32 casetype = 2 [json_name="casetype"]; + uint32 casecollid = 3 [json_name="casecollid"]; + Node arg = 4 [json_name="arg"]; + repeated Node args = 5 [json_name="args"]; + Node defresult = 6 [json_name="defresult"]; + int32 location = 7 [json_name="location"]; +} + +message CaseWhen +{ + Node xpr = 1 [json_name="xpr"]; + Node expr = 2 [json_name="expr"]; + Node result = 3 [json_name="result"]; + int32 location = 4 [json_name="location"]; +} + +message CaseTestExpr +{ + Node xpr = 1 [json_name="xpr"]; + uint32 type_id = 2 [json_name="typeId"]; + int32 type_mod = 3 [json_name="typeMod"]; + uint32 collation = 4 [json_name="collation"]; +} + +message ArrayExpr +{ + Node xpr = 1 [json_name="xpr"]; + uint32 array_typeid = 2 [json_name="array_typeid"]; + uint32 array_collid = 3 [json_name="array_collid"]; + uint32 element_typeid = 4 [json_name="element_typeid"]; + repeated Node elements = 5 [json_name="elements"]; + bool multidims = 6 [json_name="multidims"]; + int32 list_start = 7 [json_name="list_start"]; + int32 list_end = 8 [json_name="list_end"]; + int32 location = 9 [json_name="location"]; +} + +message RowExpr +{ + Node xpr = 1 [json_name="xpr"]; + repeated Node args = 2 [json_name="args"]; + uint32 row_typeid = 3 [json_name="row_typeid"]; + CoercionForm row_format = 4 [json_name="row_format"]; + repeated Node colnames = 5 [json_name="colnames"]; + int32 location = 6 [json_name="location"]; +} + +message RowCompareExpr +{ + Node xpr = 1 [json_name="xpr"]; + CompareType cmptype = 2 [json_name="cmptype"]; + repeated Node opnos = 3 [json_name="opnos"]; + repeated Node opfamilies = 4 [json_name="opfamilies"]; + repeated Node inputcollids = 5 [json_name="inputcollids"]; + repeated Node largs = 6 [json_name="largs"]; + repeated Node rargs = 7 [json_name="rargs"]; +} + +message CoalesceExpr +{ + Node xpr = 1 [json_name="xpr"]; + uint32 coalescetype = 2 [json_name="coalescetype"]; + uint32 coalescecollid = 3 [json_name="coalescecollid"]; + repeated Node args = 4 [json_name="args"]; + int32 location = 5 [json_name="location"]; +} + +message MinMaxExpr +{ + Node xpr = 1 [json_name="xpr"]; + uint32 minmaxtype = 2 [json_name="minmaxtype"]; + uint32 minmaxcollid = 3 [json_name="minmaxcollid"]; + uint32 inputcollid = 4 [json_name="inputcollid"]; + MinMaxOp op = 5 [json_name="op"]; + repeated Node args = 6 [json_name="args"]; + int32 location = 7 [json_name="location"]; +} + +message SQLValueFunction +{ + Node xpr = 1 [json_name="xpr"]; + SQLValueFunctionOp op = 2 [json_name="op"]; + uint32 type = 3 [json_name="type"]; + int32 typmod = 4 [json_name="typmod"]; + int32 location = 5 [json_name="location"]; +} + +message XmlExpr +{ + Node xpr = 1 [json_name="xpr"]; + XmlExprOp op = 2 [json_name="op"]; + string name = 3 [json_name="name"]; + repeated Node named_args = 4 [json_name="named_args"]; + repeated Node arg_names = 5 [json_name="arg_names"]; + repeated Node args = 6 [json_name="args"]; + XmlOptionType xmloption = 7 [json_name="xmloption"]; + bool indent = 8 [json_name="indent"]; + uint32 type = 9 [json_name="type"]; + int32 typmod = 10 [json_name="typmod"]; + int32 location = 11 [json_name="location"]; +} + +message JsonFormat +{ + JsonFormatType format_type = 1 [json_name="format_type"]; + JsonEncoding encoding = 2 [json_name="encoding"]; + int32 location = 3 [json_name="location"]; +} + +message JsonReturning +{ + JsonFormat format = 1 [json_name="format"]; + uint32 typid = 2 [json_name="typid"]; + int32 typmod = 3 [json_name="typmod"]; +} + +message JsonValueExpr +{ + Node raw_expr = 1 [json_name="raw_expr"]; + Node formatted_expr = 2 [json_name="formatted_expr"]; + JsonFormat format = 3 [json_name="format"]; +} + +message JsonConstructorExpr +{ + Node xpr = 1 [json_name="xpr"]; + JsonConstructorType type = 2 [json_name="type"]; + repeated Node args = 3 [json_name="args"]; + Node func = 4 [json_name="func"]; + Node coercion = 5 [json_name="coercion"]; + JsonReturning returning = 6 [json_name="returning"]; + bool absent_on_null = 7 [json_name="absent_on_null"]; + bool unique = 8 [json_name="unique"]; + int32 location = 9 [json_name="location"]; +} + +message JsonIsPredicate +{ + Node expr = 1 [json_name="expr"]; + JsonFormat format = 2 [json_name="format"]; + JsonValueType item_type = 3 [json_name="item_type"]; + bool unique_keys = 4 [json_name="unique_keys"]; + int32 location = 5 [json_name="location"]; +} + +message JsonBehavior +{ + JsonBehaviorType btype = 1 [json_name="btype"]; + Node expr = 2 [json_name="expr"]; + bool coerce = 3 [json_name="coerce"]; + int32 location = 4 [json_name="location"]; +} + +message JsonExpr +{ + Node xpr = 1 [json_name="xpr"]; + JsonExprOp op = 2 [json_name="op"]; + string column_name = 3 [json_name="column_name"]; + Node formatted_expr = 4 [json_name="formatted_expr"]; + JsonFormat format = 5 [json_name="format"]; + Node path_spec = 6 [json_name="path_spec"]; + JsonReturning returning = 7 [json_name="returning"]; + repeated Node passing_names = 8 [json_name="passing_names"]; + repeated Node passing_values = 9 [json_name="passing_values"]; + JsonBehavior on_empty = 10 [json_name="on_empty"]; + JsonBehavior on_error = 11 [json_name="on_error"]; + bool use_io_coercion = 12 [json_name="use_io_coercion"]; + bool use_json_coercion = 13 [json_name="use_json_coercion"]; + JsonWrapper wrapper = 14 [json_name="wrapper"]; + bool omit_quotes = 15 [json_name="omit_quotes"]; + uint32 collation = 16 [json_name="collation"]; + int32 location = 17 [json_name="location"]; +} + +message JsonTablePath +{ + string name = 1 [json_name="name"]; +} + +message JsonTablePathScan +{ + Node plan = 1 [json_name="plan"]; + JsonTablePath path = 2 [json_name="path"]; + bool error_on_error = 3 [json_name="errorOnError"]; + Node child = 4 [json_name="child"]; + int32 col_min = 5 [json_name="colMin"]; + int32 col_max = 6 [json_name="colMax"]; +} + +message JsonTableSiblingJoin +{ + Node plan = 1 [json_name="plan"]; + Node lplan = 2 [json_name="lplan"]; + Node rplan = 3 [json_name="rplan"]; +} + +message NullTest +{ + Node xpr = 1 [json_name="xpr"]; + Node arg = 2 [json_name="arg"]; + NullTestType nulltesttype = 3 [json_name="nulltesttype"]; + bool argisrow = 4 [json_name="argisrow"]; + int32 location = 5 [json_name="location"]; +} + +message BooleanTest +{ + Node xpr = 1 [json_name="xpr"]; + Node arg = 2 [json_name="arg"]; + BoolTestType booltesttype = 3 [json_name="booltesttype"]; + int32 location = 4 [json_name="location"]; +} + +message MergeAction +{ + MergeMatchKind match_kind = 1 [json_name="matchKind"]; + CmdType command_type = 2 [json_name="commandType"]; + OverridingKind override = 3 [json_name="override"]; + Node qual = 4 [json_name="qual"]; + repeated Node target_list = 5 [json_name="targetList"]; + repeated Node update_colnos = 6 [json_name="updateColnos"]; +} + +message CoerceToDomain +{ + Node xpr = 1 [json_name="xpr"]; + Node arg = 2 [json_name="arg"]; + uint32 resulttype = 3 [json_name="resulttype"]; + int32 resulttypmod = 4 [json_name="resulttypmod"]; + uint32 resultcollid = 5 [json_name="resultcollid"]; + CoercionForm coercionformat = 6 [json_name="coercionformat"]; + int32 location = 7 [json_name="location"]; +} + +message CoerceToDomainValue +{ + Node xpr = 1 [json_name="xpr"]; + uint32 type_id = 2 [json_name="typeId"]; + int32 type_mod = 3 [json_name="typeMod"]; + uint32 collation = 4 [json_name="collation"]; + int32 location = 5 [json_name="location"]; +} + +message SetToDefault +{ + Node xpr = 1 [json_name="xpr"]; + uint32 type_id = 2 [json_name="typeId"]; + int32 type_mod = 3 [json_name="typeMod"]; + uint32 collation = 4 [json_name="collation"]; + int32 location = 5 [json_name="location"]; +} + +message CurrentOfExpr +{ + Node xpr = 1 [json_name="xpr"]; + uint32 cvarno = 2 [json_name="cvarno"]; + string cursor_name = 3 [json_name="cursor_name"]; + int32 cursor_param = 4 [json_name="cursor_param"]; +} + +message NextValueExpr +{ + Node xpr = 1 [json_name="xpr"]; + uint32 seqid = 2 [json_name="seqid"]; + uint32 type_id = 3 [json_name="typeId"]; +} + +message InferenceElem +{ + Node xpr = 1 [json_name="xpr"]; + Node expr = 2 [json_name="expr"]; + uint32 infercollid = 3 [json_name="infercollid"]; + uint32 inferopclass = 4 [json_name="inferopclass"]; +} + +message ReturningExpr +{ + Node xpr = 1 [json_name="xpr"]; + int32 retlevelsup = 2 [json_name="retlevelsup"]; + bool retold = 3 [json_name="retold"]; + Node retexpr = 4 [json_name="retexpr"]; +} + +message TargetEntry +{ + Node xpr = 1 [json_name="xpr"]; + Node expr = 2 [json_name="expr"]; + int32 resno = 3 [json_name="resno"]; + string resname = 4 [json_name="resname"]; + uint32 ressortgroupref = 5 [json_name="ressortgroupref"]; + uint32 resorigtbl = 6 [json_name="resorigtbl"]; + int32 resorigcol = 7 [json_name="resorigcol"]; + bool resjunk = 8 [json_name="resjunk"]; +} + +message RangeTblRef +{ + int32 rtindex = 1 [json_name="rtindex"]; +} + +message JoinExpr +{ + JoinType jointype = 1 [json_name="jointype"]; + bool is_natural = 2 [json_name="isNatural"]; + Node larg = 3 [json_name="larg"]; + Node rarg = 4 [json_name="rarg"]; + repeated Node using_clause = 5 [json_name="usingClause"]; + Alias join_using_alias = 6 [json_name="join_using_alias"]; + Node quals = 7 [json_name="quals"]; + Alias alias = 8 [json_name="alias"]; + int32 rtindex = 9 [json_name="rtindex"]; +} + +message FromExpr +{ + repeated Node fromlist = 1 [json_name="fromlist"]; + Node quals = 2 [json_name="quals"]; +} + +message OnConflictExpr +{ + OnConflictAction action = 1 [json_name="action"]; + repeated Node arbiter_elems = 2 [json_name="arbiterElems"]; + Node arbiter_where = 3 [json_name="arbiterWhere"]; + uint32 constraint = 4 [json_name="constraint"]; + repeated Node on_conflict_set = 5 [json_name="onConflictSet"]; + Node on_conflict_where = 6 [json_name="onConflictWhere"]; + int32 excl_rel_index = 7 [json_name="exclRelIndex"]; + repeated Node excl_rel_tlist = 8 [json_name="exclRelTlist"]; +} + +message Query +{ + CmdType command_type = 1 [json_name="commandType"]; + QuerySource query_source = 2 [json_name="querySource"]; + bool can_set_tag = 3 [json_name="canSetTag"]; + Node utility_stmt = 4 [json_name="utilityStmt"]; + int32 result_relation = 5 [json_name="resultRelation"]; + bool has_aggs = 6 [json_name="hasAggs"]; + bool has_window_funcs = 7 [json_name="hasWindowFuncs"]; + bool has_target_srfs = 8 [json_name="hasTargetSRFs"]; + bool has_sub_links = 9 [json_name="hasSubLinks"]; + bool has_distinct_on = 10 [json_name="hasDistinctOn"]; + bool has_recursive = 11 [json_name="hasRecursive"]; + bool has_modifying_cte = 12 [json_name="hasModifyingCTE"]; + bool has_for_update = 13 [json_name="hasForUpdate"]; + bool has_row_security = 14 [json_name="hasRowSecurity"]; + bool has_group_rte = 15 [json_name="hasGroupRTE"]; + bool is_return = 16 [json_name="isReturn"]; + repeated Node cte_list = 17 [json_name="cteList"]; + repeated Node rtable = 18 [json_name="rtable"]; + repeated Node rteperminfos = 19 [json_name="rteperminfos"]; + FromExpr jointree = 20 [json_name="jointree"]; + repeated Node merge_action_list = 21 [json_name="mergeActionList"]; + int32 merge_target_relation = 22 [json_name="mergeTargetRelation"]; + Node merge_join_condition = 23 [json_name="mergeJoinCondition"]; + repeated Node target_list = 24 [json_name="targetList"]; + OverridingKind override = 25 [json_name="override"]; + OnConflictExpr on_conflict = 26 [json_name="onConflict"]; + string returning_old_alias = 27 [json_name="returningOldAlias"]; + string returning_new_alias = 28 [json_name="returningNewAlias"]; + repeated Node returning_list = 29 [json_name="returningList"]; + repeated Node group_clause = 30 [json_name="groupClause"]; + bool group_distinct = 31 [json_name="groupDistinct"]; + repeated Node grouping_sets = 32 [json_name="groupingSets"]; + Node having_qual = 33 [json_name="havingQual"]; + repeated Node window_clause = 34 [json_name="windowClause"]; + repeated Node distinct_clause = 35 [json_name="distinctClause"]; + repeated Node sort_clause = 36 [json_name="sortClause"]; + Node limit_offset = 37 [json_name="limitOffset"]; + Node limit_count = 38 [json_name="limitCount"]; + LimitOption limit_option = 39 [json_name="limitOption"]; + repeated Node row_marks = 40 [json_name="rowMarks"]; + Node set_operations = 41 [json_name="setOperations"]; + repeated Node constraint_deps = 42 [json_name="constraintDeps"]; + repeated Node with_check_options = 43 [json_name="withCheckOptions"]; + int32 stmt_location = 44 [json_name="stmt_location"]; + int32 stmt_len = 45 [json_name="stmt_len"]; +} + +message TypeName +{ + repeated Node names = 1 [json_name="names"]; + uint32 type_oid = 2 [json_name="typeOid"]; + bool setof = 3 [json_name="setof"]; + bool pct_type = 4 [json_name="pct_type"]; + repeated Node typmods = 5 [json_name="typmods"]; + int32 typemod = 6 [json_name="typemod"]; + repeated Node array_bounds = 7 [json_name="arrayBounds"]; + int32 location = 8 [json_name="location"]; +} + +message ColumnRef +{ + repeated Node fields = 1 [json_name="fields"]; + int32 location = 2 [json_name="location"]; +} + +message ParamRef +{ + int32 number = 1 [json_name="number"]; + int32 location = 2 [json_name="location"]; +} + +message A_Expr +{ + A_Expr_Kind kind = 1 [json_name="kind"]; + repeated Node name = 2 [json_name="name"]; + Node lexpr = 3 [json_name="lexpr"]; + Node rexpr = 4 [json_name="rexpr"]; + int32 rexpr_list_start = 5 [json_name="rexpr_list_start"]; + int32 rexpr_list_end = 6 [json_name="rexpr_list_end"]; + int32 location = 7 [json_name="location"]; +} + +message TypeCast +{ + Node arg = 1 [json_name="arg"]; + TypeName type_name = 2 [json_name="typeName"]; + int32 location = 3 [json_name="location"]; +} + +message CollateClause +{ + Node arg = 1 [json_name="arg"]; + repeated Node collname = 2 [json_name="collname"]; + int32 location = 3 [json_name="location"]; +} + +message RoleSpec +{ + RoleSpecType roletype = 1 [json_name="roletype"]; + string rolename = 2 [json_name="rolename"]; + int32 location = 3 [json_name="location"]; +} + +message FuncCall +{ + repeated Node funcname = 1 [json_name="funcname"]; + repeated Node args = 2 [json_name="args"]; + repeated Node agg_order = 3 [json_name="agg_order"]; + Node agg_filter = 4 [json_name="agg_filter"]; + WindowDef over = 5 [json_name="over"]; + bool agg_within_group = 6 [json_name="agg_within_group"]; + bool agg_star = 7 [json_name="agg_star"]; + bool agg_distinct = 8 [json_name="agg_distinct"]; + bool func_variadic = 9 [json_name="func_variadic"]; + CoercionForm funcformat = 10 [json_name="funcformat"]; + int32 location = 11 [json_name="location"]; +} + +message A_Star +{ +} + +message A_Indices +{ + bool is_slice = 1 [json_name="is_slice"]; + Node lidx = 2 [json_name="lidx"]; + Node uidx = 3 [json_name="uidx"]; +} + +message A_Indirection +{ + Node arg = 1 [json_name="arg"]; + repeated Node indirection = 2 [json_name="indirection"]; +} + +message A_ArrayExpr +{ + repeated Node elements = 1 [json_name="elements"]; + int32 list_start = 2 [json_name="list_start"]; + int32 list_end = 3 [json_name="list_end"]; + int32 location = 4 [json_name="location"]; +} + +message ResTarget +{ + string name = 1 [json_name="name"]; + repeated Node indirection = 2 [json_name="indirection"]; + Node val = 3 [json_name="val"]; + int32 location = 4 [json_name="location"]; +} + +message MultiAssignRef +{ + Node source = 1 [json_name="source"]; + int32 colno = 2 [json_name="colno"]; + int32 ncolumns = 3 [json_name="ncolumns"]; +} + +message SortBy +{ + Node node = 1 [json_name="node"]; + SortByDir sortby_dir = 2 [json_name="sortby_dir"]; + SortByNulls sortby_nulls = 3 [json_name="sortby_nulls"]; + repeated Node use_op = 4 [json_name="useOp"]; + int32 location = 5 [json_name="location"]; +} + +message WindowDef +{ + string name = 1 [json_name="name"]; + string refname = 2 [json_name="refname"]; + repeated Node partition_clause = 3 [json_name="partitionClause"]; + repeated Node order_clause = 4 [json_name="orderClause"]; + int32 frame_options = 5 [json_name="frameOptions"]; + Node start_offset = 6 [json_name="startOffset"]; + Node end_offset = 7 [json_name="endOffset"]; + int32 location = 8 [json_name="location"]; +} + +message RangeSubselect +{ + bool lateral = 1 [json_name="lateral"]; + Node subquery = 2 [json_name="subquery"]; + Alias alias = 3 [json_name="alias"]; +} + +message RangeFunction +{ + bool lateral = 1 [json_name="lateral"]; + bool ordinality = 2 [json_name="ordinality"]; + bool is_rowsfrom = 3 [json_name="is_rowsfrom"]; + repeated Node functions = 4 [json_name="functions"]; + Alias alias = 5 [json_name="alias"]; + repeated Node coldeflist = 6 [json_name="coldeflist"]; +} + +message RangeTableFunc +{ + bool lateral = 1 [json_name="lateral"]; + Node docexpr = 2 [json_name="docexpr"]; + Node rowexpr = 3 [json_name="rowexpr"]; + repeated Node namespaces = 4 [json_name="namespaces"]; + repeated Node columns = 5 [json_name="columns"]; + Alias alias = 6 [json_name="alias"]; + int32 location = 7 [json_name="location"]; +} + +message RangeTableFuncCol +{ + string colname = 1 [json_name="colname"]; + TypeName type_name = 2 [json_name="typeName"]; + bool for_ordinality = 3 [json_name="for_ordinality"]; + bool is_not_null = 4 [json_name="is_not_null"]; + Node colexpr = 5 [json_name="colexpr"]; + Node coldefexpr = 6 [json_name="coldefexpr"]; + int32 location = 7 [json_name="location"]; +} + +message RangeTableSample +{ + Node relation = 1 [json_name="relation"]; + repeated Node method = 2 [json_name="method"]; + repeated Node args = 3 [json_name="args"]; + Node repeatable = 4 [json_name="repeatable"]; + int32 location = 5 [json_name="location"]; +} + +message ColumnDef +{ + string colname = 1 [json_name="colname"]; + TypeName type_name = 2 [json_name="typeName"]; + string compression = 3 [json_name="compression"]; + int32 inhcount = 4 [json_name="inhcount"]; + bool is_local = 5 [json_name="is_local"]; + bool is_not_null = 6 [json_name="is_not_null"]; + bool is_from_type = 7 [json_name="is_from_type"]; + string storage = 8 [json_name="storage"]; + string storage_name = 9 [json_name="storage_name"]; + Node raw_default = 10 [json_name="raw_default"]; + Node cooked_default = 11 [json_name="cooked_default"]; + string identity = 12 [json_name="identity"]; + RangeVar identity_sequence = 13 [json_name="identitySequence"]; + string generated = 14 [json_name="generated"]; + CollateClause coll_clause = 15 [json_name="collClause"]; + uint32 coll_oid = 16 [json_name="collOid"]; + repeated Node constraints = 17 [json_name="constraints"]; + repeated Node fdwoptions = 18 [json_name="fdwoptions"]; + int32 location = 19 [json_name="location"]; +} + +message TableLikeClause +{ + RangeVar relation = 1 [json_name="relation"]; + uint32 options = 2 [json_name="options"]; + uint32 relation_oid = 3 [json_name="relationOid"]; +} + +message IndexElem +{ + string name = 1 [json_name="name"]; + Node expr = 2 [json_name="expr"]; + string indexcolname = 3 [json_name="indexcolname"]; + repeated Node collation = 4 [json_name="collation"]; + repeated Node opclass = 5 [json_name="opclass"]; + repeated Node opclassopts = 6 [json_name="opclassopts"]; + SortByDir ordering = 7 [json_name="ordering"]; + SortByNulls nulls_ordering = 8 [json_name="nulls_ordering"]; +} + +message DefElem +{ + string defnamespace = 1 [json_name="defnamespace"]; + string defname = 2 [json_name="defname"]; + Node arg = 3 [json_name="arg"]; + DefElemAction defaction = 4 [json_name="defaction"]; + int32 location = 5 [json_name="location"]; +} + +message LockingClause +{ + repeated Node locked_rels = 1 [json_name="lockedRels"]; + LockClauseStrength strength = 2 [json_name="strength"]; + LockWaitPolicy wait_policy = 3 [json_name="waitPolicy"]; +} + +message XmlSerialize +{ + XmlOptionType xmloption = 1 [json_name="xmloption"]; + Node expr = 2 [json_name="expr"]; + TypeName type_name = 3 [json_name="typeName"]; + bool indent = 4 [json_name="indent"]; + int32 location = 5 [json_name="location"]; +} + +message PartitionElem +{ + string name = 1 [json_name="name"]; + Node expr = 2 [json_name="expr"]; + repeated Node collation = 3 [json_name="collation"]; + repeated Node opclass = 4 [json_name="opclass"]; + int32 location = 5 [json_name="location"]; +} + +message PartitionSpec +{ + PartitionStrategy strategy = 1 [json_name="strategy"]; + repeated Node part_params = 2 [json_name="partParams"]; + int32 location = 3 [json_name="location"]; +} + +message PartitionBoundSpec +{ + string strategy = 1 [json_name="strategy"]; + bool is_default = 2 [json_name="is_default"]; + int32 modulus = 3 [json_name="modulus"]; + int32 remainder = 4 [json_name="remainder"]; + repeated Node listdatums = 5 [json_name="listdatums"]; + repeated Node lowerdatums = 6 [json_name="lowerdatums"]; + repeated Node upperdatums = 7 [json_name="upperdatums"]; + int32 location = 8 [json_name="location"]; +} + +message PartitionRangeDatum +{ + PartitionRangeDatumKind kind = 1 [json_name="kind"]; + Node value = 2 [json_name="value"]; + int32 location = 3 [json_name="location"]; +} + +message PartitionCmd +{ + RangeVar name = 1 [json_name="name"]; + PartitionBoundSpec bound = 2 [json_name="bound"]; + bool concurrent = 3 [json_name="concurrent"]; +} + +message RangeTblEntry +{ + Alias alias = 1 [json_name="alias"]; + Alias eref = 2 [json_name="eref"]; + RTEKind rtekind = 3 [json_name="rtekind"]; + uint32 relid = 4 [json_name="relid"]; + bool inh = 5 [json_name="inh"]; + string relkind = 6 [json_name="relkind"]; + int32 rellockmode = 7 [json_name="rellockmode"]; + uint32 perminfoindex = 8 [json_name="perminfoindex"]; + TableSampleClause tablesample = 9 [json_name="tablesample"]; + Query subquery = 10 [json_name="subquery"]; + bool security_barrier = 11 [json_name="security_barrier"]; + JoinType jointype = 12 [json_name="jointype"]; + int32 joinmergedcols = 13 [json_name="joinmergedcols"]; + repeated Node joinaliasvars = 14 [json_name="joinaliasvars"]; + repeated Node joinleftcols = 15 [json_name="joinleftcols"]; + repeated Node joinrightcols = 16 [json_name="joinrightcols"]; + Alias join_using_alias = 17 [json_name="join_using_alias"]; + repeated Node functions = 18 [json_name="functions"]; + bool funcordinality = 19 [json_name="funcordinality"]; + TableFunc tablefunc = 20 [json_name="tablefunc"]; + repeated Node values_lists = 21 [json_name="values_lists"]; + string ctename = 22 [json_name="ctename"]; + uint32 ctelevelsup = 23 [json_name="ctelevelsup"]; + bool self_reference = 24 [json_name="self_reference"]; + repeated Node coltypes = 25 [json_name="coltypes"]; + repeated Node coltypmods = 26 [json_name="coltypmods"]; + repeated Node colcollations = 27 [json_name="colcollations"]; + string enrname = 28 [json_name="enrname"]; + double enrtuples = 29 [json_name="enrtuples"]; + repeated Node groupexprs = 30 [json_name="groupexprs"]; + bool lateral = 31 [json_name="lateral"]; + bool in_from_cl = 32 [json_name="inFromCl"]; + repeated Node security_quals = 33 [json_name="securityQuals"]; +} + +message RTEPermissionInfo +{ + uint32 relid = 1 [json_name="relid"]; + bool inh = 2 [json_name="inh"]; + uint64 required_perms = 3 [json_name="requiredPerms"]; + uint32 check_as_user = 4 [json_name="checkAsUser"]; + repeated uint64 selected_cols = 5 [json_name="selectedCols"]; + repeated uint64 inserted_cols = 6 [json_name="insertedCols"]; + repeated uint64 updated_cols = 7 [json_name="updatedCols"]; +} + +message RangeTblFunction +{ + Node funcexpr = 1 [json_name="funcexpr"]; + int32 funccolcount = 2 [json_name="funccolcount"]; + repeated Node funccolnames = 3 [json_name="funccolnames"]; + repeated Node funccoltypes = 4 [json_name="funccoltypes"]; + repeated Node funccoltypmods = 5 [json_name="funccoltypmods"]; + repeated Node funccolcollations = 6 [json_name="funccolcollations"]; + repeated uint64 funcparams = 7 [json_name="funcparams"]; +} + +message TableSampleClause +{ + uint32 tsmhandler = 1 [json_name="tsmhandler"]; + repeated Node args = 2 [json_name="args"]; + Node repeatable = 3 [json_name="repeatable"]; +} + +message WithCheckOption +{ + WCOKind kind = 1 [json_name="kind"]; + string relname = 2 [json_name="relname"]; + string polname = 3 [json_name="polname"]; + Node qual = 4 [json_name="qual"]; + bool cascaded = 5 [json_name="cascaded"]; +} + +message SortGroupClause +{ + uint32 tle_sort_group_ref = 1 [json_name="tleSortGroupRef"]; + uint32 eqop = 2 [json_name="eqop"]; + uint32 sortop = 3 [json_name="sortop"]; + bool reverse_sort = 4 [json_name="reverse_sort"]; + bool nulls_first = 5 [json_name="nulls_first"]; + bool hashable = 6 [json_name="hashable"]; +} + +message GroupingSet +{ + GroupingSetKind kind = 1 [json_name="kind"]; + repeated Node content = 2 [json_name="content"]; + int32 location = 3 [json_name="location"]; +} + +message WindowClause +{ + string name = 1 [json_name="name"]; + string refname = 2 [json_name="refname"]; + repeated Node partition_clause = 3 [json_name="partitionClause"]; + repeated Node order_clause = 4 [json_name="orderClause"]; + int32 frame_options = 5 [json_name="frameOptions"]; + Node start_offset = 6 [json_name="startOffset"]; + Node end_offset = 7 [json_name="endOffset"]; + uint32 start_in_range_func = 8 [json_name="startInRangeFunc"]; + uint32 end_in_range_func = 9 [json_name="endInRangeFunc"]; + uint32 in_range_coll = 10 [json_name="inRangeColl"]; + bool in_range_asc = 11 [json_name="inRangeAsc"]; + bool in_range_nulls_first = 12 [json_name="inRangeNullsFirst"]; + uint32 winref = 13 [json_name="winref"]; + bool copied_order = 14 [json_name="copiedOrder"]; +} + +message RowMarkClause +{ + uint32 rti = 1 [json_name="rti"]; + LockClauseStrength strength = 2 [json_name="strength"]; + LockWaitPolicy wait_policy = 3 [json_name="waitPolicy"]; + bool pushed_down = 4 [json_name="pushedDown"]; +} + +message WithClause +{ + repeated Node ctes = 1 [json_name="ctes"]; + bool recursive = 2 [json_name="recursive"]; + int32 location = 3 [json_name="location"]; +} + +message InferClause +{ + repeated Node index_elems = 1 [json_name="indexElems"]; + Node where_clause = 2 [json_name="whereClause"]; + string conname = 3 [json_name="conname"]; + int32 location = 4 [json_name="location"]; +} + +message OnConflictClause +{ + OnConflictAction action = 1 [json_name="action"]; + InferClause infer = 2 [json_name="infer"]; + repeated Node target_list = 3 [json_name="targetList"]; + Node where_clause = 4 [json_name="whereClause"]; + int32 location = 5 [json_name="location"]; +} + +message CTESearchClause +{ + repeated Node search_col_list = 1 [json_name="search_col_list"]; + bool search_breadth_first = 2 [json_name="search_breadth_first"]; + string search_seq_column = 3 [json_name="search_seq_column"]; + int32 location = 4 [json_name="location"]; +} + +message CTECycleClause +{ + repeated Node cycle_col_list = 1 [json_name="cycle_col_list"]; + string cycle_mark_column = 2 [json_name="cycle_mark_column"]; + Node cycle_mark_value = 3 [json_name="cycle_mark_value"]; + Node cycle_mark_default = 4 [json_name="cycle_mark_default"]; + string cycle_path_column = 5 [json_name="cycle_path_column"]; + int32 location = 6 [json_name="location"]; + uint32 cycle_mark_type = 7 [json_name="cycle_mark_type"]; + int32 cycle_mark_typmod = 8 [json_name="cycle_mark_typmod"]; + uint32 cycle_mark_collation = 9 [json_name="cycle_mark_collation"]; + uint32 cycle_mark_neop = 10 [json_name="cycle_mark_neop"]; +} + +message CommonTableExpr +{ + string ctename = 1 [json_name="ctename"]; + repeated Node aliascolnames = 2 [json_name="aliascolnames"]; + CTEMaterialize ctematerialized = 3 [json_name="ctematerialized"]; + Node ctequery = 4 [json_name="ctequery"]; + CTESearchClause search_clause = 5 [json_name="search_clause"]; + CTECycleClause cycle_clause = 6 [json_name="cycle_clause"]; + int32 location = 7 [json_name="location"]; + bool cterecursive = 8 [json_name="cterecursive"]; + int32 cterefcount = 9 [json_name="cterefcount"]; + repeated Node ctecolnames = 10 [json_name="ctecolnames"]; + repeated Node ctecoltypes = 11 [json_name="ctecoltypes"]; + repeated Node ctecoltypmods = 12 [json_name="ctecoltypmods"]; + repeated Node ctecolcollations = 13 [json_name="ctecolcollations"]; +} + +message MergeWhenClause +{ + MergeMatchKind match_kind = 1 [json_name="matchKind"]; + CmdType command_type = 2 [json_name="commandType"]; + OverridingKind override = 3 [json_name="override"]; + Node condition = 4 [json_name="condition"]; + repeated Node target_list = 5 [json_name="targetList"]; + repeated Node values = 6 [json_name="values"]; +} + +message ReturningOption +{ + ReturningOptionKind option = 1 [json_name="option"]; + string value = 2 [json_name="value"]; + int32 location = 3 [json_name="location"]; +} + +message ReturningClause +{ + repeated Node options = 1 [json_name="options"]; + repeated Node exprs = 2 [json_name="exprs"]; +} + +message TriggerTransition +{ + string name = 1 [json_name="name"]; + bool is_new = 2 [json_name="isNew"]; + bool is_table = 3 [json_name="isTable"]; +} + +message JsonOutput +{ + TypeName type_name = 1 [json_name="typeName"]; + JsonReturning returning = 2 [json_name="returning"]; +} + +message JsonArgument +{ + JsonValueExpr val = 1 [json_name="val"]; + string name = 2 [json_name="name"]; +} + +message JsonFuncExpr +{ + JsonExprOp op = 1 [json_name="op"]; + string column_name = 2 [json_name="column_name"]; + JsonValueExpr context_item = 3 [json_name="context_item"]; + Node pathspec = 4 [json_name="pathspec"]; + repeated Node passing = 5 [json_name="passing"]; + JsonOutput output = 6 [json_name="output"]; + JsonBehavior on_empty = 7 [json_name="on_empty"]; + JsonBehavior on_error = 8 [json_name="on_error"]; + JsonWrapper wrapper = 9 [json_name="wrapper"]; + JsonQuotes quotes = 10 [json_name="quotes"]; + int32 location = 11 [json_name="location"]; +} + +message JsonTablePathSpec +{ + Node string = 1 [json_name="string"]; + string name = 2 [json_name="name"]; + int32 name_location = 3 [json_name="name_location"]; + int32 location = 4 [json_name="location"]; +} + +message JsonTable +{ + JsonValueExpr context_item = 1 [json_name="context_item"]; + JsonTablePathSpec pathspec = 2 [json_name="pathspec"]; + repeated Node passing = 3 [json_name="passing"]; + repeated Node columns = 4 [json_name="columns"]; + JsonBehavior on_error = 5 [json_name="on_error"]; + Alias alias = 6 [json_name="alias"]; + bool lateral = 7 [json_name="lateral"]; + int32 location = 8 [json_name="location"]; +} + +message JsonTableColumn +{ + JsonTableColumnType coltype = 1 [json_name="coltype"]; + string name = 2 [json_name="name"]; + TypeName type_name = 3 [json_name="typeName"]; + JsonTablePathSpec pathspec = 4 [json_name="pathspec"]; + JsonFormat format = 5 [json_name="format"]; + JsonWrapper wrapper = 6 [json_name="wrapper"]; + JsonQuotes quotes = 7 [json_name="quotes"]; + repeated Node columns = 8 [json_name="columns"]; + JsonBehavior on_empty = 9 [json_name="on_empty"]; + JsonBehavior on_error = 10 [json_name="on_error"]; + int32 location = 11 [json_name="location"]; +} + +message JsonKeyValue +{ + Node key = 1 [json_name="key"]; + JsonValueExpr value = 2 [json_name="value"]; +} + +message JsonParseExpr +{ + JsonValueExpr expr = 1 [json_name="expr"]; + JsonOutput output = 2 [json_name="output"]; + bool unique_keys = 3 [json_name="unique_keys"]; + int32 location = 4 [json_name="location"]; +} + +message JsonScalarExpr +{ + Node expr = 1 [json_name="expr"]; + JsonOutput output = 2 [json_name="output"]; + int32 location = 3 [json_name="location"]; +} + +message JsonSerializeExpr +{ + JsonValueExpr expr = 1 [json_name="expr"]; + JsonOutput output = 2 [json_name="output"]; + int32 location = 3 [json_name="location"]; +} + +message JsonObjectConstructor +{ + repeated Node exprs = 1 [json_name="exprs"]; + JsonOutput output = 2 [json_name="output"]; + bool absent_on_null = 3 [json_name="absent_on_null"]; + bool unique = 4 [json_name="unique"]; + int32 location = 5 [json_name="location"]; +} + +message JsonArrayConstructor +{ + repeated Node exprs = 1 [json_name="exprs"]; + JsonOutput output = 2 [json_name="output"]; + bool absent_on_null = 3 [json_name="absent_on_null"]; + int32 location = 4 [json_name="location"]; +} + +message JsonArrayQueryConstructor +{ + Node query = 1 [json_name="query"]; + JsonOutput output = 2 [json_name="output"]; + JsonFormat format = 3 [json_name="format"]; + bool absent_on_null = 4 [json_name="absent_on_null"]; + int32 location = 5 [json_name="location"]; +} + +message JsonAggConstructor +{ + JsonOutput output = 1 [json_name="output"]; + Node agg_filter = 2 [json_name="agg_filter"]; + repeated Node agg_order = 3 [json_name="agg_order"]; + WindowDef over = 4 [json_name="over"]; + int32 location = 5 [json_name="location"]; +} + +message JsonObjectAgg +{ + JsonAggConstructor constructor = 1 [json_name="constructor"]; + JsonKeyValue arg = 2 [json_name="arg"]; + bool absent_on_null = 3 [json_name="absent_on_null"]; + bool unique = 4 [json_name="unique"]; +} + +message JsonArrayAgg +{ + JsonAggConstructor constructor = 1 [json_name="constructor"]; + JsonValueExpr arg = 2 [json_name="arg"]; + bool absent_on_null = 3 [json_name="absent_on_null"]; +} + +message RawStmt +{ + Node stmt = 1 [json_name="stmt"]; + int32 stmt_location = 2 [json_name="stmt_location"]; + int32 stmt_len = 3 [json_name="stmt_len"]; +} + +message InsertStmt +{ + RangeVar relation = 1 [json_name="relation"]; + repeated Node cols = 2 [json_name="cols"]; + Node select_stmt = 3 [json_name="selectStmt"]; + OnConflictClause on_conflict_clause = 4 [json_name="onConflictClause"]; + ReturningClause returning_clause = 5 [json_name="returningClause"]; + WithClause with_clause = 6 [json_name="withClause"]; + OverridingKind override = 7 [json_name="override"]; +} + +message DeleteStmt +{ + RangeVar relation = 1 [json_name="relation"]; + repeated Node using_clause = 2 [json_name="usingClause"]; + Node where_clause = 3 [json_name="whereClause"]; + ReturningClause returning_clause = 4 [json_name="returningClause"]; + WithClause with_clause = 5 [json_name="withClause"]; +} + +message UpdateStmt +{ + RangeVar relation = 1 [json_name="relation"]; + repeated Node target_list = 2 [json_name="targetList"]; + Node where_clause = 3 [json_name="whereClause"]; + repeated Node from_clause = 4 [json_name="fromClause"]; + ReturningClause returning_clause = 5 [json_name="returningClause"]; + WithClause with_clause = 6 [json_name="withClause"]; +} + +message MergeStmt +{ + RangeVar relation = 1 [json_name="relation"]; + Node source_relation = 2 [json_name="sourceRelation"]; + Node join_condition = 3 [json_name="joinCondition"]; + repeated Node merge_when_clauses = 4 [json_name="mergeWhenClauses"]; + ReturningClause returning_clause = 5 [json_name="returningClause"]; + WithClause with_clause = 6 [json_name="withClause"]; +} + +message SelectStmt +{ + repeated Node distinct_clause = 1 [json_name="distinctClause"]; + IntoClause into_clause = 2 [json_name="intoClause"]; + repeated Node target_list = 3 [json_name="targetList"]; + repeated Node from_clause = 4 [json_name="fromClause"]; + Node where_clause = 5 [json_name="whereClause"]; + repeated Node group_clause = 6 [json_name="groupClause"]; + bool group_distinct = 7 [json_name="groupDistinct"]; + Node having_clause = 8 [json_name="havingClause"]; + repeated Node window_clause = 9 [json_name="windowClause"]; + repeated Node values_lists = 10 [json_name="valuesLists"]; + repeated Node sort_clause = 11 [json_name="sortClause"]; + Node limit_offset = 12 [json_name="limitOffset"]; + Node limit_count = 13 [json_name="limitCount"]; + LimitOption limit_option = 14 [json_name="limitOption"]; + repeated Node locking_clause = 15 [json_name="lockingClause"]; + WithClause with_clause = 16 [json_name="withClause"]; + SetOperation op = 17 [json_name="op"]; + bool all = 18 [json_name="all"]; + SelectStmt larg = 19 [json_name="larg"]; + SelectStmt rarg = 20 [json_name="rarg"]; +} + +message SetOperationStmt +{ + SetOperation op = 1 [json_name="op"]; + bool all = 2 [json_name="all"]; + Node larg = 3 [json_name="larg"]; + Node rarg = 4 [json_name="rarg"]; + repeated Node col_types = 5 [json_name="colTypes"]; + repeated Node col_typmods = 6 [json_name="colTypmods"]; + repeated Node col_collations = 7 [json_name="colCollations"]; + repeated Node group_clauses = 8 [json_name="groupClauses"]; +} + +message ReturnStmt +{ + Node returnval = 1 [json_name="returnval"]; +} + +message PLAssignStmt +{ + string name = 1 [json_name="name"]; + repeated Node indirection = 2 [json_name="indirection"]; + int32 nnames = 3 [json_name="nnames"]; + SelectStmt val = 4 [json_name="val"]; + int32 location = 5 [json_name="location"]; +} + +message CreateSchemaStmt +{ + string schemaname = 1 [json_name="schemaname"]; + RoleSpec authrole = 2 [json_name="authrole"]; + repeated Node schema_elts = 3 [json_name="schemaElts"]; + bool if_not_exists = 4 [json_name="if_not_exists"]; +} + +message AlterTableStmt +{ + RangeVar relation = 1 [json_name="relation"]; + repeated Node cmds = 2 [json_name="cmds"]; + ObjectType objtype = 3 [json_name="objtype"]; + bool missing_ok = 4 [json_name="missing_ok"]; +} + +message AlterTableCmd +{ + AlterTableType subtype = 1 [json_name="subtype"]; + string name = 2 [json_name="name"]; + int32 num = 3 [json_name="num"]; + RoleSpec newowner = 4 [json_name="newowner"]; + Node def = 5 [json_name="def"]; + DropBehavior behavior = 6 [json_name="behavior"]; + bool missing_ok = 7 [json_name="missing_ok"]; + bool recurse = 8 [json_name="recurse"]; +} + +message ATAlterConstraint +{ + string conname = 1 [json_name="conname"]; + bool alter_enforceability = 2 [json_name="alterEnforceability"]; + bool is_enforced = 3 [json_name="is_enforced"]; + bool alter_deferrability = 4 [json_name="alterDeferrability"]; + bool deferrable = 5 [json_name="deferrable"]; + bool initdeferred = 6 [json_name="initdeferred"]; + bool alter_inheritability = 7 [json_name="alterInheritability"]; + bool noinherit = 8 [json_name="noinherit"]; +} + +message ReplicaIdentityStmt +{ + string identity_type = 1 [json_name="identity_type"]; + string name = 2 [json_name="name"]; +} + +message AlterCollationStmt +{ + repeated Node collname = 1 [json_name="collname"]; +} + +message AlterDomainStmt +{ + string subtype = 1 [json_name="subtype"]; + repeated Node type_name = 2 [json_name="typeName"]; + string name = 3 [json_name="name"]; + Node def = 4 [json_name="def"]; + DropBehavior behavior = 5 [json_name="behavior"]; + bool missing_ok = 6 [json_name="missing_ok"]; +} + +message GrantStmt +{ + bool is_grant = 1 [json_name="is_grant"]; + GrantTargetType targtype = 2 [json_name="targtype"]; + ObjectType objtype = 3 [json_name="objtype"]; + repeated Node objects = 4 [json_name="objects"]; + repeated Node privileges = 5 [json_name="privileges"]; + repeated Node grantees = 6 [json_name="grantees"]; + bool grant_option = 7 [json_name="grant_option"]; + RoleSpec grantor = 8 [json_name="grantor"]; + DropBehavior behavior = 9 [json_name="behavior"]; +} + +message ObjectWithArgs +{ + repeated Node objname = 1 [json_name="objname"]; + repeated Node objargs = 2 [json_name="objargs"]; + repeated Node objfuncargs = 3 [json_name="objfuncargs"]; + bool args_unspecified = 4 [json_name="args_unspecified"]; +} + +message AccessPriv +{ + string priv_name = 1 [json_name="priv_name"]; + repeated Node cols = 2 [json_name="cols"]; +} + +message GrantRoleStmt +{ + repeated Node granted_roles = 1 [json_name="granted_roles"]; + repeated Node grantee_roles = 2 [json_name="grantee_roles"]; + bool is_grant = 3 [json_name="is_grant"]; + repeated Node opt = 4 [json_name="opt"]; + RoleSpec grantor = 5 [json_name="grantor"]; + DropBehavior behavior = 6 [json_name="behavior"]; +} + +message AlterDefaultPrivilegesStmt +{ + repeated Node options = 1 [json_name="options"]; + GrantStmt action = 2 [json_name="action"]; +} + +message CopyStmt +{ + RangeVar relation = 1 [json_name="relation"]; + Node query = 2 [json_name="query"]; + repeated Node attlist = 3 [json_name="attlist"]; + bool is_from = 4 [json_name="is_from"]; + bool is_program = 5 [json_name="is_program"]; + string filename = 6 [json_name="filename"]; + repeated Node options = 7 [json_name="options"]; + Node where_clause = 8 [json_name="whereClause"]; +} + +message VariableSetStmt +{ + VariableSetKind kind = 1 [json_name="kind"]; + string name = 2 [json_name="name"]; + repeated Node args = 3 [json_name="args"]; + bool jumble_args = 4 [json_name="jumble_args"]; + bool is_local = 5 [json_name="is_local"]; + int32 location = 6 [json_name="location"]; +} + +message VariableShowStmt +{ + string name = 1 [json_name="name"]; +} + +message CreateStmt +{ + RangeVar relation = 1 [json_name="relation"]; + repeated Node table_elts = 2 [json_name="tableElts"]; + repeated Node inh_relations = 3 [json_name="inhRelations"]; + PartitionBoundSpec partbound = 4 [json_name="partbound"]; + PartitionSpec partspec = 5 [json_name="partspec"]; + TypeName of_typename = 6 [json_name="ofTypename"]; + repeated Node constraints = 7 [json_name="constraints"]; + repeated Node nnconstraints = 8 [json_name="nnconstraints"]; + repeated Node options = 9 [json_name="options"]; + OnCommitAction oncommit = 10 [json_name="oncommit"]; + string tablespacename = 11 [json_name="tablespacename"]; + string access_method = 12 [json_name="accessMethod"]; + bool if_not_exists = 13 [json_name="if_not_exists"]; +} + +message Constraint +{ + ConstrType contype = 1 [json_name="contype"]; + string conname = 2 [json_name="conname"]; + bool deferrable = 3 [json_name="deferrable"]; + bool initdeferred = 4 [json_name="initdeferred"]; + bool is_enforced = 5 [json_name="is_enforced"]; + bool skip_validation = 6 [json_name="skip_validation"]; + bool initially_valid = 7 [json_name="initially_valid"]; + bool is_no_inherit = 8 [json_name="is_no_inherit"]; + Node raw_expr = 9 [json_name="raw_expr"]; + string cooked_expr = 10 [json_name="cooked_expr"]; + string generated_when = 11 [json_name="generated_when"]; + string generated_kind = 12 [json_name="generated_kind"]; + bool nulls_not_distinct = 13 [json_name="nulls_not_distinct"]; + repeated Node keys = 14 [json_name="keys"]; + bool without_overlaps = 15 [json_name="without_overlaps"]; + repeated Node including = 16 [json_name="including"]; + repeated Node exclusions = 17 [json_name="exclusions"]; + repeated Node options = 18 [json_name="options"]; + string indexname = 19 [json_name="indexname"]; + string indexspace = 20 [json_name="indexspace"]; + bool reset_default_tblspc = 21 [json_name="reset_default_tblspc"]; + string access_method = 22 [json_name="access_method"]; + Node where_clause = 23 [json_name="where_clause"]; + RangeVar pktable = 24 [json_name="pktable"]; + repeated Node fk_attrs = 25 [json_name="fk_attrs"]; + repeated Node pk_attrs = 26 [json_name="pk_attrs"]; + bool fk_with_period = 27 [json_name="fk_with_period"]; + bool pk_with_period = 28 [json_name="pk_with_period"]; + string fk_matchtype = 29 [json_name="fk_matchtype"]; + string fk_upd_action = 30 [json_name="fk_upd_action"]; + string fk_del_action = 31 [json_name="fk_del_action"]; + repeated Node fk_del_set_cols = 32 [json_name="fk_del_set_cols"]; + repeated Node old_conpfeqop = 33 [json_name="old_conpfeqop"]; + uint32 old_pktable_oid = 34 [json_name="old_pktable_oid"]; + int32 location = 35 [json_name="location"]; +} + +message CreateTableSpaceStmt +{ + string tablespacename = 1 [json_name="tablespacename"]; + RoleSpec owner = 2 [json_name="owner"]; + string location = 3 [json_name="location"]; + repeated Node options = 4 [json_name="options"]; +} + +message DropTableSpaceStmt +{ + string tablespacename = 1 [json_name="tablespacename"]; + bool missing_ok = 2 [json_name="missing_ok"]; +} + +message AlterTableSpaceOptionsStmt +{ + string tablespacename = 1 [json_name="tablespacename"]; + repeated Node options = 2 [json_name="options"]; + bool is_reset = 3 [json_name="isReset"]; +} + +message AlterTableMoveAllStmt +{ + string orig_tablespacename = 1 [json_name="orig_tablespacename"]; + ObjectType objtype = 2 [json_name="objtype"]; + repeated Node roles = 3 [json_name="roles"]; + string new_tablespacename = 4 [json_name="new_tablespacename"]; + bool nowait = 5 [json_name="nowait"]; +} + +message CreateExtensionStmt +{ + string extname = 1 [json_name="extname"]; + bool if_not_exists = 2 [json_name="if_not_exists"]; + repeated Node options = 3 [json_name="options"]; +} + +message AlterExtensionStmt +{ + string extname = 1 [json_name="extname"]; + repeated Node options = 2 [json_name="options"]; +} + +message AlterExtensionContentsStmt +{ + string extname = 1 [json_name="extname"]; + int32 action = 2 [json_name="action"]; + ObjectType objtype = 3 [json_name="objtype"]; + Node object = 4 [json_name="object"]; +} + +message CreateFdwStmt +{ + string fdwname = 1 [json_name="fdwname"]; + repeated Node func_options = 2 [json_name="func_options"]; + repeated Node options = 3 [json_name="options"]; +} + +message AlterFdwStmt +{ + string fdwname = 1 [json_name="fdwname"]; + repeated Node func_options = 2 [json_name="func_options"]; + repeated Node options = 3 [json_name="options"]; +} + +message CreateForeignServerStmt +{ + string servername = 1 [json_name="servername"]; + string servertype = 2 [json_name="servertype"]; + string version = 3 [json_name="version"]; + string fdwname = 4 [json_name="fdwname"]; + bool if_not_exists = 5 [json_name="if_not_exists"]; + repeated Node options = 6 [json_name="options"]; +} + +message AlterForeignServerStmt +{ + string servername = 1 [json_name="servername"]; + string version = 2 [json_name="version"]; + repeated Node options = 3 [json_name="options"]; + bool has_version = 4 [json_name="has_version"]; +} + +message CreateForeignTableStmt +{ + CreateStmt base_stmt = 1 [json_name="base"]; + string servername = 2 [json_name="servername"]; + repeated Node options = 3 [json_name="options"]; +} + +message CreateUserMappingStmt +{ + RoleSpec user = 1 [json_name="user"]; + string servername = 2 [json_name="servername"]; + bool if_not_exists = 3 [json_name="if_not_exists"]; + repeated Node options = 4 [json_name="options"]; +} + +message AlterUserMappingStmt +{ + RoleSpec user = 1 [json_name="user"]; + string servername = 2 [json_name="servername"]; + repeated Node options = 3 [json_name="options"]; +} + +message DropUserMappingStmt +{ + RoleSpec user = 1 [json_name="user"]; + string servername = 2 [json_name="servername"]; + bool missing_ok = 3 [json_name="missing_ok"]; +} + +message ImportForeignSchemaStmt +{ + string server_name = 1 [json_name="server_name"]; + string remote_schema = 2 [json_name="remote_schema"]; + string local_schema = 3 [json_name="local_schema"]; + ImportForeignSchemaType list_type = 4 [json_name="list_type"]; + repeated Node table_list = 5 [json_name="table_list"]; + repeated Node options = 6 [json_name="options"]; +} + +message CreatePolicyStmt +{ + string policy_name = 1 [json_name="policy_name"]; + RangeVar table = 2 [json_name="table"]; + string cmd_name = 3 [json_name="cmd_name"]; + bool permissive = 4 [json_name="permissive"]; + repeated Node roles = 5 [json_name="roles"]; + Node qual = 6 [json_name="qual"]; + Node with_check = 7 [json_name="with_check"]; +} + +message AlterPolicyStmt +{ + string policy_name = 1 [json_name="policy_name"]; + RangeVar table = 2 [json_name="table"]; + repeated Node roles = 3 [json_name="roles"]; + Node qual = 4 [json_name="qual"]; + Node with_check = 5 [json_name="with_check"]; +} + +message CreateAmStmt +{ + string amname = 1 [json_name="amname"]; + repeated Node handler_name = 2 [json_name="handler_name"]; + string amtype = 3 [json_name="amtype"]; +} + +message CreateTrigStmt +{ + bool replace = 1 [json_name="replace"]; + bool isconstraint = 2 [json_name="isconstraint"]; + string trigname = 3 [json_name="trigname"]; + RangeVar relation = 4 [json_name="relation"]; + repeated Node funcname = 5 [json_name="funcname"]; + repeated Node args = 6 [json_name="args"]; + bool row = 7 [json_name="row"]; + int32 timing = 8 [json_name="timing"]; + int32 events = 9 [json_name="events"]; + repeated Node columns = 10 [json_name="columns"]; + Node when_clause = 11 [json_name="whenClause"]; + repeated Node transition_rels = 12 [json_name="transitionRels"]; + bool deferrable = 13 [json_name="deferrable"]; + bool initdeferred = 14 [json_name="initdeferred"]; + RangeVar constrrel = 15 [json_name="constrrel"]; +} + +message CreateEventTrigStmt +{ + string trigname = 1 [json_name="trigname"]; + string eventname = 2 [json_name="eventname"]; + repeated Node whenclause = 3 [json_name="whenclause"]; + repeated Node funcname = 4 [json_name="funcname"]; +} + +message AlterEventTrigStmt +{ + string trigname = 1 [json_name="trigname"]; + string tgenabled = 2 [json_name="tgenabled"]; +} + +message CreatePLangStmt +{ + bool replace = 1 [json_name="replace"]; + string plname = 2 [json_name="plname"]; + repeated Node plhandler = 3 [json_name="plhandler"]; + repeated Node plinline = 4 [json_name="plinline"]; + repeated Node plvalidator = 5 [json_name="plvalidator"]; + bool pltrusted = 6 [json_name="pltrusted"]; +} + +message CreateRoleStmt +{ + RoleStmtType stmt_type = 1 [json_name="stmt_type"]; + string role = 2 [json_name="role"]; + repeated Node options = 3 [json_name="options"]; +} + +message AlterRoleStmt +{ + RoleSpec role = 1 [json_name="role"]; + repeated Node options = 2 [json_name="options"]; + int32 action = 3 [json_name="action"]; +} + +message AlterRoleSetStmt +{ + RoleSpec role = 1 [json_name="role"]; + string database = 2 [json_name="database"]; + VariableSetStmt setstmt = 3 [json_name="setstmt"]; +} + +message DropRoleStmt +{ + repeated Node roles = 1 [json_name="roles"]; + bool missing_ok = 2 [json_name="missing_ok"]; +} + +message CreateSeqStmt +{ + RangeVar sequence = 1 [json_name="sequence"]; + repeated Node options = 2 [json_name="options"]; + uint32 owner_id = 3 [json_name="ownerId"]; + bool for_identity = 4 [json_name="for_identity"]; + bool if_not_exists = 5 [json_name="if_not_exists"]; +} + +message AlterSeqStmt +{ + RangeVar sequence = 1 [json_name="sequence"]; + repeated Node options = 2 [json_name="options"]; + bool for_identity = 3 [json_name="for_identity"]; + bool missing_ok = 4 [json_name="missing_ok"]; +} + +message DefineStmt +{ + ObjectType kind = 1 [json_name="kind"]; + bool oldstyle = 2 [json_name="oldstyle"]; + repeated Node defnames = 3 [json_name="defnames"]; + repeated Node args = 4 [json_name="args"]; + repeated Node definition = 5 [json_name="definition"]; + bool if_not_exists = 6 [json_name="if_not_exists"]; + bool replace = 7 [json_name="replace"]; +} + +message CreateDomainStmt +{ + repeated Node domainname = 1 [json_name="domainname"]; + TypeName type_name = 2 [json_name="typeName"]; + CollateClause coll_clause = 3 [json_name="collClause"]; + repeated Node constraints = 4 [json_name="constraints"]; +} + +message CreateOpClassStmt +{ + repeated Node opclassname = 1 [json_name="opclassname"]; + repeated Node opfamilyname = 2 [json_name="opfamilyname"]; + string amname = 3 [json_name="amname"]; + TypeName datatype = 4 [json_name="datatype"]; + repeated Node items = 5 [json_name="items"]; + bool is_default = 6 [json_name="isDefault"]; +} + +message CreateOpClassItem +{ + int32 itemtype = 1 [json_name="itemtype"]; + ObjectWithArgs name = 2 [json_name="name"]; + int32 number = 3 [json_name="number"]; + repeated Node order_family = 4 [json_name="order_family"]; + repeated Node class_args = 5 [json_name="class_args"]; + TypeName storedtype = 6 [json_name="storedtype"]; +} + +message CreateOpFamilyStmt +{ + repeated Node opfamilyname = 1 [json_name="opfamilyname"]; + string amname = 2 [json_name="amname"]; +} + +message AlterOpFamilyStmt +{ + repeated Node opfamilyname = 1 [json_name="opfamilyname"]; + string amname = 2 [json_name="amname"]; + bool is_drop = 3 [json_name="isDrop"]; + repeated Node items = 4 [json_name="items"]; +} + +message DropStmt +{ + repeated Node objects = 1 [json_name="objects"]; + ObjectType remove_type = 2 [json_name="removeType"]; + DropBehavior behavior = 3 [json_name="behavior"]; + bool missing_ok = 4 [json_name="missing_ok"]; + bool concurrent = 5 [json_name="concurrent"]; +} + +message TruncateStmt +{ + repeated Node relations = 1 [json_name="relations"]; + bool restart_seqs = 2 [json_name="restart_seqs"]; + DropBehavior behavior = 3 [json_name="behavior"]; +} + +message CommentStmt +{ + ObjectType objtype = 1 [json_name="objtype"]; + Node object = 2 [json_name="object"]; + string comment = 3 [json_name="comment"]; +} + +message SecLabelStmt +{ + ObjectType objtype = 1 [json_name="objtype"]; + Node object = 2 [json_name="object"]; + string provider = 3 [json_name="provider"]; + string label = 4 [json_name="label"]; +} + +message DeclareCursorStmt +{ + string portalname = 1 [json_name="portalname"]; + int32 options = 2 [json_name="options"]; + Node query = 3 [json_name="query"]; +} + +message ClosePortalStmt +{ + string portalname = 1 [json_name="portalname"]; +} + +message FetchStmt +{ + FetchDirection direction = 1 [json_name="direction"]; + int64 how_many = 2 [json_name="howMany"]; + string portalname = 3 [json_name="portalname"]; + bool ismove = 4 [json_name="ismove"]; +} + +message IndexStmt +{ + string idxname = 1 [json_name="idxname"]; + RangeVar relation = 2 [json_name="relation"]; + string access_method = 3 [json_name="accessMethod"]; + string table_space = 4 [json_name="tableSpace"]; + repeated Node index_params = 5 [json_name="indexParams"]; + repeated Node index_including_params = 6 [json_name="indexIncludingParams"]; + repeated Node options = 7 [json_name="options"]; + Node where_clause = 8 [json_name="whereClause"]; + repeated Node exclude_op_names = 9 [json_name="excludeOpNames"]; + string idxcomment = 10 [json_name="idxcomment"]; + uint32 index_oid = 11 [json_name="indexOid"]; + uint32 old_number = 12 [json_name="oldNumber"]; + uint32 old_create_subid = 13 [json_name="oldCreateSubid"]; + uint32 old_first_relfilelocator_subid = 14 [json_name="oldFirstRelfilelocatorSubid"]; + bool unique = 15 [json_name="unique"]; + bool nulls_not_distinct = 16 [json_name="nulls_not_distinct"]; + bool primary = 17 [json_name="primary"]; + bool isconstraint = 18 [json_name="isconstraint"]; + bool iswithoutoverlaps = 19 [json_name="iswithoutoverlaps"]; + bool deferrable = 20 [json_name="deferrable"]; + bool initdeferred = 21 [json_name="initdeferred"]; + bool transformed = 22 [json_name="transformed"]; + bool concurrent = 23 [json_name="concurrent"]; + bool if_not_exists = 24 [json_name="if_not_exists"]; + bool reset_default_tblspc = 25 [json_name="reset_default_tblspc"]; +} + +message CreateStatsStmt +{ + repeated Node defnames = 1 [json_name="defnames"]; + repeated Node stat_types = 2 [json_name="stat_types"]; + repeated Node exprs = 3 [json_name="exprs"]; + repeated Node relations = 4 [json_name="relations"]; + string stxcomment = 5 [json_name="stxcomment"]; + bool transformed = 6 [json_name="transformed"]; + bool if_not_exists = 7 [json_name="if_not_exists"]; +} + +message StatsElem +{ + string name = 1 [json_name="name"]; + Node expr = 2 [json_name="expr"]; +} + +message AlterStatsStmt +{ + repeated Node defnames = 1 [json_name="defnames"]; + Node stxstattarget = 2 [json_name="stxstattarget"]; + bool missing_ok = 3 [json_name="missing_ok"]; +} + +message CreateFunctionStmt +{ + bool is_procedure = 1 [json_name="is_procedure"]; + bool replace = 2 [json_name="replace"]; + repeated Node funcname = 3 [json_name="funcname"]; + repeated Node parameters = 4 [json_name="parameters"]; + TypeName return_type = 5 [json_name="returnType"]; + repeated Node options = 6 [json_name="options"]; + Node sql_body = 7 [json_name="sql_body"]; +} + +message FunctionParameter +{ + string name = 1 [json_name="name"]; + TypeName arg_type = 2 [json_name="argType"]; + FunctionParameterMode mode = 3 [json_name="mode"]; + Node defexpr = 4 [json_name="defexpr"]; + int32 location = 5 [json_name="location"]; +} + +message AlterFunctionStmt +{ + ObjectType objtype = 1 [json_name="objtype"]; + ObjectWithArgs func = 2 [json_name="func"]; + repeated Node actions = 3 [json_name="actions"]; +} + +message DoStmt +{ + repeated Node args = 1 [json_name="args"]; +} + +message InlineCodeBlock +{ + string source_text = 1 [json_name="source_text"]; + uint32 lang_oid = 2 [json_name="langOid"]; + bool lang_is_trusted = 3 [json_name="langIsTrusted"]; + bool atomic = 4 [json_name="atomic"]; +} + +message CallStmt +{ + FuncCall funccall = 1 [json_name="funccall"]; + FuncExpr funcexpr = 2 [json_name="funcexpr"]; + repeated Node outargs = 3 [json_name="outargs"]; +} + +message CallContext +{ + bool atomic = 1 [json_name="atomic"]; +} + +message RenameStmt +{ + ObjectType rename_type = 1 [json_name="renameType"]; + ObjectType relation_type = 2 [json_name="relationType"]; + RangeVar relation = 3 [json_name="relation"]; + Node object = 4 [json_name="object"]; + string subname = 5 [json_name="subname"]; + string newname = 6 [json_name="newname"]; + DropBehavior behavior = 7 [json_name="behavior"]; + bool missing_ok = 8 [json_name="missing_ok"]; +} + +message AlterObjectDependsStmt +{ + ObjectType object_type = 1 [json_name="objectType"]; + RangeVar relation = 2 [json_name="relation"]; + Node object = 3 [json_name="object"]; + String extname = 4 [json_name="extname"]; + bool remove = 5 [json_name="remove"]; +} + +message AlterObjectSchemaStmt +{ + ObjectType object_type = 1 [json_name="objectType"]; + RangeVar relation = 2 [json_name="relation"]; + Node object = 3 [json_name="object"]; + string newschema = 4 [json_name="newschema"]; + bool missing_ok = 5 [json_name="missing_ok"]; +} + +message AlterOwnerStmt +{ + ObjectType object_type = 1 [json_name="objectType"]; + RangeVar relation = 2 [json_name="relation"]; + Node object = 3 [json_name="object"]; + RoleSpec newowner = 4 [json_name="newowner"]; +} + +message AlterOperatorStmt +{ + ObjectWithArgs opername = 1 [json_name="opername"]; + repeated Node options = 2 [json_name="options"]; +} + +message AlterTypeStmt +{ + repeated Node type_name = 1 [json_name="typeName"]; + repeated Node options = 2 [json_name="options"]; +} + +message RuleStmt +{ + RangeVar relation = 1 [json_name="relation"]; + string rulename = 2 [json_name="rulename"]; + Node where_clause = 3 [json_name="whereClause"]; + CmdType event = 4 [json_name="event"]; + bool instead = 5 [json_name="instead"]; + repeated Node actions = 6 [json_name="actions"]; + bool replace = 7 [json_name="replace"]; +} + +message NotifyStmt +{ + string conditionname = 1 [json_name="conditionname"]; + string payload = 2 [json_name="payload"]; +} + +message ListenStmt +{ + string conditionname = 1 [json_name="conditionname"]; +} + +message UnlistenStmt +{ + string conditionname = 1 [json_name="conditionname"]; +} + +message TransactionStmt +{ + TransactionStmtKind kind = 1 [json_name="kind"]; + repeated Node options = 2 [json_name="options"]; + string savepoint_name = 3 [json_name="savepoint_name"]; + string gid = 4 [json_name="gid"]; + bool chain = 5 [json_name="chain"]; + int32 location = 6 [json_name="location"]; +} + +message CompositeTypeStmt +{ + RangeVar typevar = 1 [json_name="typevar"]; + repeated Node coldeflist = 2 [json_name="coldeflist"]; +} + +message CreateEnumStmt +{ + repeated Node type_name = 1 [json_name="typeName"]; + repeated Node vals = 2 [json_name="vals"]; +} + +message CreateRangeStmt +{ + repeated Node type_name = 1 [json_name="typeName"]; + repeated Node params = 2 [json_name="params"]; +} + +message AlterEnumStmt +{ + repeated Node type_name = 1 [json_name="typeName"]; + string old_val = 2 [json_name="oldVal"]; + string new_val = 3 [json_name="newVal"]; + string new_val_neighbor = 4 [json_name="newValNeighbor"]; + bool new_val_is_after = 5 [json_name="newValIsAfter"]; + bool skip_if_new_val_exists = 6 [json_name="skipIfNewValExists"]; +} + +message ViewStmt +{ + RangeVar view = 1 [json_name="view"]; + repeated Node aliases = 2 [json_name="aliases"]; + Node query = 3 [json_name="query"]; + bool replace = 4 [json_name="replace"]; + repeated Node options = 5 [json_name="options"]; + ViewCheckOption with_check_option = 6 [json_name="withCheckOption"]; +} + +message LoadStmt +{ + string filename = 1 [json_name="filename"]; +} + +message CreatedbStmt +{ + string dbname = 1 [json_name="dbname"]; + repeated Node options = 2 [json_name="options"]; +} + +message AlterDatabaseStmt +{ + string dbname = 1 [json_name="dbname"]; + repeated Node options = 2 [json_name="options"]; +} + +message AlterDatabaseRefreshCollStmt +{ + string dbname = 1 [json_name="dbname"]; +} + +message AlterDatabaseSetStmt +{ + string dbname = 1 [json_name="dbname"]; + VariableSetStmt setstmt = 2 [json_name="setstmt"]; +} + +message DropdbStmt +{ + string dbname = 1 [json_name="dbname"]; + bool missing_ok = 2 [json_name="missing_ok"]; + repeated Node options = 3 [json_name="options"]; +} + +message AlterSystemStmt +{ + VariableSetStmt setstmt = 1 [json_name="setstmt"]; +} + +message ClusterStmt +{ + RangeVar relation = 1 [json_name="relation"]; + string indexname = 2 [json_name="indexname"]; + repeated Node params = 3 [json_name="params"]; +} + +message VacuumStmt +{ + repeated Node options = 1 [json_name="options"]; + repeated Node rels = 2 [json_name="rels"]; + bool is_vacuumcmd = 3 [json_name="is_vacuumcmd"]; +} + +message VacuumRelation +{ + RangeVar relation = 1 [json_name="relation"]; + uint32 oid = 2 [json_name="oid"]; + repeated Node va_cols = 3 [json_name="va_cols"]; +} + +message ExplainStmt +{ + Node query = 1 [json_name="query"]; + repeated Node options = 2 [json_name="options"]; +} + +message CreateTableAsStmt +{ + Node query = 1 [json_name="query"]; + IntoClause into = 2 [json_name="into"]; + ObjectType objtype = 3 [json_name="objtype"]; + bool is_select_into = 4 [json_name="is_select_into"]; + bool if_not_exists = 5 [json_name="if_not_exists"]; +} + +message RefreshMatViewStmt +{ + bool concurrent = 1 [json_name="concurrent"]; + bool skip_data = 2 [json_name="skipData"]; + RangeVar relation = 3 [json_name="relation"]; +} + +message CheckPointStmt +{ +} + +message DiscardStmt +{ + DiscardMode target = 1 [json_name="target"]; +} + +message LockStmt +{ + repeated Node relations = 1 [json_name="relations"]; + int32 mode = 2 [json_name="mode"]; + bool nowait = 3 [json_name="nowait"]; +} + +message ConstraintsSetStmt +{ + repeated Node constraints = 1 [json_name="constraints"]; + bool deferred = 2 [json_name="deferred"]; +} + +message ReindexStmt +{ + ReindexObjectType kind = 1 [json_name="kind"]; + RangeVar relation = 2 [json_name="relation"]; + string name = 3 [json_name="name"]; + repeated Node params = 4 [json_name="params"]; +} + +message CreateConversionStmt +{ + repeated Node conversion_name = 1 [json_name="conversion_name"]; + string for_encoding_name = 2 [json_name="for_encoding_name"]; + string to_encoding_name = 3 [json_name="to_encoding_name"]; + repeated Node func_name = 4 [json_name="func_name"]; + bool def = 5 [json_name="def"]; +} + +message CreateCastStmt +{ + TypeName sourcetype = 1 [json_name="sourcetype"]; + TypeName targettype = 2 [json_name="targettype"]; + ObjectWithArgs func = 3 [json_name="func"]; + CoercionContext context = 4 [json_name="context"]; + bool inout = 5 [json_name="inout"]; +} + +message CreateTransformStmt +{ + bool replace = 1 [json_name="replace"]; + TypeName type_name = 2 [json_name="type_name"]; + string lang = 3 [json_name="lang"]; + ObjectWithArgs fromsql = 4 [json_name="fromsql"]; + ObjectWithArgs tosql = 5 [json_name="tosql"]; +} + +message PrepareStmt +{ + string name = 1 [json_name="name"]; + repeated Node argtypes = 2 [json_name="argtypes"]; + Node query = 3 [json_name="query"]; +} + +message ExecuteStmt +{ + string name = 1 [json_name="name"]; + repeated Node params = 2 [json_name="params"]; +} + +message DeallocateStmt +{ + string name = 1 [json_name="name"]; + bool isall = 2 [json_name="isall"]; + int32 location = 3 [json_name="location"]; +} + +message DropOwnedStmt +{ + repeated Node roles = 1 [json_name="roles"]; + DropBehavior behavior = 2 [json_name="behavior"]; +} + +message ReassignOwnedStmt +{ + repeated Node roles = 1 [json_name="roles"]; + RoleSpec newrole = 2 [json_name="newrole"]; +} + +message AlterTSDictionaryStmt +{ + repeated Node dictname = 1 [json_name="dictname"]; + repeated Node options = 2 [json_name="options"]; +} + +message AlterTSConfigurationStmt +{ + AlterTSConfigType kind = 1 [json_name="kind"]; + repeated Node cfgname = 2 [json_name="cfgname"]; + repeated Node tokentype = 3 [json_name="tokentype"]; + repeated Node dicts = 4 [json_name="dicts"]; + bool override = 5 [json_name="override"]; + bool replace = 6 [json_name="replace"]; + bool missing_ok = 7 [json_name="missing_ok"]; +} + +message PublicationTable +{ + RangeVar relation = 1 [json_name="relation"]; + Node where_clause = 2 [json_name="whereClause"]; + repeated Node columns = 3 [json_name="columns"]; +} + +message PublicationObjSpec +{ + PublicationObjSpecType pubobjtype = 1 [json_name="pubobjtype"]; + string name = 2 [json_name="name"]; + PublicationTable pubtable = 3 [json_name="pubtable"]; + int32 location = 4 [json_name="location"]; +} + +message CreatePublicationStmt +{ + string pubname = 1 [json_name="pubname"]; + repeated Node options = 2 [json_name="options"]; + repeated Node pubobjects = 3 [json_name="pubobjects"]; + bool for_all_tables = 4 [json_name="for_all_tables"]; +} + +message AlterPublicationStmt +{ + string pubname = 1 [json_name="pubname"]; + repeated Node options = 2 [json_name="options"]; + repeated Node pubobjects = 3 [json_name="pubobjects"]; + bool for_all_tables = 4 [json_name="for_all_tables"]; + AlterPublicationAction action = 5 [json_name="action"]; +} + +message CreateSubscriptionStmt +{ + string subname = 1 [json_name="subname"]; + string conninfo = 2 [json_name="conninfo"]; + repeated Node publication = 3 [json_name="publication"]; + repeated Node options = 4 [json_name="options"]; +} + +message AlterSubscriptionStmt +{ + AlterSubscriptionType kind = 1 [json_name="kind"]; + string subname = 2 [json_name="subname"]; + string conninfo = 3 [json_name="conninfo"]; + repeated Node publication = 4 [json_name="publication"]; + repeated Node options = 5 [json_name="options"]; +} + +message DropSubscriptionStmt +{ + string subname = 1 [json_name="subname"]; + bool missing_ok = 2 [json_name="missing_ok"]; + DropBehavior behavior = 3 [json_name="behavior"]; +} + +enum QuerySource +{ + QUERY_SOURCE_UNDEFINED = 0; + QSRC_ORIGINAL = 1; + QSRC_PARSER = 2; + QSRC_INSTEAD_RULE = 3; + QSRC_QUAL_INSTEAD_RULE = 4; + QSRC_NON_INSTEAD_RULE = 5; +} + +enum SortByDir +{ + SORT_BY_DIR_UNDEFINED = 0; + SORTBY_DEFAULT = 1; + SORTBY_ASC = 2; + SORTBY_DESC = 3; + SORTBY_USING = 4; +} + +enum SortByNulls +{ + SORT_BY_NULLS_UNDEFINED = 0; + SORTBY_NULLS_DEFAULT = 1; + SORTBY_NULLS_FIRST = 2; + SORTBY_NULLS_LAST = 3; +} + +enum SetQuantifier +{ + SET_QUANTIFIER_UNDEFINED = 0; + SET_QUANTIFIER_DEFAULT = 1; + SET_QUANTIFIER_ALL = 2; + SET_QUANTIFIER_DISTINCT = 3; +} + +enum A_Expr_Kind +{ + A_EXPR_KIND_UNDEFINED = 0; + AEXPR_OP = 1; + AEXPR_OP_ANY = 2; + AEXPR_OP_ALL = 3; + AEXPR_DISTINCT = 4; + AEXPR_NOT_DISTINCT = 5; + AEXPR_NULLIF = 6; + AEXPR_IN = 7; + AEXPR_LIKE = 8; + AEXPR_ILIKE = 9; + AEXPR_SIMILAR = 10; + AEXPR_BETWEEN = 11; + AEXPR_NOT_BETWEEN = 12; + AEXPR_BETWEEN_SYM = 13; + AEXPR_NOT_BETWEEN_SYM = 14; +} + +enum RoleSpecType +{ + ROLE_SPEC_TYPE_UNDEFINED = 0; + ROLESPEC_CSTRING = 1; + ROLESPEC_CURRENT_ROLE = 2; + ROLESPEC_CURRENT_USER = 3; + ROLESPEC_SESSION_USER = 4; + ROLESPEC_PUBLIC = 5; +} + +enum TableLikeOption +{ + TABLE_LIKE_OPTION_UNDEFINED = 0; + CREATE_TABLE_LIKE_COMMENTS = 1; + CREATE_TABLE_LIKE_COMPRESSION = 2; + CREATE_TABLE_LIKE_CONSTRAINTS = 3; + CREATE_TABLE_LIKE_DEFAULTS = 4; + CREATE_TABLE_LIKE_GENERATED = 5; + CREATE_TABLE_LIKE_IDENTITY = 6; + CREATE_TABLE_LIKE_INDEXES = 7; + CREATE_TABLE_LIKE_STATISTICS = 8; + CREATE_TABLE_LIKE_STORAGE = 9; + CREATE_TABLE_LIKE_ALL = 10; +} + +enum DefElemAction +{ + DEF_ELEM_ACTION_UNDEFINED = 0; + DEFELEM_UNSPEC = 1; + DEFELEM_SET = 2; + DEFELEM_ADD = 3; + DEFELEM_DROP = 4; +} + +enum PartitionStrategy +{ + PARTITION_STRATEGY_UNDEFINED = 0; + PARTITION_STRATEGY_LIST = 1; + PARTITION_STRATEGY_RANGE = 2; + PARTITION_STRATEGY_HASH = 3; +} + +enum PartitionRangeDatumKind +{ + PARTITION_RANGE_DATUM_KIND_UNDEFINED = 0; + PARTITION_RANGE_DATUM_MINVALUE = 1; + PARTITION_RANGE_DATUM_VALUE = 2; + PARTITION_RANGE_DATUM_MAXVALUE = 3; +} + +enum RTEKind +{ + RTEKIND_UNDEFINED = 0; + RTE_RELATION = 1; + RTE_SUBQUERY = 2; + RTE_JOIN = 3; + RTE_FUNCTION = 4; + RTE_TABLEFUNC = 5; + RTE_VALUES = 6; + RTE_CTE = 7; + RTE_NAMEDTUPLESTORE = 8; + RTE_RESULT = 9; + RTE_GROUP = 10; +} + +enum WCOKind +{ + WCOKIND_UNDEFINED = 0; + WCO_VIEW_CHECK = 1; + WCO_RLS_INSERT_CHECK = 2; + WCO_RLS_UPDATE_CHECK = 3; + WCO_RLS_CONFLICT_CHECK = 4; + WCO_RLS_MERGE_UPDATE_CHECK = 5; + WCO_RLS_MERGE_DELETE_CHECK = 6; +} + +enum GroupingSetKind +{ + GROUPING_SET_KIND_UNDEFINED = 0; + GROUPING_SET_EMPTY = 1; + GROUPING_SET_SIMPLE = 2; + GROUPING_SET_ROLLUP = 3; + GROUPING_SET_CUBE = 4; + GROUPING_SET_SETS = 5; +} + +enum CTEMaterialize +{ + CTEMATERIALIZE_UNDEFINED = 0; + CTEMaterializeDefault = 1; + CTEMaterializeAlways = 2; + CTEMaterializeNever = 3; +} + +enum ReturningOptionKind +{ + RETURNING_OPTION_KIND_UNDEFINED = 0; + RETURNING_OPTION_OLD = 1; + RETURNING_OPTION_NEW = 2; +} + +enum JsonQuotes +{ + JSON_QUOTES_UNDEFINED = 0; + JS_QUOTES_UNSPEC = 1; + JS_QUOTES_KEEP = 2; + JS_QUOTES_OMIT = 3; +} + +enum JsonTableColumnType +{ + JSON_TABLE_COLUMN_TYPE_UNDEFINED = 0; + JTC_FOR_ORDINALITY = 1; + JTC_REGULAR = 2; + JTC_EXISTS = 3; + JTC_FORMATTED = 4; + JTC_NESTED = 5; +} + +enum SetOperation +{ + SET_OPERATION_UNDEFINED = 0; + SETOP_NONE = 1; + SETOP_UNION = 2; + SETOP_INTERSECT = 3; + SETOP_EXCEPT = 4; +} + +enum ObjectType +{ + OBJECT_TYPE_UNDEFINED = 0; + OBJECT_ACCESS_METHOD = 1; + OBJECT_AGGREGATE = 2; + OBJECT_AMOP = 3; + OBJECT_AMPROC = 4; + OBJECT_ATTRIBUTE = 5; + OBJECT_CAST = 6; + OBJECT_COLUMN = 7; + OBJECT_COLLATION = 8; + OBJECT_CONVERSION = 9; + OBJECT_DATABASE = 10; + OBJECT_DEFAULT = 11; + OBJECT_DEFACL = 12; + OBJECT_DOMAIN = 13; + OBJECT_DOMCONSTRAINT = 14; + OBJECT_EVENT_TRIGGER = 15; + OBJECT_EXTENSION = 16; + OBJECT_FDW = 17; + OBJECT_FOREIGN_SERVER = 18; + OBJECT_FOREIGN_TABLE = 19; + OBJECT_FUNCTION = 20; + OBJECT_INDEX = 21; + OBJECT_LANGUAGE = 22; + OBJECT_LARGEOBJECT = 23; + OBJECT_MATVIEW = 24; + OBJECT_OPCLASS = 25; + OBJECT_OPERATOR = 26; + OBJECT_OPFAMILY = 27; + OBJECT_PARAMETER_ACL = 28; + OBJECT_POLICY = 29; + OBJECT_PROCEDURE = 30; + OBJECT_PUBLICATION = 31; + OBJECT_PUBLICATION_NAMESPACE = 32; + OBJECT_PUBLICATION_REL = 33; + OBJECT_ROLE = 34; + OBJECT_ROUTINE = 35; + OBJECT_RULE = 36; + OBJECT_SCHEMA = 37; + OBJECT_SEQUENCE = 38; + OBJECT_SUBSCRIPTION = 39; + OBJECT_STATISTIC_EXT = 40; + OBJECT_TABCONSTRAINT = 41; + OBJECT_TABLE = 42; + OBJECT_TABLESPACE = 43; + OBJECT_TRANSFORM = 44; + OBJECT_TRIGGER = 45; + OBJECT_TSCONFIGURATION = 46; + OBJECT_TSDICTIONARY = 47; + OBJECT_TSPARSER = 48; + OBJECT_TSTEMPLATE = 49; + OBJECT_TYPE = 50; + OBJECT_USER_MAPPING = 51; + OBJECT_VIEW = 52; +} + +enum DropBehavior +{ + DROP_BEHAVIOR_UNDEFINED = 0; + DROP_RESTRICT = 1; + DROP_CASCADE = 2; +} + +enum AlterTableType +{ + ALTER_TABLE_TYPE_UNDEFINED = 0; + AT_AddColumn = 1; + AT_AddColumnToView = 2; + AT_ColumnDefault = 3; + AT_CookedColumnDefault = 4; + AT_DropNotNull = 5; + AT_SetNotNull = 6; + AT_SetExpression = 7; + AT_DropExpression = 8; + AT_SetStatistics = 9; + AT_SetOptions = 10; + AT_ResetOptions = 11; + AT_SetStorage = 12; + AT_SetCompression = 13; + AT_DropColumn = 14; + AT_AddIndex = 15; + AT_ReAddIndex = 16; + AT_AddConstraint = 17; + AT_ReAddConstraint = 18; + AT_ReAddDomainConstraint = 19; + AT_AlterConstraint = 20; + AT_ValidateConstraint = 21; + AT_AddIndexConstraint = 22; + AT_DropConstraint = 23; + AT_ReAddComment = 24; + AT_AlterColumnType = 25; + AT_AlterColumnGenericOptions = 26; + AT_ChangeOwner = 27; + AT_ClusterOn = 28; + AT_DropCluster = 29; + AT_SetLogged = 30; + AT_SetUnLogged = 31; + AT_DropOids = 32; + AT_SetAccessMethod = 33; + AT_SetTableSpace = 34; + AT_SetRelOptions = 35; + AT_ResetRelOptions = 36; + AT_ReplaceRelOptions = 37; + AT_EnableTrig = 38; + AT_EnableAlwaysTrig = 39; + AT_EnableReplicaTrig = 40; + AT_DisableTrig = 41; + AT_EnableTrigAll = 42; + AT_DisableTrigAll = 43; + AT_EnableTrigUser = 44; + AT_DisableTrigUser = 45; + AT_EnableRule = 46; + AT_EnableAlwaysRule = 47; + AT_EnableReplicaRule = 48; + AT_DisableRule = 49; + AT_AddInherit = 50; + AT_DropInherit = 51; + AT_AddOf = 52; + AT_DropOf = 53; + AT_ReplicaIdentity = 54; + AT_EnableRowSecurity = 55; + AT_DisableRowSecurity = 56; + AT_ForceRowSecurity = 57; + AT_NoForceRowSecurity = 58; + AT_GenericOptions = 59; + AT_AttachPartition = 60; + AT_DetachPartition = 61; + AT_DetachPartitionFinalize = 62; + AT_AddIdentity = 63; + AT_SetIdentity = 64; + AT_DropIdentity = 65; + AT_ReAddStatistics = 66; +} + +enum GrantTargetType +{ + GRANT_TARGET_TYPE_UNDEFINED = 0; + ACL_TARGET_OBJECT = 1; + ACL_TARGET_ALL_IN_SCHEMA = 2; + ACL_TARGET_DEFAULTS = 3; +} + +enum VariableSetKind +{ + VARIABLE_SET_KIND_UNDEFINED = 0; + VAR_SET_VALUE = 1; + VAR_SET_DEFAULT = 2; + VAR_SET_CURRENT = 3; + VAR_SET_MULTI = 4; + VAR_RESET = 5; + VAR_RESET_ALL = 6; +} + +enum ConstrType +{ + CONSTR_TYPE_UNDEFINED = 0; + CONSTR_NULL = 1; + CONSTR_NOTNULL = 2; + CONSTR_DEFAULT = 3; + CONSTR_IDENTITY = 4; + CONSTR_GENERATED = 5; + CONSTR_CHECK = 6; + CONSTR_PRIMARY = 7; + CONSTR_UNIQUE = 8; + CONSTR_EXCLUSION = 9; + CONSTR_FOREIGN = 10; + CONSTR_ATTR_DEFERRABLE = 11; + CONSTR_ATTR_NOT_DEFERRABLE = 12; + CONSTR_ATTR_DEFERRED = 13; + CONSTR_ATTR_IMMEDIATE = 14; + CONSTR_ATTR_ENFORCED = 15; + CONSTR_ATTR_NOT_ENFORCED = 16; +} + +enum ImportForeignSchemaType +{ + IMPORT_FOREIGN_SCHEMA_TYPE_UNDEFINED = 0; + FDW_IMPORT_SCHEMA_ALL = 1; + FDW_IMPORT_SCHEMA_LIMIT_TO = 2; + FDW_IMPORT_SCHEMA_EXCEPT = 3; +} + +enum RoleStmtType +{ + ROLE_STMT_TYPE_UNDEFINED = 0; + ROLESTMT_ROLE = 1; + ROLESTMT_USER = 2; + ROLESTMT_GROUP = 3; +} + +enum FetchDirection +{ + FETCH_DIRECTION_UNDEFINED = 0; + FETCH_FORWARD = 1; + FETCH_BACKWARD = 2; + FETCH_ABSOLUTE = 3; + FETCH_RELATIVE = 4; +} + +enum FunctionParameterMode +{ + FUNCTION_PARAMETER_MODE_UNDEFINED = 0; + FUNC_PARAM_IN = 1; + FUNC_PARAM_OUT = 2; + FUNC_PARAM_INOUT = 3; + FUNC_PARAM_VARIADIC = 4; + FUNC_PARAM_TABLE = 5; + FUNC_PARAM_DEFAULT = 6; +} + +enum TransactionStmtKind +{ + TRANSACTION_STMT_KIND_UNDEFINED = 0; + TRANS_STMT_BEGIN = 1; + TRANS_STMT_START = 2; + TRANS_STMT_COMMIT = 3; + TRANS_STMT_ROLLBACK = 4; + TRANS_STMT_SAVEPOINT = 5; + TRANS_STMT_RELEASE = 6; + TRANS_STMT_ROLLBACK_TO = 7; + TRANS_STMT_PREPARE = 8; + TRANS_STMT_COMMIT_PREPARED = 9; + TRANS_STMT_ROLLBACK_PREPARED = 10; +} + +enum ViewCheckOption +{ + VIEW_CHECK_OPTION_UNDEFINED = 0; + NO_CHECK_OPTION = 1; + LOCAL_CHECK_OPTION = 2; + CASCADED_CHECK_OPTION = 3; +} + +enum DiscardMode +{ + DISCARD_MODE_UNDEFINED = 0; + DISCARD_ALL = 1; + DISCARD_PLANS = 2; + DISCARD_SEQUENCES = 3; + DISCARD_TEMP = 4; +} + +enum ReindexObjectType +{ + REINDEX_OBJECT_TYPE_UNDEFINED = 0; + REINDEX_OBJECT_INDEX = 1; + REINDEX_OBJECT_TABLE = 2; + REINDEX_OBJECT_SCHEMA = 3; + REINDEX_OBJECT_SYSTEM = 4; + REINDEX_OBJECT_DATABASE = 5; +} + +enum AlterTSConfigType +{ + ALTER_TSCONFIG_TYPE_UNDEFINED = 0; + ALTER_TSCONFIG_ADD_MAPPING = 1; + ALTER_TSCONFIG_ALTER_MAPPING_FOR_TOKEN = 2; + ALTER_TSCONFIG_REPLACE_DICT = 3; + ALTER_TSCONFIG_REPLACE_DICT_FOR_TOKEN = 4; + ALTER_TSCONFIG_DROP_MAPPING = 5; +} + +enum PublicationObjSpecType +{ + PUBLICATION_OBJ_SPEC_TYPE_UNDEFINED = 0; + PUBLICATIONOBJ_TABLE = 1; + PUBLICATIONOBJ_TABLES_IN_SCHEMA = 2; + PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA = 3; + PUBLICATIONOBJ_CONTINUATION = 4; +} + +enum AlterPublicationAction +{ + ALTER_PUBLICATION_ACTION_UNDEFINED = 0; + AP_AddObjects = 1; + AP_DropObjects = 2; + AP_SetObjects = 3; +} + +enum AlterSubscriptionType +{ + ALTER_SUBSCRIPTION_TYPE_UNDEFINED = 0; + ALTER_SUBSCRIPTION_OPTIONS = 1; + ALTER_SUBSCRIPTION_CONNECTION = 2; + ALTER_SUBSCRIPTION_SET_PUBLICATION = 3; + ALTER_SUBSCRIPTION_ADD_PUBLICATION = 4; + ALTER_SUBSCRIPTION_DROP_PUBLICATION = 5; + ALTER_SUBSCRIPTION_REFRESH = 6; + ALTER_SUBSCRIPTION_ENABLED = 7; + ALTER_SUBSCRIPTION_SKIP = 8; +} + +enum OverridingKind +{ + OVERRIDING_KIND_UNDEFINED = 0; + OVERRIDING_NOT_SET = 1; + OVERRIDING_USER_VALUE = 2; + OVERRIDING_SYSTEM_VALUE = 3; +} + +enum OnCommitAction +{ + ON_COMMIT_ACTION_UNDEFINED = 0; + ONCOMMIT_NOOP = 1; + ONCOMMIT_PRESERVE_ROWS = 2; + ONCOMMIT_DELETE_ROWS = 3; + ONCOMMIT_DROP = 4; +} + +enum TableFuncType +{ + TABLE_FUNC_TYPE_UNDEFINED = 0; + TFT_XMLTABLE = 1; + TFT_JSON_TABLE = 2; +} + +enum VarReturningType +{ + VAR_RETURNING_TYPE_UNDEFINED = 0; + VAR_RETURNING_DEFAULT = 1; + VAR_RETURNING_OLD = 2; + VAR_RETURNING_NEW = 3; +} + +enum ParamKind +{ + PARAM_KIND_UNDEFINED = 0; + PARAM_EXTERN = 1; + PARAM_EXEC = 2; + PARAM_SUBLINK = 3; + PARAM_MULTIEXPR = 4; +} + +enum CoercionContext +{ + COERCION_CONTEXT_UNDEFINED = 0; + COERCION_IMPLICIT = 1; + COERCION_ASSIGNMENT = 2; + COERCION_PLPGSQL = 3; + COERCION_EXPLICIT = 4; +} + +enum CoercionForm +{ + COERCION_FORM_UNDEFINED = 0; + COERCE_EXPLICIT_CALL = 1; + COERCE_EXPLICIT_CAST = 2; + COERCE_IMPLICIT_CAST = 3; + COERCE_SQL_SYNTAX = 4; +} + +enum BoolExprType +{ + BOOL_EXPR_TYPE_UNDEFINED = 0; + AND_EXPR = 1; + OR_EXPR = 2; + NOT_EXPR = 3; +} + +enum SubLinkType +{ + SUB_LINK_TYPE_UNDEFINED = 0; + EXISTS_SUBLINK = 1; + ALL_SUBLINK = 2; + ANY_SUBLINK = 3; + ROWCOMPARE_SUBLINK = 4; + EXPR_SUBLINK = 5; + MULTIEXPR_SUBLINK = 6; + ARRAY_SUBLINK = 7; + CTE_SUBLINK = 8; +} + +enum MinMaxOp +{ + MIN_MAX_OP_UNDEFINED = 0; + IS_GREATEST = 1; + IS_LEAST = 2; +} + +enum SQLValueFunctionOp +{ + SQLVALUE_FUNCTION_OP_UNDEFINED = 0; + SVFOP_CURRENT_DATE = 1; + SVFOP_CURRENT_TIME = 2; + SVFOP_CURRENT_TIME_N = 3; + SVFOP_CURRENT_TIMESTAMP = 4; + SVFOP_CURRENT_TIMESTAMP_N = 5; + SVFOP_LOCALTIME = 6; + SVFOP_LOCALTIME_N = 7; + SVFOP_LOCALTIMESTAMP = 8; + SVFOP_LOCALTIMESTAMP_N = 9; + SVFOP_CURRENT_ROLE = 10; + SVFOP_CURRENT_USER = 11; + SVFOP_USER = 12; + SVFOP_SESSION_USER = 13; + SVFOP_CURRENT_CATALOG = 14; + SVFOP_CURRENT_SCHEMA = 15; +} + +enum XmlExprOp +{ + XML_EXPR_OP_UNDEFINED = 0; + IS_XMLCONCAT = 1; + IS_XMLELEMENT = 2; + IS_XMLFOREST = 3; + IS_XMLPARSE = 4; + IS_XMLPI = 5; + IS_XMLROOT = 6; + IS_XMLSERIALIZE = 7; + IS_DOCUMENT = 8; +} + +enum XmlOptionType +{ + XML_OPTION_TYPE_UNDEFINED = 0; + XMLOPTION_DOCUMENT = 1; + XMLOPTION_CONTENT = 2; +} + +enum JsonEncoding +{ + JSON_ENCODING_UNDEFINED = 0; + JS_ENC_DEFAULT = 1; + JS_ENC_UTF8 = 2; + JS_ENC_UTF16 = 3; + JS_ENC_UTF32 = 4; +} + +enum JsonFormatType +{ + JSON_FORMAT_TYPE_UNDEFINED = 0; + JS_FORMAT_DEFAULT = 1; + JS_FORMAT_JSON = 2; + JS_FORMAT_JSONB = 3; +} + +enum JsonConstructorType +{ + JSON_CONSTRUCTOR_TYPE_UNDEFINED = 0; + JSCTOR_JSON_OBJECT = 1; + JSCTOR_JSON_ARRAY = 2; + JSCTOR_JSON_OBJECTAGG = 3; + JSCTOR_JSON_ARRAYAGG = 4; + JSCTOR_JSON_PARSE = 5; + JSCTOR_JSON_SCALAR = 6; + JSCTOR_JSON_SERIALIZE = 7; +} + +enum JsonValueType +{ + JSON_VALUE_TYPE_UNDEFINED = 0; + JS_TYPE_ANY = 1; + JS_TYPE_OBJECT = 2; + JS_TYPE_ARRAY = 3; + JS_TYPE_SCALAR = 4; +} + +enum JsonWrapper +{ + JSON_WRAPPER_UNDEFINED = 0; + JSW_UNSPEC = 1; + JSW_NONE = 2; + JSW_CONDITIONAL = 3; + JSW_UNCONDITIONAL = 4; +} + +enum JsonBehaviorType +{ + JSON_BEHAVIOR_TYPE_UNDEFINED = 0; + JSON_BEHAVIOR_NULL = 1; + JSON_BEHAVIOR_ERROR = 2; + JSON_BEHAVIOR_EMPTY = 3; + JSON_BEHAVIOR_TRUE = 4; + JSON_BEHAVIOR_FALSE = 5; + JSON_BEHAVIOR_UNKNOWN = 6; + JSON_BEHAVIOR_EMPTY_ARRAY = 7; + JSON_BEHAVIOR_EMPTY_OBJECT = 8; + JSON_BEHAVIOR_DEFAULT = 9; +} + +enum JsonExprOp +{ + JSON_EXPR_OP_UNDEFINED = 0; + JSON_EXISTS_OP = 1; + JSON_QUERY_OP = 2; + JSON_VALUE_OP = 3; + JSON_TABLE_OP = 4; +} + +enum NullTestType +{ + NULL_TEST_TYPE_UNDEFINED = 0; + IS_NULL = 1; + IS_NOT_NULL = 2; +} + +enum BoolTestType +{ + BOOL_TEST_TYPE_UNDEFINED = 0; + IS_TRUE = 1; + IS_NOT_TRUE = 2; + IS_FALSE = 3; + IS_NOT_FALSE = 4; + IS_UNKNOWN = 5; + IS_NOT_UNKNOWN = 6; +} + +enum MergeMatchKind +{ + MERGE_MATCH_KIND_UNDEFINED = 0; + MERGE_WHEN_MATCHED = 1; + MERGE_WHEN_NOT_MATCHED_BY_SOURCE = 2; + MERGE_WHEN_NOT_MATCHED_BY_TARGET = 3; +} + +enum CmdType +{ + CMD_TYPE_UNDEFINED = 0; + CMD_UNKNOWN = 1; + CMD_SELECT = 2; + CMD_UPDATE = 3; + CMD_INSERT = 4; + CMD_DELETE = 5; + CMD_MERGE = 6; + CMD_UTILITY = 7; + CMD_NOTHING = 8; +} + +enum JoinType +{ + JOIN_TYPE_UNDEFINED = 0; + JOIN_INNER = 1; + JOIN_LEFT = 2; + JOIN_FULL = 3; + JOIN_RIGHT = 4; + JOIN_SEMI = 5; + JOIN_ANTI = 6; + JOIN_RIGHT_SEMI = 7; + JOIN_RIGHT_ANTI = 8; + JOIN_UNIQUE_OUTER = 9; + JOIN_UNIQUE_INNER = 10; +} + +enum AggStrategy +{ + AGG_STRATEGY_UNDEFINED = 0; + AGG_PLAIN = 1; + AGG_SORTED = 2; + AGG_HASHED = 3; + AGG_MIXED = 4; +} + +enum AggSplit +{ + AGG_SPLIT_UNDEFINED = 0; + AGGSPLIT_SIMPLE = 1; + AGGSPLIT_INITIAL_SERIAL = 2; + AGGSPLIT_FINAL_DESERIAL = 3; +} + +enum SetOpCmd +{ + SET_OP_CMD_UNDEFINED = 0; + SETOPCMD_INTERSECT = 1; + SETOPCMD_INTERSECT_ALL = 2; + SETOPCMD_EXCEPT = 3; + SETOPCMD_EXCEPT_ALL = 4; +} + +enum SetOpStrategy +{ + SET_OP_STRATEGY_UNDEFINED = 0; + SETOP_SORTED = 1; + SETOP_HASHED = 2; +} + +enum OnConflictAction +{ + ON_CONFLICT_ACTION_UNDEFINED = 0; + ONCONFLICT_NONE = 1; + ONCONFLICT_NOTHING = 2; + ONCONFLICT_UPDATE = 3; +} + +enum LimitOption +{ + LIMIT_OPTION_UNDEFINED = 0; + LIMIT_OPTION_DEFAULT = 1; + LIMIT_OPTION_COUNT = 2; + LIMIT_OPTION_WITH_TIES = 3; +} + +enum LockClauseStrength +{ + LOCK_CLAUSE_STRENGTH_UNDEFINED = 0; + LCS_NONE = 1; + LCS_FORKEYSHARE = 2; + LCS_FORSHARE = 3; + LCS_FORNOKEYUPDATE = 4; + LCS_FORUPDATE = 5; +} + +enum LockWaitPolicy +{ + LOCK_WAIT_POLICY_UNDEFINED = 0; + LockWaitBlock = 1; + LockWaitSkip = 2; + LockWaitError = 3; +} + +enum LockTupleMode +{ + LOCK_TUPLE_MODE_UNDEFINED = 0; + LockTupleKeyShare = 1; + LockTupleShare = 2; + LockTupleNoKeyExclusive = 3; + LockTupleExclusive = 4; +} + +enum CompareType +{ + COMPARE_TYPE_UNDEFINED = 0; + COMPARE_INVALID = 1; + COMPARE_LT = 2; + COMPARE_LE = 3; + COMPARE_EQ = 4; + COMPARE_GE = 5; + COMPARE_GT = 6; + COMPARE_NE = 7; + COMPARE_OVERLAP = 8; + COMPARE_CONTAINED_BY = 9; +} + +message ScanToken { + int32 start = 1; + int32 end = 2; + Token token = 4; + KeywordKind keyword_kind = 5; +} + +enum KeywordKind { + NO_KEYWORD = 0; + UNRESERVED_KEYWORD = 1; + COL_NAME_KEYWORD = 2; + TYPE_FUNC_NAME_KEYWORD = 3; + RESERVED_KEYWORD = 4; +} + +enum Token { + NUL = 0; + // Single-character tokens that are returned 1:1 (identical with "self" list in scan.l) + // Either supporting syntax, or single-character operators (some can be both) + // Also see https://www.postgresql.org/docs/12/sql-syntax-lexical.html#SQL-SYNTAX-SPECIAL-CHARS + ASCII_36 = 36; // "$" + ASCII_37 = 37; // "%" + ASCII_40 = 40; // "(" + ASCII_41 = 41; // ")" + ASCII_42 = 42; // "*" + ASCII_43 = 43; // "+" + ASCII_44 = 44; // "," + ASCII_45 = 45; // "-" + ASCII_46 = 46; // "." + ASCII_47 = 47; // "/" + ASCII_58 = 58; // ":" + ASCII_59 = 59; // ";" + ASCII_60 = 60; // "<" + ASCII_61 = 61; // "=" + ASCII_62 = 62; // ">" + ASCII_63 = 63; // "?" + ASCII_91 = 91; // "[" + ASCII_92 = 92; // "\" + ASCII_93 = 93; // "]" + ASCII_94 = 94; // "^" + // Named tokens in scan.l + IDENT = 258; + UIDENT = 259; + FCONST = 260; + SCONST = 261; + USCONST = 262; + BCONST = 263; + XCONST = 264; + Op = 265; + ICONST = 266; + PARAM = 267; + TYPECAST = 268; + DOT_DOT = 269; + COLON_EQUALS = 270; + EQUALS_GREATER = 271; + LESS_EQUALS = 272; + GREATER_EQUALS = 273; + NOT_EQUALS = 274; + SQL_COMMENT = 275; + C_COMMENT = 276; + ABORT_P = 277; + ABSENT = 278; + ABSOLUTE_P = 279; + ACCESS = 280; + ACTION = 281; + ADD_P = 282; + ADMIN = 283; + AFTER = 284; + AGGREGATE = 285; + ALL = 286; + ALSO = 287; + ALTER = 288; + ALWAYS = 289; + ANALYSE = 290; + ANALYZE = 291; + AND = 292; + ANY = 293; + ARRAY = 294; + AS = 295; + ASC = 296; + ASENSITIVE = 297; + ASSERTION = 298; + ASSIGNMENT = 299; + ASYMMETRIC = 300; + ATOMIC = 301; + AT = 302; + ATTACH = 303; + ATTRIBUTE = 304; + AUTHORIZATION = 305; + BACKWARD = 306; + BEFORE = 307; + BEGIN_P = 308; + BETWEEN = 309; + BIGINT = 310; + BINARY = 311; + BIT = 312; + BOOLEAN_P = 313; + BOTH = 314; + BREADTH = 315; + BY = 316; + CACHE = 317; + CALL = 318; + CALLED = 319; + CASCADE = 320; + CASCADED = 321; + CASE = 322; + CAST = 323; + CATALOG_P = 324; + CHAIN = 325; + CHAR_P = 326; + CHARACTER = 327; + CHARACTERISTICS = 328; + CHECK = 329; + CHECKPOINT = 330; + CLASS = 331; + CLOSE = 332; + CLUSTER = 333; + COALESCE = 334; + COLLATE = 335; + COLLATION = 336; + COLUMN = 337; + COLUMNS = 338; + COMMENT = 339; + COMMENTS = 340; + COMMIT = 341; + COMMITTED = 342; + COMPRESSION = 343; + CONCURRENTLY = 344; + CONDITIONAL = 345; + CONFIGURATION = 346; + CONFLICT = 347; + CONNECTION = 348; + CONSTRAINT = 349; + CONSTRAINTS = 350; + CONTENT_P = 351; + CONTINUE_P = 352; + CONVERSION_P = 353; + COPY = 354; + COST = 355; + CREATE = 356; + CROSS = 357; + CSV = 358; + CUBE = 359; + CURRENT_P = 360; + CURRENT_CATALOG = 361; + CURRENT_DATE = 362; + CURRENT_ROLE = 363; + CURRENT_SCHEMA = 364; + CURRENT_TIME = 365; + CURRENT_TIMESTAMP = 366; + CURRENT_USER = 367; + CURSOR = 368; + CYCLE = 369; + DATA_P = 370; + DATABASE = 371; + DAY_P = 372; + DEALLOCATE = 373; + DEC = 374; + DECIMAL_P = 375; + DECLARE = 376; + DEFAULT = 377; + DEFAULTS = 378; + DEFERRABLE = 379; + DEFERRED = 380; + DEFINER = 381; + DELETE_P = 382; + DELIMITER = 383; + DELIMITERS = 384; + DEPENDS = 385; + DEPTH = 386; + DESC = 387; + DETACH = 388; + DICTIONARY = 389; + DISABLE_P = 390; + DISCARD = 391; + DISTINCT = 392; + DO = 393; + DOCUMENT_P = 394; + DOMAIN_P = 395; + DOUBLE_P = 396; + DROP = 397; + EACH = 398; + ELSE = 399; + EMPTY_P = 400; + ENABLE_P = 401; + ENCODING = 402; + ENCRYPTED = 403; + END_P = 404; + ENFORCED = 405; + ENUM_P = 406; + ERROR_P = 407; + ESCAPE = 408; + EVENT = 409; + EXCEPT = 410; + EXCLUDE = 411; + EXCLUDING = 412; + EXCLUSIVE = 413; + EXECUTE = 414; + EXISTS = 415; + EXPLAIN = 416; + EXPRESSION = 417; + EXTENSION = 418; + EXTERNAL = 419; + EXTRACT = 420; + FALSE_P = 421; + FAMILY = 422; + FETCH = 423; + FILTER = 424; + FINALIZE = 425; + FIRST_P = 426; + FLOAT_P = 427; + FOLLOWING = 428; + FOR = 429; + FORCE = 430; + FOREIGN = 431; + FORMAT = 432; + FORWARD = 433; + FREEZE = 434; + FROM = 435; + FULL = 436; + FUNCTION = 437; + FUNCTIONS = 438; + GENERATED = 439; + GLOBAL = 440; + GRANT = 441; + GRANTED = 442; + GREATEST = 443; + GROUP_P = 444; + GROUPING = 445; + GROUPS = 446; + HANDLER = 447; + HAVING = 448; + HEADER_P = 449; + HOLD = 450; + HOUR_P = 451; + IDENTITY_P = 452; + IF_P = 453; + ILIKE = 454; + IMMEDIATE = 455; + IMMUTABLE = 456; + IMPLICIT_P = 457; + IMPORT_P = 458; + IN_P = 459; + INCLUDE = 460; + INCLUDING = 461; + INCREMENT = 462; + INDENT = 463; + INDEX = 464; + INDEXES = 465; + INHERIT = 466; + INHERITS = 467; + INITIALLY = 468; + INLINE_P = 469; + INNER_P = 470; + INOUT = 471; + INPUT_P = 472; + INSENSITIVE = 473; + INSERT = 474; + INSTEAD = 475; + INT_P = 476; + INTEGER = 477; + INTERSECT = 478; + INTERVAL = 479; + INTO = 480; + INVOKER = 481; + IS = 482; + ISNULL = 483; + ISOLATION = 484; + JOIN = 485; + JSON = 486; + JSON_ARRAY = 487; + JSON_ARRAYAGG = 488; + JSON_EXISTS = 489; + JSON_OBJECT = 490; + JSON_OBJECTAGG = 491; + JSON_QUERY = 492; + JSON_SCALAR = 493; + JSON_SERIALIZE = 494; + JSON_TABLE = 495; + JSON_VALUE = 496; + KEEP = 497; + KEY = 498; + KEYS = 499; + LABEL = 500; + LANGUAGE = 501; + LARGE_P = 502; + LAST_P = 503; + LATERAL_P = 504; + LEADING = 505; + LEAKPROOF = 506; + LEAST = 507; + LEFT = 508; + LEVEL = 509; + LIKE = 510; + LIMIT = 511; + LISTEN = 512; + LOAD = 513; + LOCAL = 514; + LOCALTIME = 515; + LOCALTIMESTAMP = 516; + LOCATION = 517; + LOCK_P = 518; + LOCKED = 519; + LOGGED = 520; + MAPPING = 521; + MATCH = 522; + MATCHED = 523; + MATERIALIZED = 524; + MAXVALUE = 525; + MERGE = 526; + MERGE_ACTION = 527; + METHOD = 528; + MINUTE_P = 529; + MINVALUE = 530; + MODE = 531; + MONTH_P = 532; + MOVE = 533; + NAME_P = 534; + NAMES = 535; + NATIONAL = 536; + NATURAL = 537; + NCHAR = 538; + NESTED = 539; + NEW = 540; + NEXT = 541; + NFC = 542; + NFD = 543; + NFKC = 544; + NFKD = 545; + NO = 546; + NONE = 547; + NORMALIZE = 548; + NORMALIZED = 549; + NOT = 550; + NOTHING = 551; + NOTIFY = 552; + NOTNULL = 553; + NOWAIT = 554; + NULL_P = 555; + NULLIF = 556; + NULLS_P = 557; + NUMERIC = 558; + OBJECT_P = 559; + OBJECTS_P = 560; + OF = 561; + OFF = 562; + OFFSET = 563; + OIDS = 564; + OLD = 565; + OMIT = 566; + ON = 567; + ONLY = 568; + OPERATOR = 569; + OPTION = 570; + OPTIONS = 571; + OR = 572; + ORDER = 573; + ORDINALITY = 574; + OTHERS = 575; + OUT_P = 576; + OUTER_P = 577; + OVER = 578; + OVERLAPS = 579; + OVERLAY = 580; + OVERRIDING = 581; + OWNED = 582; + OWNER = 583; + PARALLEL = 584; + PARAMETER = 585; + PARSER = 586; + PARTIAL = 587; + PARTITION = 588; + PASSING = 589; + PASSWORD = 590; + PATH = 591; + PERIOD = 592; + PLACING = 593; + PLAN = 594; + PLANS = 595; + POLICY = 596; + POSITION = 597; + PRECEDING = 598; + PRECISION = 599; + PRESERVE = 600; + PREPARE = 601; + PREPARED = 602; + PRIMARY = 603; + PRIOR = 604; + PRIVILEGES = 605; + PROCEDURAL = 606; + PROCEDURE = 607; + PROCEDURES = 608; + PROGRAM = 609; + PUBLICATION = 610; + QUOTE = 611; + QUOTES = 612; + RANGE = 613; + READ = 614; + REAL = 615; + REASSIGN = 616; + RECURSIVE = 617; + REF_P = 618; + REFERENCES = 619; + REFERENCING = 620; + REFRESH = 621; + REINDEX = 622; + RELATIVE_P = 623; + RELEASE = 624; + RENAME = 625; + REPEATABLE = 626; + REPLACE = 627; + REPLICA = 628; + RESET = 629; + RESTART = 630; + RESTRICT = 631; + RETURN = 632; + RETURNING = 633; + RETURNS = 634; + REVOKE = 635; + RIGHT = 636; + ROLE = 637; + ROLLBACK = 638; + ROLLUP = 639; + ROUTINE = 640; + ROUTINES = 641; + ROW = 642; + ROWS = 643; + RULE = 644; + SAVEPOINT = 645; + SCALAR = 646; + SCHEMA = 647; + SCHEMAS = 648; + SCROLL = 649; + SEARCH = 650; + SECOND_P = 651; + SECURITY = 652; + SELECT = 653; + SEQUENCE = 654; + SEQUENCES = 655; + SERIALIZABLE = 656; + SERVER = 657; + SESSION = 658; + SESSION_USER = 659; + SET = 660; + SETS = 661; + SETOF = 662; + SHARE = 663; + SHOW = 664; + SIMILAR = 665; + SIMPLE = 666; + SKIP = 667; + SMALLINT = 668; + SNAPSHOT = 669; + SOME = 670; + SOURCE = 671; + SQL_P = 672; + STABLE = 673; + STANDALONE_P = 674; + START = 675; + STATEMENT = 676; + STATISTICS = 677; + STDIN = 678; + STDOUT = 679; + STORAGE = 680; + STORED = 681; + STRICT_P = 682; + STRING_P = 683; + STRIP_P = 684; + SUBSCRIPTION = 685; + SUBSTRING = 686; + SUPPORT = 687; + SYMMETRIC = 688; + SYSID = 689; + SYSTEM_P = 690; + SYSTEM_USER = 691; + TABLE = 692; + TABLES = 693; + TABLESAMPLE = 694; + TABLESPACE = 695; + TARGET = 696; + TEMP = 697; + TEMPLATE = 698; + TEMPORARY = 699; + TEXT_P = 700; + THEN = 701; + TIES = 702; + TIME = 703; + TIMESTAMP = 704; + TO = 705; + TRAILING = 706; + TRANSACTION = 707; + TRANSFORM = 708; + TREAT = 709; + TRIGGER = 710; + TRIM = 711; + TRUE_P = 712; + TRUNCATE = 713; + TRUSTED = 714; + TYPE_P = 715; + TYPES_P = 716; + UESCAPE = 717; + UNBOUNDED = 718; + UNCONDITIONAL = 719; + UNCOMMITTED = 720; + UNENCRYPTED = 721; + UNION = 722; + UNIQUE = 723; + UNKNOWN = 724; + UNLISTEN = 725; + UNLOGGED = 726; + UNTIL = 727; + UPDATE = 728; + USER = 729; + USING = 730; + VACUUM = 731; + VALID = 732; + VALIDATE = 733; + VALIDATOR = 734; + VALUE_P = 735; + VALUES = 736; + VARCHAR = 737; + VARIADIC = 738; + VARYING = 739; + VERBOSE = 740; + VERSION_P = 741; + VIEW = 742; + VIEWS = 743; + VIRTUAL = 744; + VOLATILE = 745; + WHEN = 746; + WHERE = 747; + WHITESPACE_P = 748; + WINDOW = 749; + WITH = 750; + WITHIN = 751; + WITHOUT = 752; + WORK = 753; + WRAPPER = 754; + WRITE = 755; + XML_P = 756; + XMLATTRIBUTES = 757; + XMLCONCAT = 758; + XMLELEMENT = 759; + XMLEXISTS = 760; + XMLFOREST = 761; + XMLNAMESPACES = 762; + XMLPARSE = 763; + XMLPI = 764; + XMLROOT = 765; + XMLSERIALIZE = 766; + XMLTABLE = 767; + YEAR_P = 768; + YES_P = 769; + ZONE = 770; + FORMAT_LA = 771; + NOT_LA = 772; + NULLS_LA = 773; + WITH_LA = 774; + WITHOUT_LA = 775; + MODE_TYPE_NAME = 776; + MODE_PLPGSQL_EXPR = 777; + MODE_PLPGSQL_ASSIGN1 = 778; + MODE_PLPGSQL_ASSIGN2 = 779; + MODE_PLPGSQL_ASSIGN3 = 780; + UMINUS = 781; +} + + +// protobuf-c doesn't support optional fields, so any optional strings +// are just an empty string if it should be the equivalent of None/nil. +// +// These fields have `// optional` at the end of the line. +// +// Upstream issue: https://github.com/protobuf-c/protobuf-c/issues/476 +message SummaryResult { + enum Context { + None = 0; + Select = 1; + DML = 2; + DDL = 3; + Call = 4; + } + + message Table { + string name = 1; + string schema_name = 2; + string table_name = 3; + Context context = 4; + } + repeated Table tables = 1; + + // The value here is the table name (i.e. schema.table or just table). + map aliases = 2; + + repeated string cte_names = 3; + + message Function { + string name = 1; + string function_name = 2; + string schema_name = 3; // optional + Context context = 4; + } + repeated Function functions = 4; + + message FilterColumn { + string schema_name = 1; // optional + string table_name = 2; // optional + string column = 3; + } + repeated FilterColumn filter_columns = 5; + repeated string statement_types = 6; + string truncated_query = 7; /* optional, empty if truncation limit is -1 */ +} diff --git a/scripts/fetch-protos.js b/scripts/fetch-protos.js index caf3fb1b..148bedef 100644 --- a/scripts/fetch-protos.js +++ b/scripts/fetch-protos.js @@ -9,7 +9,7 @@ function getVersionMappings() { const versionsDir = path.join(__dirname, '..', 'versions'); const mappings = []; - for (const version of ['13', '14', '15', '16', '17']) { + for (const version of ['13', '14', '15', '16', '17', '18']) { const packagePath = path.join(versionsDir, version, 'package.json'); if (fs.existsSync(packagePath)) { const pkg = JSON.parse(fs.readFileSync(packagePath, 'utf8')); @@ -70,7 +70,9 @@ async function fetchProtos() { } // Use the libpgQueryTag from the Makefile - const url = `https://raw.githubusercontent.com/pganalyze/libpg_query/refs/tags/${libpgQueryTag}/protobuf/pg_query.proto`; + // For dev branches (containing 'dev'), use refs/heads/, otherwise use refs/tags/ + const refType = libpgQueryTag.includes('dev') ? 'heads' : 'tags'; + const url = `https://raw.githubusercontent.com/pganalyze/libpg_query/refs/${refType}/${libpgQueryTag}/protobuf/pg_query.proto`; const destPath = path.join(versionDir, 'pg_query.proto'); console.log(`Fetching protobuf for PostgreSQL ${pgVersion} with tag ${libpgQueryTag}...`); @@ -93,4 +95,4 @@ if (require.main === module) { fetchProtos().catch(console.error); } -module.exports = { fetchProtos, getVersionMappings }; \ No newline at end of file +module.exports = { fetchProtos, getVersionMappings }; diff --git a/versions/18/LICENSE b/versions/18/LICENSE new file mode 100644 index 00000000..48cff16c --- /dev/null +++ b/versions/18/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2021 Dan Lynch +Copyright (c) 2025 Constructive + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/versions/18/Makefile b/versions/18/Makefile new file mode 100644 index 00000000..384c0054 --- /dev/null +++ b/versions/18/Makefile @@ -0,0 +1,99 @@ +# DO NOT MODIFY MANUALLY — this is generated from the templates dir +# +# To make changes, edit the files in the templates/ directory and run: +# npm run copy:templates + +WASM_OUT_DIR := wasm +WASM_OUT_NAME := libpg-query +WASM_MODULE_NAME := PgQueryModule +LIBPG_QUERY_REPO := https://github.com/pganalyze/libpg_query.git +LIBPG_QUERY_TAG := 18-latest-dev + +CACHE_DIR := .cache + +OS ?= $(shell uname -s) +ARCH ?= $(shell uname -m) + +ifdef EMSCRIPTEN +PLATFORM := emscripten +else ifeq ($(OS),Darwin) +PLATFORM := darwin +else ifeq ($(OS),Linux) +PLATFORM := linux +else +$(error Unsupported platform: $(OS)) +endif + +ifdef EMSCRIPTEN +ARCH := wasm +endif + +PLATFORM_ARCH := $(PLATFORM)-$(ARCH) +SRC_FILES := src/wasm_wrapper.c +LIBPG_QUERY_DIR := $(CACHE_DIR)/$(PLATFORM_ARCH)/libpg_query/$(LIBPG_QUERY_TAG) +LIBPG_QUERY_ARCHIVE := $(LIBPG_QUERY_DIR)/libpg_query.a +LIBPG_QUERY_HEADER := $(LIBPG_QUERY_DIR)/pg_query.h +CXXFLAGS := -O3 -flto + +ifdef EMSCRIPTEN +OUT_FILES := $(foreach EXT,.js .wasm,$(WASM_OUT_DIR)/$(WASM_OUT_NAME)$(EXT)) +else +$(error Native builds are no longer supported. Use EMSCRIPTEN=1 for WASM builds only.) +endif + +# Clone libpg_query source (lives in CACHE_DIR) +$(LIBPG_QUERY_DIR): + mkdir -p $(CACHE_DIR) + git clone -b $(LIBPG_QUERY_TAG) --single-branch $(LIBPG_QUERY_REPO) $(LIBPG_QUERY_DIR) + +$(LIBPG_QUERY_HEADER): $(LIBPG_QUERY_DIR) + +# Build libpg_query +$(LIBPG_QUERY_ARCHIVE): $(LIBPG_QUERY_DIR) + cd $(LIBPG_QUERY_DIR); $(MAKE) build + +# Build libpg-query-node WASM module +$(OUT_FILES): $(LIBPG_QUERY_ARCHIVE) $(LIBPG_QUERY_HEADER) $(SRC_FILES) +ifdef EMSCRIPTEN + mkdir -p $(WASM_OUT_DIR) + $(CC) \ + -v \ + $(CXXFLAGS) \ + -I$(LIBPG_QUERY_DIR) \ + -I$(LIBPG_QUERY_DIR)/vendor \ + -L$(LIBPG_QUERY_DIR) \ + -sEXPORTED_FUNCTIONS="['_malloc','_free','_wasm_parse_query_raw','_wasm_free_parse_result']" \ + -sEXPORTED_RUNTIME_METHODS="['lengthBytesUTF8','stringToUTF8','getValue','UTF8ToString','HEAPU8','HEAPU32']" \ + -sEXPORT_NAME="$(WASM_MODULE_NAME)" \ + -sENVIRONMENT="web,node,worker" \ + -sASSERTIONS=0 \ + -sSINGLE_FILE=0 \ + -sMODULARIZE=1 \ + -sEXPORT_ES6=0 \ + -sALLOW_MEMORY_GROWTH=1 \ + -sINITIAL_MEMORY=134217728 \ + -sMAXIMUM_MEMORY=1073741824 \ + -sSTACK_SIZE=33554432 \ + -lpg_query \ + -o $@ \ + $(SRC_FILES) +else +$(error Native builds are no longer supported. Use EMSCRIPTEN=1 for WASM builds only.) +endif + +# Commands +build: $(OUT_FILES) + +build-cache: $(LIBPG_QUERY_ARCHIVE) $(LIBPG_QUERY_HEADER) + +rebuild: clean build + +rebuild-cache: clean-cache build-cache + +clean: + -@ rm -r $(OUT_FILES) > /dev/null 2>&1 + +clean-cache: + -@ rm -rf $(LIBPG_QUERY_DIR) + +.PHONY: build build-cache rebuild rebuild-cache clean clean-cache diff --git a/versions/18/package.json b/versions/18/package.json new file mode 100644 index 00000000..c0a34c95 --- /dev/null +++ b/versions/18/package.json @@ -0,0 +1,52 @@ +{ + "name": "@libpg-query/v18", + "version": "18.0.0-dev.0", + "description": "The real PostgreSQL query parser (PG 18 dev)", + "homepage": "https://github.com/constructive-io/libpg-query-node", + "main": "./wasm/index.cjs", + "module": "./wasm/index.js", + "typings": "./wasm/index.d.ts", + "publishConfig": { + "access": "public" + }, + "x-publish": { + "publishName": "libpg-query", + "pgVersion": "18", + "distTag": "pg18-dev", + "libpgQueryTag": "18-latest-dev" + }, + "files": [ + "wasm/*" + ], + "scripts": { + "clean": "pnpm wasm:clean && rimraf wasm/*.js wasm/*.cjs wasm/*.d.ts", + "build:js": "node scripts/build.js", + "build": "pnpm clean && pnpm wasm:build && pnpm build:js", + "publish:pkg": "node ../../scripts/publish-single-version.js", + "wasm:make": "docker run --rm -v $(pwd):/src -u $(id -u):$(id -g) emscripten/emsdk emmake make", + "wasm:build": "pnpm wasm:make build", + "wasm:rebuild": "pnpm wasm:make rebuild", + "wasm:clean": "pnpm wasm:make clean", + "wasm:clean-cache": "pnpm wasm:make clean-cache", + "test": "node --test test/parsing.test.js test/errors.test.js" + }, + "author": "Constructive ", + "license": "MIT", + "repository": { + "type": "git", + "url": "git://github.com/constructive-io/libpg-query-node.git" + }, + "devDependencies": {}, + "dependencies": { + "@pgsql/types": "^17.6.2" + }, + "keywords": [ + "sql", + "postgres", + "postgresql", + "pg", + "query", + "plpgsql", + "database" + ] +} diff --git a/versions/18/scripts/build.js b/versions/18/scripts/build.js new file mode 100644 index 00000000..48c95b8a --- /dev/null +++ b/versions/18/scripts/build.js @@ -0,0 +1,39 @@ +const fs = require('fs'); +const path = require('path'); +const { execSync } = require('child_process'); + +// Run TypeScript compilation +console.log('Compiling TypeScript...'); +const tscPath = path.join(__dirname, '../../../node_modules/.bin/tsc'); +execSync(`${tscPath}`, { stdio: 'inherit', cwd: path.join(__dirname, '..') }); +execSync(`${tscPath} -p tsconfig.esm.json`, { stdio: 'inherit', cwd: path.join(__dirname, '..') }); + +// Rename files to have correct extensions +const wasmDir = path.join(__dirname, '../wasm'); +const cjsDir = path.join(__dirname, '../cjs'); +const esmDir = path.join(__dirname, '../esm'); + +// Ensure wasm directory exists +if (!fs.existsSync(wasmDir)) { + fs.mkdirSync(wasmDir, { recursive: true }); +} + +// Rename CommonJS files +fs.renameSync( + path.join(cjsDir, 'index.js'), + path.join(wasmDir, 'index.cjs') +); + +// Rename ESM files +fs.renameSync( + path.join(esmDir, 'index.js'), + path.join(wasmDir, 'index.js') +); + +// Rename declaration files +fs.renameSync( + path.join(cjsDir, 'index.d.ts'), + path.join(wasmDir, 'index.d.ts') +); + +console.log('Build completed successfully!'); \ No newline at end of file diff --git a/versions/18/src/index.ts b/versions/18/src/index.ts new file mode 100644 index 00000000..27eeb49f --- /dev/null +++ b/versions/18/src/index.ts @@ -0,0 +1,315 @@ +/** + * DO NOT MODIFY MANUALLY — this is generated from the templates dir + * + * To make changes, edit the files in the templates/ directory and run: + * npm run copy:templates + */ + +export * from "@pgsql/types"; + +// @ts-ignore +import PgQueryModule from './libpg-query.js'; + +let wasmModule: any; + +// SQL error details interface +export interface SqlErrorDetails { + message: string; + cursorPosition: number; // 0-based position in the query + fileName?: string; // Source file where error occurred (e.g., 'scan.l', 'gram.y') + functionName?: string; // Internal function name + lineNumber?: number; // Line number in source file + context?: string; // Additional context +} + +// Options for formatting SQL errors +export interface SqlErrorFormatOptions { + showPosition?: boolean; // Show the error position marker (default: true) + showQuery?: boolean; // Show the query text (default: true) + color?: boolean; // Use ANSI colors (default: false) + maxQueryLength?: number; // Max query length to display (default: no limit) +} + +export class SqlError extends Error { + sqlDetails?: SqlErrorDetails; + + constructor(message: string, details?: SqlErrorDetails) { + super(message); + this.name = 'SqlError'; + this.sqlDetails = details; + } +} + + + +// Helper function to classify error source +function getErrorSource(filename: string | null): string { + if (!filename) return 'unknown'; + if (filename === 'scan.l') return 'lexer'; // Lexical analysis errors + if (filename === 'gram.y') return 'parser'; // Grammar/parsing errors + return filename; +} + +// Format SQL error with visual position indicator +export function formatSqlError( + error: Error & { sqlDetails?: SqlErrorDetails }, + query: string, + options: SqlErrorFormatOptions = {} +): string { + const { + showPosition = true, + showQuery = true, + color = false, + maxQueryLength + } = options; + + const lines: string[] = []; + + // ANSI color codes + const red = color ? '\x1b[31m' : ''; + const yellow = color ? '\x1b[33m' : ''; + const reset = color ? '\x1b[0m' : ''; + + // Add error message + lines.push(`${red}Error: ${error.message}${reset}`); + + // Add SQL details if available + if (error.sqlDetails) { + const { cursorPosition, fileName, functionName, lineNumber } = error.sqlDetails; + + if (cursorPosition !== undefined && cursorPosition >= 0) { + lines.push(`Position: ${cursorPosition}`); + } + + if (fileName || functionName || lineNumber) { + const details = []; + if (fileName) details.push(`file: ${fileName}`); + if (functionName) details.push(`function: ${functionName}`); + if (lineNumber) details.push(`line: ${lineNumber}`); + lines.push(`Source: ${details.join(', ')}`); + } + + // Show query with position marker + if (showQuery && showPosition && cursorPosition !== undefined && cursorPosition >= 0) { + let displayQuery = query; + + // Truncate if needed + if (maxQueryLength && query.length > maxQueryLength) { + const start = Math.max(0, cursorPosition - Math.floor(maxQueryLength / 2)); + const end = Math.min(query.length, start + maxQueryLength); + displayQuery = (start > 0 ? '...' : '') + + query.substring(start, end) + + (end < query.length ? '...' : ''); + // Adjust cursor position for truncation + const adjustedPosition = cursorPosition - start + (start > 0 ? 3 : 0); + lines.push(displayQuery); + lines.push(' '.repeat(adjustedPosition) + `${yellow}^${reset}`); + } else { + lines.push(displayQuery); + lines.push(' '.repeat(cursorPosition) + `${yellow}^${reset}`); + } + } + } else if (showQuery) { + // No SQL details, just show the query if requested + let displayQuery = query; + if (maxQueryLength && query.length > maxQueryLength) { + displayQuery = query.substring(0, maxQueryLength) + '...'; + } + lines.push(`Query: ${displayQuery}`); + } + + return lines.join('\n'); +} + +// Check if an error has SQL details +export function hasSqlDetails(error: any): error is Error & { sqlDetails: SqlErrorDetails } { + return error instanceof Error && + 'sqlDetails' in error && + typeof (error as any).sqlDetails === 'object' && + (error as any).sqlDetails !== null && + 'message' in (error as any).sqlDetails && + 'cursorPosition' in (error as any).sqlDetails; +} + +const initPromise = PgQueryModule().then((module: any) => { + wasmModule = module; +}); + +function ensureLoaded() { + if (!wasmModule) throw new Error("WASM module not initialized. Call `loadModule()` first."); +} + +export async function loadModule() { + if (!wasmModule) { + await initPromise; + } +} + +function awaitInit any>(fn: T): T { + return (async (...args: Parameters) => { + await initPromise; + return fn(...args); + }) as T; +} + +function stringToPtr(str: string): number { + ensureLoaded(); + if (typeof str !== 'string') { + throw new TypeError(`Expected a string, got ${typeof str}`); + } + const len = wasmModule.lengthBytesUTF8(str) + 1; + const ptr = wasmModule._malloc(len); + try { + wasmModule.stringToUTF8(str, ptr, len); + return ptr; + } catch (error) { + wasmModule._free(ptr); + throw error; + } +} + +function ptrToString(ptr: number): string { + ensureLoaded(); + if (typeof ptr !== 'number') { + throw new TypeError(`Expected a number, got ${typeof ptr}`); + } + return wasmModule.UTF8ToString(ptr); +} + +export const parse = awaitInit(async (query: string) => { + // Pre-validation + if (query === null || query === undefined) { + throw new Error('Query cannot be null or undefined'); + } + if (typeof query !== 'string') { + throw new Error(`Query must be a string, got ${typeof query}`); + } + if (query.trim() === '') { + throw new Error('Query cannot be empty'); + } + + const queryPtr = stringToPtr(query); + let resultPtr = 0; + + try { + // Call the raw function that returns a struct pointer + resultPtr = wasmModule._wasm_parse_query_raw(queryPtr); + if (!resultPtr) { + throw new Error('Failed to allocate memory for parse result'); + } + + // Read the PgQueryParseResult struct fields + // struct { char* parse_tree; char* stderr_buffer; PgQueryError* error; } + const parseTreePtr = wasmModule.getValue(resultPtr, 'i32'); // offset 0 + const stderrBufferPtr = wasmModule.getValue(resultPtr + 4, 'i32'); // offset 4 + const errorPtr = wasmModule.getValue(resultPtr + 8, 'i32'); // offset 8 + + // Check for error + if (errorPtr) { + // Read PgQueryError struct fields + // struct { char* message; char* funcname; char* filename; int lineno; int cursorpos; char* context; } + const messagePtr = wasmModule.getValue(errorPtr, 'i32'); // offset 0 + const funcnamePtr = wasmModule.getValue(errorPtr + 4, 'i32'); // offset 4 + const filenamePtr = wasmModule.getValue(errorPtr + 8, 'i32'); // offset 8 + const lineno = wasmModule.getValue(errorPtr + 12, 'i32'); // offset 12 + const cursorpos = wasmModule.getValue(errorPtr + 16, 'i32'); // offset 16 + const contextPtr = wasmModule.getValue(errorPtr + 20, 'i32'); // offset 20 + + const message = messagePtr ? wasmModule.UTF8ToString(messagePtr) : 'Unknown error'; + const filename = filenamePtr ? wasmModule.UTF8ToString(filenamePtr) : null; + + const errorDetails: SqlErrorDetails = { + message: message, + cursorPosition: cursorpos > 0 ? cursorpos - 1 : 0, // Convert to 0-based + fileName: filename || undefined, + functionName: funcnamePtr ? wasmModule.UTF8ToString(funcnamePtr) : undefined, + lineNumber: lineno > 0 ? lineno : undefined, + context: contextPtr ? wasmModule.UTF8ToString(contextPtr) : undefined + }; + + throw new SqlError(message, errorDetails); + } + + if (!parseTreePtr) { + throw new Error('Parse result is null'); + } + + const parseTree = wasmModule.UTF8ToString(parseTreePtr); + return JSON.parse(parseTree); + } + finally { + wasmModule._free(queryPtr); + if (resultPtr) { + wasmModule._wasm_free_parse_result(resultPtr); + } + } +}); + +export function parseSync(query: string) { + // Pre-validation + if (query === null || query === undefined) { + throw new Error('Query cannot be null or undefined'); + } + if (typeof query !== 'string') { + throw new Error(`Query must be a string, got ${typeof query}`); + } + if (query.trim() === '') { + throw new Error('Query cannot be empty'); + } + + const queryPtr = stringToPtr(query); + let resultPtr = 0; + + try { + // Call the raw function that returns a struct pointer + resultPtr = wasmModule._wasm_parse_query_raw(queryPtr); + if (!resultPtr) { + throw new Error('Failed to allocate memory for parse result'); + } + + // Read the PgQueryParseResult struct fields + // struct { char* parse_tree; char* stderr_buffer; PgQueryError* error; } + const parseTreePtr = wasmModule.getValue(resultPtr, 'i32'); // offset 0 + const stderrBufferPtr = wasmModule.getValue(resultPtr + 4, 'i32'); // offset 4 + const errorPtr = wasmModule.getValue(resultPtr + 8, 'i32'); // offset 8 + + // Check for error + if (errorPtr) { + // Read PgQueryError struct fields + // struct { char* message; char* funcname; char* filename; int lineno; int cursorpos; char* context; } + const messagePtr = wasmModule.getValue(errorPtr, 'i32'); // offset 0 + const funcnamePtr = wasmModule.getValue(errorPtr + 4, 'i32'); // offset 4 + const filenamePtr = wasmModule.getValue(errorPtr + 8, 'i32'); // offset 8 + const lineno = wasmModule.getValue(errorPtr + 12, 'i32'); // offset 12 + const cursorpos = wasmModule.getValue(errorPtr + 16, 'i32'); // offset 16 + const contextPtr = wasmModule.getValue(errorPtr + 20, 'i32'); // offset 20 + + const message = messagePtr ? wasmModule.UTF8ToString(messagePtr) : 'Unknown error'; + const filename = filenamePtr ? wasmModule.UTF8ToString(filenamePtr) : null; + + const errorDetails: SqlErrorDetails = { + message: message, + cursorPosition: cursorpos > 0 ? cursorpos - 1 : 0, // Convert to 0-based + fileName: filename || undefined, + functionName: funcnamePtr ? wasmModule.UTF8ToString(funcnamePtr) : undefined, + lineNumber: lineno > 0 ? lineno : undefined, + context: contextPtr ? wasmModule.UTF8ToString(contextPtr) : undefined + }; + + throw new SqlError(message, errorDetails); + } + + if (!parseTreePtr) { + throw new Error('Parse result is null'); + } + + const parseTree = wasmModule.UTF8ToString(parseTreePtr); + return JSON.parse(parseTree); + } + finally { + wasmModule._free(queryPtr); + if (resultPtr) { + wasmModule._wasm_free_parse_result(resultPtr); + } + } +} \ No newline at end of file diff --git a/versions/18/src/libpg-query.d.ts b/versions/18/src/libpg-query.d.ts new file mode 100644 index 00000000..2098ee1c --- /dev/null +++ b/versions/18/src/libpg-query.d.ts @@ -0,0 +1,22 @@ +/** + * DO NOT MODIFY MANUALLY — this is generated from the templates dir + * + * To make changes, edit the files in the templates/ directory and run: + * npm run copy:templates + */ + +declare module './libpg-query.js' { + interface WasmModule { + _malloc: (size: number) => number; + _free: (ptr: number) => void; + _wasm_free_string: (ptr: number) => void; + _wasm_parse_query: (queryPtr: number) => number; + lengthBytesUTF8: (str: string) => number; + stringToUTF8: (str: string, ptr: number, len: number) => void; + UTF8ToString: (ptr: number) => string; + HEAPU8: Uint8Array; + } + + const PgQueryModule: () => Promise; + export default PgQueryModule; +} \ No newline at end of file diff --git a/versions/18/src/wasm_wrapper.c b/versions/18/src/wasm_wrapper.c new file mode 100644 index 00000000..38151683 --- /dev/null +++ b/versions/18/src/wasm_wrapper.c @@ -0,0 +1,47 @@ +/** + * DO NOT MODIFY MANUALLY — this is generated from the templates dir + * + * To make changes, edit the files in the templates/ directory and run: + * npm run copy:templates + */ + +#include +#include +#include +#include + +static int validate_input(const char* input) { + return input != NULL && strlen(input) > 0; +} + +static void* safe_malloc(size_t size) { + void* ptr = malloc(size); + if (!ptr && size > 0) { + return NULL; + } + return ptr; +} + +// Raw struct access functions for parse +EMSCRIPTEN_KEEPALIVE +PgQueryParseResult* wasm_parse_query_raw(const char* input) { + if (!validate_input(input)) { + return NULL; + } + + PgQueryParseResult* result = (PgQueryParseResult*)safe_malloc(sizeof(PgQueryParseResult)); + if (!result) { + return NULL; + } + + *result = pg_query_parse(input); + return result; +} + +EMSCRIPTEN_KEEPALIVE +void wasm_free_parse_result(PgQueryParseResult* result) { + if (result) { + pg_query_free_parse_result(*result); + free(result); + } +} \ No newline at end of file diff --git a/versions/18/test/errors.test.js b/versions/18/test/errors.test.js new file mode 100644 index 00000000..f6c0fd61 --- /dev/null +++ b/versions/18/test/errors.test.js @@ -0,0 +1,325 @@ +const { describe, it, before } = require('node:test'); +const assert = require('node:assert/strict'); +const { parseSync, loadModule, formatSqlError, hasSqlDetails } = require('../wasm/index.cjs'); + +describe('Enhanced Error Handling', () => { + before(async () => { + await loadModule(); + }); + + describe('Error Details Structure', () => { + it('should include sqlDetails property on parse errors', () => { + assert.throws(() => { + parseSync('SELECT * FROM users WHERE id = @'); + }); + + try { + parseSync('SELECT * FROM users WHERE id = @'); + } catch (error) { + assert.ok('sqlDetails' in error); + assert.ok('message' in error.sqlDetails); + assert.ok('cursorPosition' in error.sqlDetails); + assert.ok('fileName' in error.sqlDetails); + assert.ok('functionName' in error.sqlDetails); + assert.ok('lineNumber' in error.sqlDetails); + } + }); + + it('should have correct cursor position (0-based)', () => { + try { + parseSync('SELECT * FROM users WHERE id = @'); + assert.fail('Expected error'); + } catch (error) { + assert.equal(error.sqlDetails.cursorPosition, 32); + } + }); + + it('should identify error source file', () => { + try { + parseSync('SELECT * FROM users WHERE id = @'); + assert.fail('Expected error'); + } catch (error) { + assert.equal(error.sqlDetails.fileName, 'scan.l'); + assert.equal(error.sqlDetails.functionName, 'scanner_yyerror'); + } + }); + }); + + describe('Error Position Accuracy', () => { + const positionTests = [ + { query: '@ SELECT * FROM users', expectedPos: 0, desc: 'error at start' }, + { query: 'SELECT @ FROM users', expectedPos: 9, desc: 'error after SELECT' }, + { query: 'SELECT * FROM users WHERE @ = 1', expectedPos: 28, desc: 'error after WHERE' }, + { query: 'SELECT * FROM users WHERE id = @', expectedPos: 32, desc: 'error at end' }, + { query: 'INSERT INTO users (id, name) VALUES (1, @)', expectedPos: 41, desc: 'error in VALUES' }, + { query: 'UPDATE users SET name = @ WHERE id = 1', expectedPos: 26, desc: 'error in SET' }, + { query: 'CREATE TABLE test (id INT, name @)', expectedPos: 32, desc: 'error in CREATE TABLE' }, + ]; + + positionTests.forEach(({ query, expectedPos, desc }) => { + it(`should correctly identify position for ${desc}`, () => { + try { + parseSync(query); + assert.fail('Expected error'); + } catch (error) { + assert.equal(error.sqlDetails.cursorPosition, expectedPos); + } + }); + }); + }); + + describe('Error Types', () => { + it('should handle unterminated string literals', () => { + try { + parseSync("SELECT * FROM users WHERE name = 'unclosed"); + assert.fail('Expected error'); + } catch (error) { + assert.ok(error.message.includes('unterminated quoted string')); + assert.equal(error.sqlDetails.cursorPosition, 33); + } + }); + + it('should handle unterminated quoted identifiers', () => { + try { + parseSync('SELECT * FROM users WHERE name = "unclosed'); + assert.fail('Expected error'); + } catch (error) { + assert.ok(error.message.includes('unterminated quoted identifier')); + assert.equal(error.sqlDetails.cursorPosition, 33); + } + }); + + it('should handle invalid tokens', () => { + try { + parseSync('SELECT * FROM users WHERE id = $'); + assert.fail('Expected error'); + } catch (error) { + assert.ok(error.message.includes('syntax error at or near "$"')); + assert.equal(error.sqlDetails.cursorPosition, 31); + } + }); + + it('should handle reserved keywords', () => { + try { + parseSync('SELECT * FROM table'); + assert.fail('Expected error'); + } catch (error) { + assert.ok(error.message.includes('syntax error at or near "table"')); + assert.equal(error.sqlDetails.cursorPosition, 14); + } + }); + + it('should handle syntax error in WHERE clause', () => { + try { + parseSync('SELECT * FROM users WHERE'); + assert.fail('Expected error'); + } catch (error) { + assert.ok(error.message.includes('syntax error at end of input')); + assert.equal(error.sqlDetails.cursorPosition, 25); + } + }); + }); + + describe('formatSqlError Helper', () => { + it('should format error with position indicator', () => { + try { + parseSync("SELECT * FROM users WHERE id = 'unclosed"); + assert.fail('Expected error'); + } catch (error) { + const formatted = formatSqlError(error, "SELECT * FROM users WHERE id = 'unclosed"); + assert.ok(formatted.includes('Error: unterminated quoted string')); + assert.ok(formatted.includes('Position: 31')); + assert.ok(formatted.includes("SELECT * FROM users WHERE id = 'unclosed")); + assert.ok(formatted.includes(' ^')); + } + }); + + it('should respect showPosition option', () => { + try { + parseSync('SELECT * FROM users WHERE id = @'); + assert.fail('Expected error'); + } catch (error) { + const formatted = formatSqlError(error, 'SELECT * FROM users WHERE id = @', { + showPosition: false + }); + assert.ok(!formatted.includes('^')); + assert.ok(formatted.includes('Position: 32')); + } + }); + + it('should respect showQuery option', () => { + try { + parseSync('SELECT * FROM users WHERE id = @'); + assert.fail('Expected error'); + } catch (error) { + const formatted = formatSqlError(error, 'SELECT * FROM users WHERE id = @', { + showQuery: false + }); + assert.ok(!formatted.includes('SELECT * FROM users')); + assert.ok(formatted.includes('Error:')); + assert.ok(formatted.includes('Position:')); + } + }); + + it('should truncate long queries', () => { + const longQuery = 'SELECT ' + 'a, '.repeat(50) + 'z FROM users WHERE id = @'; + try { + parseSync(longQuery); + assert.fail('Expected error'); + } catch (error) { + const formatted = formatSqlError(error, longQuery, { maxQueryLength: 50 }); + assert.ok(formatted.includes('...')); + const lines = formatted.split('\n'); + const queryLine = lines.find(line => line.includes('...')); + assert.ok(queryLine.length <= 56); // 50 + 2*3 for ellipsis + } + }); + + it('should handle color option without breaking output', () => { + try { + parseSync('SELECT * FROM users WHERE id = @'); + assert.fail('Expected error'); + } catch (error) { + const formatted = formatSqlError(error, 'SELECT * FROM users WHERE id = @', { + color: true + }); + assert.ok(formatted.includes('Error:')); + assert.ok(formatted.includes('Position:')); + // Should contain ANSI codes but still be readable + const cleanFormatted = formatted.replace(/\x1b\[[0-9;]*m/g, ''); + assert.ok(cleanFormatted.includes('syntax error')); + } + }); + }); + + describe('hasSqlDetails Type Guard', () => { + it('should return true for SQL parse errors', () => { + try { + parseSync('SELECT * FROM users WHERE id = @'); + assert.fail('Expected error'); + } catch (error) { + assert.equal(hasSqlDetails(error), true); + } + }); + + it('should return false for regular errors', () => { + const regularError = new Error('Regular error'); + assert.equal(hasSqlDetails(regularError), false); + }); + + it('should return false for non-Error objects', () => { + assert.equal(hasSqlDetails('string'), false); + assert.equal(hasSqlDetails(123), false); + assert.equal(hasSqlDetails(null), false); + assert.equal(hasSqlDetails(undefined), false); + assert.equal(hasSqlDetails({}), false); + }); + + it('should return false for Error with incomplete sqlDetails', () => { + const error = new Error('Test'); + error.sqlDetails = { message: 'test' }; // Missing cursorPosition + assert.equal(hasSqlDetails(error), false); + }); + }); + + describe('Edge Cases', () => { + it('should handle empty query', () => { + assert.throws(() => parseSync(''), { + message: 'Query cannot be empty' + }); + }); + + it('should handle null query', () => { + assert.throws(() => parseSync(null), { + message: 'Query cannot be null or undefined' + }); + }); + + it('should handle undefined query', () => { + assert.throws(() => parseSync(undefined), { + message: 'Query cannot be null or undefined' + }); + }); + + it('should handle @ in comments', () => { + const query = 'SELECT * FROM users /* @ in comment */ WHERE id = 1'; + assert.doesNotThrow(() => parseSync(query)); + }); + + it('should handle @ in strings', () => { + const query = 'SELECT * FROM users WHERE email = \'user@example.com\''; + assert.doesNotThrow(() => parseSync(query)); + }); + }); + + describe('Complex Error Scenarios', () => { + it('should handle errors in CASE statements', () => { + try { + parseSync('SELECT CASE WHEN id = 1 THEN "one" WHEN id = 2 THEN @ ELSE "other" END FROM users'); + assert.fail('Expected error'); + } catch (error) { + assert.equal(error.sqlDetails.cursorPosition, 54); + } + }); + + it('should handle errors in subqueries', () => { + try { + parseSync('SELECT * FROM users WHERE id IN (SELECT @ FROM orders)'); + assert.fail('Expected error'); + } catch (error) { + assert.equal(error.sqlDetails.cursorPosition, 42); + } + }); + + it('should handle errors in function calls', () => { + try { + parseSync('SELECT COUNT(@) FROM users'); + assert.fail('Expected error'); + } catch (error) { + assert.equal(error.sqlDetails.cursorPosition, 14); + } + }); + + it('should handle errors in second statement', () => { + try { + parseSync('SELECT * FROM users; SELECT * FROM orders WHERE id = @'); + assert.fail('Expected error'); + } catch (error) { + assert.equal(error.sqlDetails.cursorPosition, 54); + } + }); + + it('should handle errors in CTE', () => { + try { + parseSync('WITH cte AS (SELECT * FROM users WHERE id = @) SELECT * FROM cte'); + assert.fail('Expected error'); + } catch (error) { + assert.equal(error.sqlDetails.cursorPosition, 45); + } + }); + }); + + describe('Backward Compatibility', () => { + it('should maintain Error instance', () => { + try { + parseSync('SELECT * FROM users WHERE id = @'); + assert.fail('Expected error'); + } catch (error) { + assert.ok(error instanceof Error); + assert.ok(error.message); + assert.ok(error.stack); + } + }); + + it('should work with standard error handling', () => { + let caught = false; + try { + parseSync('SELECT * FROM users WHERE id = @'); + } catch (e) { + caught = true; + assert.ok(e.message.includes('syntax error')); + } + assert.equal(caught, true); + }); + }); +}); \ No newline at end of file diff --git a/versions/18/test/parsing.test.js b/versions/18/test/parsing.test.js new file mode 100644 index 00000000..9315d7d4 --- /dev/null +++ b/versions/18/test/parsing.test.js @@ -0,0 +1,89 @@ +const { describe, it, before } = require('node:test'); +const assert = require('node:assert/strict'); +const query = require("../"); + +function removeLocationProperties(obj) { + if (typeof obj !== 'object' || obj === null) { + return obj; + } + + if (Array.isArray(obj)) { + return obj.map(item => removeLocationProperties(item)); + } + + const result = {}; + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + if (key === 'location' || key === 'stmt_len' || key === 'stmt_location') { + continue; // Skip location-related properties + } + result[key] = removeLocationProperties(obj[key]); + } + } + return result; +} + +describe("Query Parsing", () => { + before(async () => { + await query.parse("SELECT 1"); + }); + + describe("Sync Parsing", () => { + it("should return a single-item parse result for common queries", () => { + const queries = ["select 1", "select null", "select ''", "select a, b"]; + const results = queries.map(query.parseSync); + results.forEach((res) => { + assert.equal(res.stmts.length, 1); + }); + + const selectedDatas = results.map( + (it) => it.stmts[0].stmt.SelectStmt.targetList + ); + + assert.equal(selectedDatas[0][0].ResTarget.val.A_Const.ival.ival, 1); + assert.equal(selectedDatas[1][0].ResTarget.val.A_Const.isnull, true); + assert.equal(selectedDatas[2][0].ResTarget.val.A_Const.sval.sval, ""); + assert.equal(selectedDatas[3].length, 2); + }); + + it("should support parsing multiple queries", () => { + const res = query.parseSync("select 1; select null;"); + assert.deepEqual( + res.stmts.map(removeLocationProperties), + [ + ...query.parseSync("select 1;").stmts.map(removeLocationProperties), + ...query.parseSync("select null;").stmts.map(removeLocationProperties), + ] + ); + }); + + it("should not parse a bogus query", () => { + assert.throws( + () => query.parseSync("NOT A QUERY"), + Error + ); + }); + }); + + describe("Async parsing", () => { + it("should return a promise resolving to same result", async () => { + const testQuery = "select * from john;"; + const resPromise = query.parse(testQuery); + const res = await resPromise; + + assert.ok(resPromise instanceof Promise); + assert.deepEqual(res, query.parseSync(testQuery)); + }); + + it("should reject on bogus queries", async () => { + await assert.rejects( + query.parse("NOT A QUERY"), + (err) => { + assert.ok(err instanceof Error); + assert.match(err.message, /NOT/); + return true; + } + ); + }); + }); +}); diff --git a/versions/18/tsconfig.esm.json b/versions/18/tsconfig.esm.json new file mode 100644 index 00000000..63012c17 --- /dev/null +++ b/versions/18/tsconfig.esm.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "es2022", + "rootDir": "src/", + "declaration": false, + "outDir": "esm/" + } + } \ No newline at end of file diff --git a/versions/18/tsconfig.json b/versions/18/tsconfig.json new file mode 100644 index 00000000..d7da207b --- /dev/null +++ b/versions/18/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "es2022", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "strictNullChecks": false, + "skipLibCheck": true, + "sourceMap": false, + "declaration": true, + "resolveJsonModule": true, + "moduleResolution": "node", + "outDir": "cjs/", + "rootDir": "src" + }, + "exclude": ["cjs", "esm", "wasm", "node_modules", "**/*.test.ts"] +} \ No newline at end of file