rewrite.go 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277
  1. // Copyright 2017 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package astutils
  5. import (
  6. "fmt"
  7. "reflect"
  8. "github.com/kyleconroy/sqlc/internal/sql/ast"
  9. "github.com/kyleconroy/sqlc/internal/sql/ast/pg"
  10. )
  11. // An ApplyFunc is invoked by Apply for each node n, even if n is nil,
  12. // before and/or after the node's children, using a Cursor describing
  13. // the current node and providing operations on it.
  14. //
  15. // The return value of ApplyFunc controls the syntax tree traversal.
  16. // See Apply for details.
  17. type ApplyFunc func(*Cursor) bool
  18. // Apply traverses a syntax tree recursively, starting with root,
  19. // and calling pre and post for each node as described below.
  20. // Apply returns the syntax tree, possibly modified.
  21. //
  22. // If pre is not nil, it is called for each node before the node's
  23. // children are traversed (pre-order). If pre returns false, no
  24. // children are traversed, and post is not called for that node.
  25. //
  26. // If post is not nil, and a prior call of pre didn't return false,
  27. // post is called for each node after its children are traversed
  28. // (post-order). If post returns false, traversal is terminated and
  29. // Apply returns immediately.
  30. //
  31. // Only fields that refer to AST nodes are considered children;
  32. // i.e., token.Pos, Scopes, Objects, and fields of basic types
  33. // (strings, etc.) are ignored.
  34. //
  35. // Children are traversed in the order in which they appear in the
  36. // respective node's struct definition. A package's files are
  37. // traversed in the filenames' alphabetical order.
  38. //
  39. func Apply(root ast.Node, pre, post ApplyFunc) (result ast.Node) {
  40. parent := &struct{ ast.Node }{root}
  41. defer func() {
  42. if r := recover(); r != nil && r != abort {
  43. panic(r)
  44. }
  45. result = parent.Node
  46. }()
  47. a := &application{pre: pre, post: post}
  48. a.apply(parent, "Node", nil, root)
  49. return
  50. }
  51. var abort = new(int) // singleton, to signal termination of Apply
  52. // A Cursor describes a node encountered during Apply.
  53. // Information about the node and its parent is available
  54. // from the Node, Parent, Name, and Index methods.
  55. //
  56. // If p is a variable of type and value of the current parent node
  57. // c.Parent(), and f is the field identifier with name c.Name(),
  58. // the following invariants hold:
  59. //
  60. // p.f == c.Node() if c.Index() < 0
  61. // p.f[c.Index()] == c.Node() if c.Index() >= 0
  62. //
  63. // The methods Replace, Delete, InsertBefore, and InsertAfter
  64. // can be used to change the AST without disrupting Apply.
  65. type Cursor struct {
  66. parent ast.Node
  67. name string
  68. iter *iterator // valid if non-nil
  69. node ast.Node
  70. }
  71. // Node returns the current Node.
  72. func (c *Cursor) Node() ast.Node { return c.node }
  73. // Parent returns the parent of the current Node.
  74. func (c *Cursor) Parent() ast.Node { return c.parent }
  75. // Name returns the name of the parent Node field that contains the current Node.
  76. // If the parent is a *ast.Package and the current Node is a *ast.File, Name returns
  77. // the filename for the current Node.
  78. func (c *Cursor) Name() string { return c.name }
  79. // Index reports the index >= 0 of the current Node in the slice of Nodes that
  80. // contains it, or a value < 0 if the current Node is not part of a slice.
  81. // The index of the current node changes if InsertBefore is called while
  82. // processing the current node.
  83. func (c *Cursor) Index() int {
  84. if c.iter != nil {
  85. return c.iter.index
  86. }
  87. return -1
  88. }
  89. // field returns the current node's parent field value.
  90. func (c *Cursor) field() reflect.Value {
  91. return reflect.Indirect(reflect.ValueOf(c.parent)).FieldByName(c.name)
  92. }
  93. // Replace replaces the current Node with n.
  94. // The replacement node is not walked by Apply.
  95. func (c *Cursor) Replace(n ast.Node) {
  96. v := c.field()
  97. if i := c.Index(); i >= 0 {
  98. v = v.Index(i)
  99. }
  100. v.Set(reflect.ValueOf(n))
  101. }
  102. // D// application carries all the shared data so we can pass it around cheaply.
  103. type application struct {
  104. pre, post ApplyFunc
  105. cursor Cursor
  106. iter iterator
  107. }
  108. func (a *application) apply(parent ast.Node, name string, iter *iterator, n ast.Node) {
  109. // convert typed nil into untyped nil
  110. if v := reflect.ValueOf(n); v.Kind() == reflect.Ptr && v.IsNil() {
  111. n = nil
  112. }
  113. // avoid heap-allocating a new cursor for each apply call; reuse a.cursor instead
  114. saved := a.cursor
  115. a.cursor.parent = parent
  116. a.cursor.name = name
  117. a.cursor.iter = iter
  118. a.cursor.node = n
  119. if a.pre != nil && !a.pre(&a.cursor) {
  120. a.cursor = saved
  121. return
  122. }
  123. // walk children
  124. // (the order of the cases matches the order of the corresponding node types in go/ast)
  125. switch n := n.(type) {
  126. case nil:
  127. // nothing to do
  128. case *ast.AlterTableCmd:
  129. a.apply(n, "Def", nil, n.Def)
  130. case *ast.AlterTableSetSchemaStmt:
  131. a.apply(n, "Table", nil, n.Table)
  132. case *ast.AlterTableStmt:
  133. a.apply(n, "Table", nil, n.Table)
  134. a.apply(n, "Cmds", nil, n.Cmds)
  135. case *ast.AlterTypeAddValueStmt:
  136. a.apply(n, "Type", nil, n.Type)
  137. case *ast.AlterTypeRenameValueStmt:
  138. a.apply(n, "Type", nil, n.Type)
  139. case *ast.ColumnDef:
  140. a.apply(n, "TypeName", nil, n.TypeName)
  141. case *ast.ColumnRef:
  142. // pass
  143. case *ast.CommentOnColumnStmt:
  144. a.apply(n, "Table", nil, n.Table)
  145. a.apply(n, "Col", nil, n.Col)
  146. case *ast.CommentOnSchemaStmt:
  147. a.apply(n, "Schema", nil, n.Schema)
  148. case *ast.CommentOnTableStmt:
  149. a.apply(n, "Table", nil, n.Table)
  150. case *ast.CommentOnTypeStmt:
  151. a.apply(n, "Type", nil, n.Type)
  152. case *ast.CreateEnumStmt:
  153. a.apply(n, "TypeName", nil, n.TypeName)
  154. a.apply(n, "Vals", nil, n.Vals)
  155. case *ast.CreateFunctionStmt:
  156. a.apply(n, "ReturnType", nil, n.ReturnType)
  157. a.apply(n, "Func", nil, n.Func)
  158. case *ast.CreateSchemaStmt:
  159. // pass
  160. case *ast.CreateTableStmt:
  161. a.apply(n, "Name", nil, n.Name)
  162. case *ast.DropFunctionStmt:
  163. // pass
  164. case *ast.DropSchemaStmt:
  165. // pass
  166. case *ast.DropTableStmt:
  167. // pass
  168. case *ast.DropTypeStmt:
  169. // pass
  170. case *ast.FuncName:
  171. // pass
  172. case *ast.FuncParam:
  173. a.apply(n, "Type", nil, n.Type)
  174. a.apply(n, "DefExpr", nil, n.DefExpr)
  175. case *ast.FuncSpec:
  176. a.apply(n, "Name", nil, n.Name)
  177. case *ast.List:
  178. // Since item is a slice
  179. a.applyList(n, "Items")
  180. case *ast.RawStmt:
  181. a.apply(n, "Stmt", nil, n.Stmt)
  182. case *ast.RenameColumnStmt:
  183. a.apply(n, "Table", nil, n.Table)
  184. a.apply(n, "Col", nil, n.Col)
  185. case *ast.RenameTableStmt:
  186. a.apply(n, "Table", nil, n.Table)
  187. case *ast.ResTarget:
  188. a.apply(n, "Val", nil, n.Val)
  189. case *ast.SelectStmt:
  190. a.apply(n, "Fields", nil, n.Fields)
  191. a.apply(n, "From", nil, n.From)
  192. case *ast.Statement:
  193. a.apply(n, "Raw", nil, n.Raw)
  194. case *ast.String:
  195. // pass
  196. case *ast.TODO:
  197. // pass
  198. case *ast.TableName:
  199. // pass
  200. case *ast.TypeName:
  201. // pass
  202. case *pg.A_ArrayExpr:
  203. a.apply(n, "Elements", nil, n.Elements)
  204. case *pg.A_Const:
  205. a.apply(n, "Val", nil, n.Val)
  206. case *pg.A_Expr:
  207. a.apply(n, "Name", nil, n.Name)
  208. a.apply(n, "Lexpr", nil, n.Lexpr)
  209. a.apply(n, "Rexpr", nil, n.Rexpr)
  210. case *pg.A_Indices:
  211. a.apply(n, "Lidx", nil, n.Lidx)
  212. a.apply(n, "Uidx", nil, n.Uidx)
  213. case *pg.A_Indirection:
  214. a.apply(n, "Arg", nil, n.Arg)
  215. a.apply(n, "Indirection", nil, n.Indirection)
  216. case *pg.A_Star:
  217. // pass
  218. case *pg.AccessPriv:
  219. a.apply(n, "Cols", nil, n.Cols)
  220. case *pg.Aggref:
  221. a.apply(n, "Xpr", nil, n.Xpr)
  222. a.apply(n, "Aggargtypes", nil, n.Aggargtypes)
  223. a.apply(n, "Aggdirectargs", nil, n.Aggdirectargs)
  224. a.apply(n, "Args", nil, n.Args)
  225. a.apply(n, "Aggorder", nil, n.Aggorder)
  226. a.apply(n, "Aggdistinct", nil, n.Aggdistinct)
  227. a.apply(n, "Aggfilter", nil, n.Aggfilter)
  228. case *pg.Alias:
  229. a.apply(n, "Colnames", nil, n.Colnames)
  230. case *pg.AlterCollationStmt:
  231. a.apply(n, "Collname", nil, n.Collname)
  232. case *pg.AlterDatabaseSetStmt:
  233. a.apply(n, "Setstmt", nil, n.Setstmt)
  234. case *pg.AlterDatabaseStmt:
  235. a.apply(n, "Options", nil, n.Options)
  236. case *pg.AlterDefaultPrivilegesStmt:
  237. a.apply(n, "Options", nil, n.Options)
  238. a.apply(n, "Action", nil, n.Action)
  239. case *pg.AlterDomainStmt:
  240. a.apply(n, "TypeName", nil, n.TypeName)
  241. a.apply(n, "Def", nil, n.Def)
  242. case *pg.AlterEnumStmt:
  243. a.apply(n, "TypeName", nil, n.TypeName)
  244. case *pg.AlterEventTrigStmt:
  245. // pass
  246. case *pg.AlterExtensionContentsStmt:
  247. a.apply(n, "Object", nil, n.Object)
  248. case *pg.AlterExtensionStmt:
  249. a.apply(n, "Options", nil, n.Options)
  250. case *pg.AlterFdwStmt:
  251. a.apply(n, "FuncOptions", nil, n.FuncOptions)
  252. a.apply(n, "Options", nil, n.Options)
  253. case *pg.AlterForeignServerStmt:
  254. a.apply(n, "Options", nil, n.Options)
  255. case *pg.AlterFunctionStmt:
  256. a.apply(n, "Func", nil, n.Func)
  257. a.apply(n, "Actions", nil, n.Actions)
  258. case *pg.AlterObjectDependsStmt:
  259. a.apply(n, "Relation", nil, n.Relation)
  260. a.apply(n, "Object", nil, n.Object)
  261. a.apply(n, "Extname", nil, n.Extname)
  262. case *pg.AlterObjectSchemaStmt:
  263. a.apply(n, "Relation", nil, n.Relation)
  264. a.apply(n, "Object", nil, n.Object)
  265. case *pg.AlterOpFamilyStmt:
  266. a.apply(n, "Opfamilyname", nil, n.Opfamilyname)
  267. a.apply(n, "Items", nil, n.Items)
  268. case *pg.AlterOperatorStmt:
  269. a.apply(n, "Opername", nil, n.Opername)
  270. a.apply(n, "Options", nil, n.Options)
  271. case *pg.AlterOwnerStmt:
  272. a.apply(n, "Relation", nil, n.Relation)
  273. a.apply(n, "Object", nil, n.Object)
  274. a.apply(n, "Newowner", nil, n.Newowner)
  275. case *pg.AlterPolicyStmt:
  276. a.apply(n, "Table", nil, n.Table)
  277. a.apply(n, "Roles", nil, n.Roles)
  278. a.apply(n, "Qual", nil, n.Qual)
  279. a.apply(n, "WithCheck", nil, n.WithCheck)
  280. case *pg.AlterPublicationStmt:
  281. a.apply(n, "Options", nil, n.Options)
  282. a.apply(n, "Tables", nil, n.Tables)
  283. case *pg.AlterRoleSetStmt:
  284. a.apply(n, "Role", nil, n.Role)
  285. a.apply(n, "Setstmt", nil, n.Setstmt)
  286. case *pg.AlterRoleStmt:
  287. a.apply(n, "Role", nil, n.Role)
  288. a.apply(n, "Options", nil, n.Options)
  289. case *pg.AlterSeqStmt:
  290. a.apply(n, "Sequence", nil, n.Sequence)
  291. a.apply(n, "Options", nil, n.Options)
  292. case *pg.AlterSubscriptionStmt:
  293. a.apply(n, "Publication", nil, n.Publication)
  294. a.apply(n, "Options", nil, n.Options)
  295. case *pg.AlterSystemStmt:
  296. a.apply(n, "Setstmt", nil, n.Setstmt)
  297. case *pg.AlterTSConfigurationStmt:
  298. a.apply(n, "Cfgname", nil, n.Cfgname)
  299. a.apply(n, "Tokentype", nil, n.Tokentype)
  300. a.apply(n, "Dicts", nil, n.Dicts)
  301. case *pg.AlterTSDictionaryStmt:
  302. a.apply(n, "Dictname", nil, n.Dictname)
  303. a.apply(n, "Options", nil, n.Options)
  304. case *pg.AlterTableCmd:
  305. a.apply(n, "Newowner", nil, n.Newowner)
  306. a.apply(n, "Def", nil, n.Def)
  307. case *pg.AlterTableMoveAllStmt:
  308. a.apply(n, "Roles", nil, n.Roles)
  309. case *pg.AlterTableSpaceOptionsStmt:
  310. a.apply(n, "Options", nil, n.Options)
  311. case *pg.AlterTableStmt:
  312. a.apply(n, "Relation", nil, n.Relation)
  313. a.apply(n, "Cmds", nil, n.Cmds)
  314. case *pg.AlterUserMappingStmt:
  315. a.apply(n, "User", nil, n.User)
  316. a.apply(n, "Options", nil, n.Options)
  317. case *pg.AlternativeSubPlan:
  318. a.apply(n, "Xpr", nil, n.Xpr)
  319. a.apply(n, "Subplans", nil, n.Subplans)
  320. case *pg.ArrayCoerceExpr:
  321. a.apply(n, "Xpr", nil, n.Xpr)
  322. a.apply(n, "Arg", nil, n.Arg)
  323. case *pg.ArrayExpr:
  324. a.apply(n, "Xpr", nil, n.Xpr)
  325. a.apply(n, "Elements", nil, n.Elements)
  326. case *pg.ArrayRef:
  327. a.apply(n, "Xpr", nil, n.Xpr)
  328. a.apply(n, "Refupperindexpr", nil, n.Refupperindexpr)
  329. a.apply(n, "Reflowerindexpr", nil, n.Reflowerindexpr)
  330. a.apply(n, "Refexpr", nil, n.Refexpr)
  331. a.apply(n, "Refassgnexpr", nil, n.Refassgnexpr)
  332. case *pg.BitString:
  333. // pass
  334. case *pg.BlockIdData:
  335. // pass
  336. case *pg.BoolExpr:
  337. a.apply(n, "Xpr", nil, n.Xpr)
  338. a.apply(n, "Args", nil, n.Args)
  339. case *pg.BooleanTest:
  340. a.apply(n, "Xpr", nil, n.Xpr)
  341. a.apply(n, "Arg", nil, n.Arg)
  342. case *pg.CaseExpr:
  343. a.apply(n, "Xpr", nil, n.Xpr)
  344. a.apply(n, "Arg", nil, n.Arg)
  345. a.apply(n, "Args", nil, n.Args)
  346. a.apply(n, "Defresult", nil, n.Defresult)
  347. case *pg.CaseTestExpr:
  348. a.apply(n, "Xpr", nil, n.Xpr)
  349. case *pg.CaseWhen:
  350. a.apply(n, "Xpr", nil, n.Xpr)
  351. a.apply(n, "Expr", nil, n.Expr)
  352. a.apply(n, "Result", nil, n.Result)
  353. case *pg.CheckPointStmt:
  354. // pass
  355. case *pg.ClosePortalStmt:
  356. // pass
  357. case *pg.ClusterStmt:
  358. a.apply(n, "Relation", nil, n.Relation)
  359. case *pg.CoalesceExpr:
  360. a.apply(n, "Xpr", nil, n.Xpr)
  361. a.apply(n, "Args", nil, n.Args)
  362. case *pg.CoerceToDomain:
  363. a.apply(n, "Xpr", nil, n.Xpr)
  364. a.apply(n, "Arg", nil, n.Arg)
  365. case *pg.CoerceToDomainValue:
  366. a.apply(n, "Xpr", nil, n.Xpr)
  367. case *pg.CoerceViaIO:
  368. a.apply(n, "Xpr", nil, n.Xpr)
  369. a.apply(n, "Arg", nil, n.Arg)
  370. case *pg.CollateClause:
  371. a.apply(n, "Arg", nil, n.Arg)
  372. a.apply(n, "Collname", nil, n.Collname)
  373. case *pg.CollateExpr:
  374. a.apply(n, "Xpr", nil, n.Xpr)
  375. a.apply(n, "Arg", nil, n.Arg)
  376. case *pg.ColumnDef:
  377. a.apply(n, "TypeName", nil, n.TypeName)
  378. a.apply(n, "RawDefault", nil, n.RawDefault)
  379. a.apply(n, "CookedDefault", nil, n.CookedDefault)
  380. a.apply(n, "CollClause", nil, n.CollClause)
  381. a.apply(n, "Constraints", nil, n.Constraints)
  382. a.apply(n, "Fdwoptions", nil, n.Fdwoptions)
  383. case *pg.ColumnRef:
  384. a.apply(n, "Fields", nil, n.Fields)
  385. case *pg.CommentStmt:
  386. a.apply(n, "Object", nil, n.Object)
  387. case *pg.CommonTableExpr:
  388. a.apply(n, "Aliascolnames", nil, n.Aliascolnames)
  389. a.apply(n, "Ctequery", nil, n.Ctequery)
  390. a.apply(n, "Ctecolnames", nil, n.Ctecolnames)
  391. a.apply(n, "Ctecoltypes", nil, n.Ctecoltypes)
  392. a.apply(n, "Ctecoltypmods", nil, n.Ctecoltypmods)
  393. a.apply(n, "Ctecolcollations", nil, n.Ctecolcollations)
  394. case *pg.CompositeTypeStmt:
  395. a.apply(n, "Typevar", nil, n.Typevar)
  396. a.apply(n, "Coldeflist", nil, n.Coldeflist)
  397. case *pg.Const:
  398. a.apply(n, "Xpr", nil, n.Xpr)
  399. case *pg.Constraint:
  400. a.apply(n, "RawExpr", nil, n.RawExpr)
  401. a.apply(n, "Keys", nil, n.Keys)
  402. a.apply(n, "Exclusions", nil, n.Exclusions)
  403. a.apply(n, "Options", nil, n.Options)
  404. a.apply(n, "WhereClause", nil, n.WhereClause)
  405. a.apply(n, "Pktable", nil, n.Pktable)
  406. a.apply(n, "FkAttrs", nil, n.FkAttrs)
  407. a.apply(n, "PkAttrs", nil, n.PkAttrs)
  408. a.apply(n, "OldConpfeqop", nil, n.OldConpfeqop)
  409. case *pg.ConstraintsSetStmt:
  410. a.apply(n, "Constraints", nil, n.Constraints)
  411. case *pg.ConvertRowtypeExpr:
  412. a.apply(n, "Xpr", nil, n.Xpr)
  413. a.apply(n, "Arg", nil, n.Arg)
  414. case *pg.CopyStmt:
  415. a.apply(n, "Relation", nil, n.Relation)
  416. a.apply(n, "Query", nil, n.Query)
  417. a.apply(n, "Attlist", nil, n.Attlist)
  418. a.apply(n, "Options", nil, n.Options)
  419. case *pg.CreateAmStmt:
  420. a.apply(n, "HandlerName", nil, n.HandlerName)
  421. case *pg.CreateCastStmt:
  422. a.apply(n, "Sourcetype", nil, n.Sourcetype)
  423. a.apply(n, "Targettype", nil, n.Targettype)
  424. a.apply(n, "Func", nil, n.Func)
  425. case *pg.CreateConversionStmt:
  426. a.apply(n, "ConversionName", nil, n.ConversionName)
  427. a.apply(n, "FuncName", nil, n.FuncName)
  428. case *pg.CreateDomainStmt:
  429. a.apply(n, "Domainname", nil, n.Domainname)
  430. a.apply(n, "TypeName", nil, n.TypeName)
  431. a.apply(n, "CollClause", nil, n.CollClause)
  432. a.apply(n, "Constraints", nil, n.Constraints)
  433. case *pg.CreateEnumStmt:
  434. a.apply(n, "TypeName", nil, n.TypeName)
  435. a.apply(n, "Vals", nil, n.Vals)
  436. case *pg.CreateEventTrigStmt:
  437. a.apply(n, "Whenclause", nil, n.Whenclause)
  438. a.apply(n, "Funcname", nil, n.Funcname)
  439. case *pg.CreateExtensionStmt:
  440. a.apply(n, "Options", nil, n.Options)
  441. case *pg.CreateFdwStmt:
  442. a.apply(n, "FuncOptions", nil, n.FuncOptions)
  443. a.apply(n, "Options", nil, n.Options)
  444. case *pg.CreateForeignServerStmt:
  445. a.apply(n, "Options", nil, n.Options)
  446. case *pg.CreateForeignTableStmt:
  447. a.apply(n, "Base", nil, n.Base)
  448. a.apply(n, "Options", nil, n.Options)
  449. case *pg.CreateFunctionStmt:
  450. a.apply(n, "Funcname", nil, n.Funcname)
  451. a.apply(n, "Parameters", nil, n.Parameters)
  452. a.apply(n, "ReturnType", nil, n.ReturnType)
  453. a.apply(n, "Options", nil, n.Options)
  454. a.apply(n, "WithClause", nil, n.WithClause)
  455. case *pg.CreateOpClassItem:
  456. a.apply(n, "Name", nil, n.Name)
  457. a.apply(n, "OrderFamily", nil, n.OrderFamily)
  458. a.apply(n, "ClassArgs", nil, n.ClassArgs)
  459. a.apply(n, "Storedtype", nil, n.Storedtype)
  460. case *pg.CreateOpClassStmt:
  461. a.apply(n, "Opclassname", nil, n.Opclassname)
  462. a.apply(n, "Opfamilyname", nil, n.Opfamilyname)
  463. a.apply(n, "Datatype", nil, n.Datatype)
  464. a.apply(n, "Items", nil, n.Items)
  465. case *pg.CreateOpFamilyStmt:
  466. a.apply(n, "Opfamilyname", nil, n.Opfamilyname)
  467. case *pg.CreatePLangStmt:
  468. a.apply(n, "Plhandler", nil, n.Plhandler)
  469. a.apply(n, "Plinline", nil, n.Plinline)
  470. a.apply(n, "Plvalidator", nil, n.Plvalidator)
  471. case *pg.CreatePolicyStmt:
  472. a.apply(n, "Table", nil, n.Table)
  473. a.apply(n, "Roles", nil, n.Roles)
  474. a.apply(n, "Qual", nil, n.Qual)
  475. a.apply(n, "WithCheck", nil, n.WithCheck)
  476. case *pg.CreatePublicationStmt:
  477. a.apply(n, "Options", nil, n.Options)
  478. a.apply(n, "Tables", nil, n.Tables)
  479. case *pg.CreateRangeStmt:
  480. a.apply(n, "TypeName", nil, n.TypeName)
  481. a.apply(n, "Params", nil, n.Params)
  482. case *pg.CreateRoleStmt:
  483. a.apply(n, "Options", nil, n.Options)
  484. case *pg.CreateSchemaStmt:
  485. a.apply(n, "Authrole", nil, n.Authrole)
  486. a.apply(n, "SchemaElts", nil, n.SchemaElts)
  487. case *pg.CreateSeqStmt:
  488. a.apply(n, "Sequence", nil, n.Sequence)
  489. a.apply(n, "Options", nil, n.Options)
  490. case *pg.CreateStatsStmt:
  491. a.apply(n, "Defnames", nil, n.Defnames)
  492. a.apply(n, "StatTypes", nil, n.StatTypes)
  493. a.apply(n, "Exprs", nil, n.Exprs)
  494. a.apply(n, "Relations", nil, n.Relations)
  495. case *pg.CreateStmt:
  496. a.apply(n, "Relation", nil, n.Relation)
  497. a.apply(n, "TableElts", nil, n.TableElts)
  498. a.apply(n, "InhRelations", nil, n.InhRelations)
  499. a.apply(n, "Partbound", nil, n.Partbound)
  500. a.apply(n, "Partspec", nil, n.Partspec)
  501. a.apply(n, "OfTypename", nil, n.OfTypename)
  502. a.apply(n, "Constraints", nil, n.Constraints)
  503. a.apply(n, "Options", nil, n.Options)
  504. case *pg.CreateSubscriptionStmt:
  505. a.apply(n, "Publication", nil, n.Publication)
  506. a.apply(n, "Options", nil, n.Options)
  507. case *pg.CreateTableAsStmt:
  508. a.apply(n, "Query", nil, n.Query)
  509. a.apply(n, "Into", nil, n.Into)
  510. case *pg.CreateTableSpaceStmt:
  511. a.apply(n, "Owner", nil, n.Owner)
  512. a.apply(n, "Options", nil, n.Options)
  513. case *pg.CreateTransformStmt:
  514. a.apply(n, "TypeName", nil, n.TypeName)
  515. a.apply(n, "Fromsql", nil, n.Fromsql)
  516. a.apply(n, "Tosql", nil, n.Tosql)
  517. case *pg.CreateTrigStmt:
  518. a.apply(n, "Relation", nil, n.Relation)
  519. a.apply(n, "Funcname", nil, n.Funcname)
  520. a.apply(n, "Args", nil, n.Args)
  521. a.apply(n, "Columns", nil, n.Columns)
  522. a.apply(n, "WhenClause", nil, n.WhenClause)
  523. a.apply(n, "TransitionRels", nil, n.TransitionRels)
  524. a.apply(n, "Constrrel", nil, n.Constrrel)
  525. case *pg.CreateUserMappingStmt:
  526. a.apply(n, "User", nil, n.User)
  527. a.apply(n, "Options", nil, n.Options)
  528. case *pg.CreatedbStmt:
  529. a.apply(n, "Options", nil, n.Options)
  530. case *pg.CurrentOfExpr:
  531. a.apply(n, "Xpr", nil, n.Xpr)
  532. case *pg.DeallocateStmt:
  533. // pass
  534. case *pg.DeclareCursorStmt:
  535. a.apply(n, "Query", nil, n.Query)
  536. case *pg.DefElem:
  537. a.apply(n, "Arg", nil, n.Arg)
  538. case *pg.DefineStmt:
  539. a.apply(n, "Defnames", nil, n.Defnames)
  540. a.apply(n, "Args", nil, n.Args)
  541. a.apply(n, "Definition", nil, n.Definition)
  542. case *pg.DeleteStmt:
  543. a.apply(n, "Relation", nil, n.Relation)
  544. a.apply(n, "UsingClause", nil, n.UsingClause)
  545. a.apply(n, "WhereClause", nil, n.WhereClause)
  546. a.apply(n, "ReturningList", nil, n.ReturningList)
  547. a.apply(n, "WithClause", nil, n.WithClause)
  548. case *pg.DiscardStmt:
  549. // pass
  550. case *pg.DoStmt:
  551. a.apply(n, "Args", nil, n.Args)
  552. case *pg.DropOwnedStmt:
  553. a.apply(n, "Roles", nil, n.Roles)
  554. case *pg.DropRoleStmt:
  555. a.apply(n, "Roles", nil, n.Roles)
  556. case *pg.DropStmt:
  557. a.apply(n, "Objects", nil, n.Objects)
  558. case *pg.DropSubscriptionStmt:
  559. // pass
  560. case *pg.DropTableSpaceStmt:
  561. // pass
  562. case *pg.DropUserMappingStmt:
  563. a.apply(n, "User", nil, n.User)
  564. case *pg.DropdbStmt:
  565. // pass
  566. case *pg.ExecuteStmt:
  567. a.apply(n, "Params", nil, n.Params)
  568. case *pg.ExplainStmt:
  569. a.apply(n, "Query", nil, n.Query)
  570. a.apply(n, "Options", nil, n.Options)
  571. case *pg.Expr:
  572. // pass
  573. case *pg.FetchStmt:
  574. // pass
  575. case *pg.FieldSelect:
  576. a.apply(n, "Xpr", nil, n.Xpr)
  577. a.apply(n, "Arg", nil, n.Arg)
  578. case *pg.FieldStore:
  579. a.apply(n, "Xpr", nil, n.Xpr)
  580. a.apply(n, "Arg", nil, n.Arg)
  581. a.apply(n, "Newvals", nil, n.Newvals)
  582. a.apply(n, "Fieldnums", nil, n.Fieldnums)
  583. case *pg.Float:
  584. // pass
  585. case *pg.FromExpr:
  586. a.apply(n, "Fromlist", nil, n.Fromlist)
  587. a.apply(n, "Quals", nil, n.Quals)
  588. case *ast.FuncCall:
  589. a.apply(n, "Func", nil, n.Func)
  590. a.apply(n, "Funcname", nil, n.Funcname)
  591. a.apply(n, "Args", nil, n.Args)
  592. a.apply(n, "AggOrder", nil, n.AggOrder)
  593. a.apply(n, "AggFilter", nil, n.AggFilter)
  594. a.apply(n, "Over", nil, n.Over)
  595. case *pg.FuncExpr:
  596. a.apply(n, "Xpr", nil, n.Xpr)
  597. a.apply(n, "Args", nil, n.Args)
  598. case *pg.FunctionParameter:
  599. a.apply(n, "ArgType", nil, n.ArgType)
  600. a.apply(n, "Defexpr", nil, n.Defexpr)
  601. case *pg.GrantRoleStmt:
  602. a.apply(n, "GrantedRoles", nil, n.GrantedRoles)
  603. a.apply(n, "GranteeRoles", nil, n.GranteeRoles)
  604. a.apply(n, "Grantor", nil, n.Grantor)
  605. case *pg.GrantStmt:
  606. a.apply(n, "Objects", nil, n.Objects)
  607. a.apply(n, "Privileges", nil, n.Privileges)
  608. a.apply(n, "Grantees", nil, n.Grantees)
  609. case *pg.GroupingFunc:
  610. a.apply(n, "Xpr", nil, n.Xpr)
  611. a.apply(n, "Args", nil, n.Args)
  612. a.apply(n, "Refs", nil, n.Refs)
  613. a.apply(n, "Cols", nil, n.Cols)
  614. case *pg.GroupingSet:
  615. a.apply(n, "Content", nil, n.Content)
  616. case *pg.ImportForeignSchemaStmt:
  617. a.apply(n, "TableList", nil, n.TableList)
  618. a.apply(n, "Options", nil, n.Options)
  619. case *pg.IndexElem:
  620. a.apply(n, "Expr", nil, n.Expr)
  621. a.apply(n, "Collation", nil, n.Collation)
  622. a.apply(n, "Opclass", nil, n.Opclass)
  623. case *pg.IndexStmt:
  624. a.apply(n, "Relation", nil, n.Relation)
  625. a.apply(n, "IndexParams", nil, n.IndexParams)
  626. a.apply(n, "Options", nil, n.Options)
  627. a.apply(n, "WhereClause", nil, n.WhereClause)
  628. a.apply(n, "ExcludeOpNames", nil, n.ExcludeOpNames)
  629. case *pg.InferClause:
  630. a.apply(n, "IndexElems", nil, n.IndexElems)
  631. a.apply(n, "WhereClause", nil, n.WhereClause)
  632. case *pg.InferenceElem:
  633. a.apply(n, "Xpr", nil, n.Xpr)
  634. a.apply(n, "Expr", nil, n.Expr)
  635. case *pg.InlineCodeBlock:
  636. // pass
  637. case *pg.InsertStmt:
  638. a.apply(n, "Relation", nil, n.Relation)
  639. a.apply(n, "Cols", nil, n.Cols)
  640. a.apply(n, "SelectStmt", nil, n.SelectStmt)
  641. a.apply(n, "OnConflictClause", nil, n.OnConflictClause)
  642. a.apply(n, "ReturningList", nil, n.ReturningList)
  643. a.apply(n, "WithClause", nil, n.WithClause)
  644. case *pg.Integer:
  645. // pass
  646. case *pg.IntoClause:
  647. a.apply(n, "Rel", nil, n.Rel)
  648. a.apply(n, "ColNames", nil, n.ColNames)
  649. a.apply(n, "Options", nil, n.Options)
  650. a.apply(n, "ViewQuery", nil, n.ViewQuery)
  651. case *pg.JoinExpr:
  652. a.apply(n, "Larg", nil, n.Larg)
  653. a.apply(n, "Rarg", nil, n.Rarg)
  654. a.apply(n, "UsingClause", nil, n.UsingClause)
  655. a.apply(n, "Quals", nil, n.Quals)
  656. a.apply(n, "Alias", nil, n.Alias)
  657. case *pg.ListenStmt:
  658. // pass
  659. case *pg.LoadStmt:
  660. // pass
  661. case *pg.LockStmt:
  662. a.apply(n, "Relations", nil, n.Relations)
  663. case *pg.LockingClause:
  664. a.apply(n, "LockedRels", nil, n.LockedRels)
  665. case *pg.MinMaxExpr:
  666. a.apply(n, "Xpr", nil, n.Xpr)
  667. a.apply(n, "Args", nil, n.Args)
  668. case *pg.MultiAssignRef:
  669. a.apply(n, "Source", nil, n.Source)
  670. case *pg.NamedArgExpr:
  671. a.apply(n, "Xpr", nil, n.Xpr)
  672. a.apply(n, "Arg", nil, n.Arg)
  673. case *pg.NextValueExpr:
  674. a.apply(n, "Xpr", nil, n.Xpr)
  675. case *pg.NotifyStmt:
  676. // pass
  677. case *pg.Null:
  678. // pass
  679. case *pg.NullTest:
  680. a.apply(n, "Xpr", nil, n.Xpr)
  681. a.apply(n, "Arg", nil, n.Arg)
  682. case *pg.ObjectWithArgs:
  683. a.apply(n, "Objname", nil, n.Objname)
  684. a.apply(n, "Objargs", nil, n.Objargs)
  685. case *pg.OnConflictClause:
  686. a.apply(n, "Infer", nil, n.Infer)
  687. a.apply(n, "TargetList", nil, n.TargetList)
  688. a.apply(n, "WhereClause", nil, n.WhereClause)
  689. case *pg.OnConflictExpr:
  690. a.apply(n, "ArbiterElems", nil, n.ArbiterElems)
  691. a.apply(n, "ArbiterWhere", nil, n.ArbiterWhere)
  692. a.apply(n, "OnConflictSet", nil, n.OnConflictSet)
  693. a.apply(n, "OnConflictWhere", nil, n.OnConflictWhere)
  694. a.apply(n, "ExclRelTlist", nil, n.ExclRelTlist)
  695. case *pg.OpExpr:
  696. a.apply(n, "Xpr", nil, n.Xpr)
  697. a.apply(n, "Args", nil, n.Args)
  698. case *pg.Param:
  699. a.apply(n, "Xpr", nil, n.Xpr)
  700. case *pg.ParamExecData:
  701. // pass
  702. case *pg.ParamExternData:
  703. // pass
  704. case *pg.ParamListInfoData:
  705. // pass
  706. case *pg.ParamRef:
  707. // pass
  708. case *pg.PartitionBoundSpec:
  709. a.apply(n, "Listdatums", nil, n.Listdatums)
  710. a.apply(n, "Lowerdatums", nil, n.Lowerdatums)
  711. a.apply(n, "Upperdatums", nil, n.Upperdatums)
  712. case *pg.PartitionCmd:
  713. a.apply(n, "Name", nil, n.Name)
  714. a.apply(n, "Bound", nil, n.Bound)
  715. case *pg.PartitionElem:
  716. a.apply(n, "Expr", nil, n.Expr)
  717. a.apply(n, "Collation", nil, n.Collation)
  718. a.apply(n, "Opclass", nil, n.Opclass)
  719. case *pg.PartitionRangeDatum:
  720. a.apply(n, "Value", nil, n.Value)
  721. case *pg.PartitionSpec:
  722. a.apply(n, "PartParams", nil, n.PartParams)
  723. case *pg.PrepareStmt:
  724. a.apply(n, "Argtypes", nil, n.Argtypes)
  725. a.apply(n, "Query", nil, n.Query)
  726. case *pg.Query:
  727. a.apply(n, "UtilityStmt", nil, n.UtilityStmt)
  728. a.apply(n, "CteList", nil, n.CteList)
  729. a.apply(n, "Rtable", nil, n.Rtable)
  730. a.apply(n, "Jointree", nil, n.Jointree)
  731. a.apply(n, "TargetList", nil, n.TargetList)
  732. a.apply(n, "OnConflict", nil, n.OnConflict)
  733. a.apply(n, "ReturningList", nil, n.ReturningList)
  734. a.apply(n, "GroupClause", nil, n.GroupClause)
  735. a.apply(n, "GroupingSets", nil, n.GroupingSets)
  736. a.apply(n, "HavingQual", nil, n.HavingQual)
  737. a.apply(n, "WindowClause", nil, n.WindowClause)
  738. a.apply(n, "DistinctClause", nil, n.DistinctClause)
  739. a.apply(n, "SortClause", nil, n.SortClause)
  740. a.apply(n, "LimitOffset", nil, n.LimitOffset)
  741. a.apply(n, "LimitCount", nil, n.LimitCount)
  742. a.apply(n, "RowMarks", nil, n.RowMarks)
  743. a.apply(n, "SetOperations", nil, n.SetOperations)
  744. a.apply(n, "ConstraintDeps", nil, n.ConstraintDeps)
  745. a.apply(n, "WithCheckOptions", nil, n.WithCheckOptions)
  746. case *pg.RangeFunction:
  747. a.apply(n, "Functions", nil, n.Functions)
  748. a.apply(n, "Alias", nil, n.Alias)
  749. a.apply(n, "Coldeflist", nil, n.Coldeflist)
  750. case *pg.RangeSubselect:
  751. a.apply(n, "Subquery", nil, n.Subquery)
  752. a.apply(n, "Alias", nil, n.Alias)
  753. case *pg.RangeTableFunc:
  754. a.apply(n, "Docexpr", nil, n.Docexpr)
  755. a.apply(n, "Rowexpr", nil, n.Rowexpr)
  756. a.apply(n, "Namespaces", nil, n.Namespaces)
  757. a.apply(n, "Columns", nil, n.Columns)
  758. a.apply(n, "Alias", nil, n.Alias)
  759. case *pg.RangeTableFuncCol:
  760. a.apply(n, "TypeName", nil, n.TypeName)
  761. a.apply(n, "Colexpr", nil, n.Colexpr)
  762. a.apply(n, "Coldefexpr", nil, n.Coldefexpr)
  763. case *pg.RangeTableSample:
  764. a.apply(n, "Relation", nil, n.Relation)
  765. a.apply(n, "Method", nil, n.Method)
  766. a.apply(n, "Args", nil, n.Args)
  767. a.apply(n, "Repeatable", nil, n.Repeatable)
  768. case *pg.RangeTblEntry:
  769. a.apply(n, "Tablesample", nil, n.Tablesample)
  770. a.apply(n, "Subquery", nil, n.Subquery)
  771. a.apply(n, "Joinaliasvars", nil, n.Joinaliasvars)
  772. a.apply(n, "Functions", nil, n.Functions)
  773. a.apply(n, "Tablefunc", nil, n.Tablefunc)
  774. a.apply(n, "ValuesLists", nil, n.ValuesLists)
  775. a.apply(n, "Coltypes", nil, n.Coltypes)
  776. a.apply(n, "Coltypmods", nil, n.Coltypmods)
  777. a.apply(n, "Colcollations", nil, n.Colcollations)
  778. a.apply(n, "Alias", nil, n.Alias)
  779. a.apply(n, "Eref", nil, n.Eref)
  780. a.apply(n, "SecurityQuals", nil, n.SecurityQuals)
  781. case *pg.RangeTblFunction:
  782. a.apply(n, "Funcexpr", nil, n.Funcexpr)
  783. a.apply(n, "Funccolnames", nil, n.Funccolnames)
  784. a.apply(n, "Funccoltypes", nil, n.Funccoltypes)
  785. a.apply(n, "Funccoltypmods", nil, n.Funccoltypmods)
  786. a.apply(n, "Funccolcollations", nil, n.Funccolcollations)
  787. case *pg.RangeTblRef:
  788. // pass
  789. case *pg.RangeVar:
  790. a.apply(n, "Alias", nil, n.Alias)
  791. case *pg.RawStmt:
  792. a.apply(n, "Stmt", nil, n.Stmt)
  793. case *pg.ReassignOwnedStmt:
  794. a.apply(n, "Roles", nil, n.Roles)
  795. a.apply(n, "Newrole", nil, n.Newrole)
  796. case *pg.RefreshMatViewStmt:
  797. a.apply(n, "Relation", nil, n.Relation)
  798. case *pg.ReindexStmt:
  799. a.apply(n, "Relation", nil, n.Relation)
  800. case *pg.RelabelType:
  801. a.apply(n, "Xpr", nil, n.Xpr)
  802. a.apply(n, "Arg", nil, n.Arg)
  803. case *pg.RenameStmt:
  804. a.apply(n, "Relation", nil, n.Relation)
  805. a.apply(n, "Object", nil, n.Object)
  806. case *pg.ReplicaIdentityStmt:
  807. // pass
  808. case *pg.ResTarget:
  809. a.apply(n, "Indirection", nil, n.Indirection)
  810. a.apply(n, "Val", nil, n.Val)
  811. case *pg.RoleSpec:
  812. // pass
  813. case *pg.RowCompareExpr:
  814. a.apply(n, "Xpr", nil, n.Xpr)
  815. a.apply(n, "Opnos", nil, n.Opnos)
  816. a.apply(n, "Opfamilies", nil, n.Opfamilies)
  817. a.apply(n, "Inputcollids", nil, n.Inputcollids)
  818. a.apply(n, "Largs", nil, n.Largs)
  819. a.apply(n, "Rargs", nil, n.Rargs)
  820. case *pg.RowExpr:
  821. a.apply(n, "Xpr", nil, n.Xpr)
  822. a.apply(n, "Args", nil, n.Args)
  823. a.apply(n, "Colnames", nil, n.Colnames)
  824. case *pg.RowMarkClause:
  825. // pass
  826. case *pg.RuleStmt:
  827. a.apply(n, "Relation", nil, n.Relation)
  828. a.apply(n, "WhereClause", nil, n.WhereClause)
  829. a.apply(n, "Actions", nil, n.Actions)
  830. case *pg.SQLValueFunction:
  831. a.apply(n, "Xpr", nil, n.Xpr)
  832. case *pg.ScalarArrayOpExpr:
  833. a.apply(n, "Xpr", nil, n.Xpr)
  834. a.apply(n, "Args", nil, n.Args)
  835. case *pg.SecLabelStmt:
  836. a.apply(n, "Object", nil, n.Object)
  837. case *pg.SelectStmt:
  838. a.apply(n, "DistinctClause", nil, n.DistinctClause)
  839. a.apply(n, "IntoClause", nil, n.IntoClause)
  840. a.apply(n, "TargetList", nil, n.TargetList)
  841. a.apply(n, "FromClause", nil, n.FromClause)
  842. a.apply(n, "WhereClause", nil, n.WhereClause)
  843. a.apply(n, "GroupClause", nil, n.GroupClause)
  844. a.apply(n, "HavingClause", nil, n.HavingClause)
  845. a.apply(n, "WindowClause", nil, n.WindowClause)
  846. a.apply(n, "ValuesLists", nil, n.ValuesLists)
  847. a.apply(n, "SortClause", nil, n.SortClause)
  848. a.apply(n, "LimitOffset", nil, n.LimitOffset)
  849. a.apply(n, "LimitCount", nil, n.LimitCount)
  850. a.apply(n, "LockingClause", nil, n.LockingClause)
  851. a.apply(n, "WithClause", nil, n.WithClause)
  852. a.apply(n, "Larg", nil, n.Larg)
  853. a.apply(n, "Rarg", nil, n.Rarg)
  854. case *pg.SetOperationStmt:
  855. a.apply(n, "Larg", nil, n.Larg)
  856. a.apply(n, "Rarg", nil, n.Rarg)
  857. a.apply(n, "ColTypes", nil, n.ColTypes)
  858. a.apply(n, "ColTypmods", nil, n.ColTypmods)
  859. a.apply(n, "ColCollations", nil, n.ColCollations)
  860. a.apply(n, "GroupClauses", nil, n.GroupClauses)
  861. case *pg.SetToDefault:
  862. a.apply(n, "Xpr", nil, n.Xpr)
  863. case *pg.SortBy:
  864. a.apply(n, "Node", nil, n.Node)
  865. a.apply(n, "UseOp", nil, n.UseOp)
  866. case *pg.SortGroupClause:
  867. // pass
  868. case *pg.String:
  869. // pass
  870. case *pg.SubLink:
  871. a.apply(n, "Xpr", nil, n.Xpr)
  872. a.apply(n, "Testexpr", nil, n.Testexpr)
  873. a.apply(n, "OperName", nil, n.OperName)
  874. a.apply(n, "Subselect", nil, n.Subselect)
  875. case *pg.SubPlan:
  876. a.apply(n, "Xpr", nil, n.Xpr)
  877. a.apply(n, "Testexpr", nil, n.Testexpr)
  878. a.apply(n, "ParamIds", nil, n.ParamIds)
  879. a.apply(n, "SetParam", nil, n.SetParam)
  880. a.apply(n, "ParParam", nil, n.ParParam)
  881. a.apply(n, "Args", nil, n.Args)
  882. case *pg.TableFunc:
  883. a.apply(n, "NsUris", nil, n.NsUris)
  884. a.apply(n, "NsNames", nil, n.NsNames)
  885. a.apply(n, "Docexpr", nil, n.Docexpr)
  886. a.apply(n, "Rowexpr", nil, n.Rowexpr)
  887. a.apply(n, "Colnames", nil, n.Colnames)
  888. a.apply(n, "Coltypes", nil, n.Coltypes)
  889. a.apply(n, "Coltypmods", nil, n.Coltypmods)
  890. a.apply(n, "Colcollations", nil, n.Colcollations)
  891. a.apply(n, "Colexprs", nil, n.Colexprs)
  892. a.apply(n, "Coldefexprs", nil, n.Coldefexprs)
  893. case *pg.TableLikeClause:
  894. a.apply(n, "Relation", nil, n.Relation)
  895. case *pg.TableSampleClause:
  896. a.apply(n, "Args", nil, n.Args)
  897. a.apply(n, "Repeatable", nil, n.Repeatable)
  898. case *pg.TargetEntry:
  899. a.apply(n, "Xpr", nil, n.Xpr)
  900. a.apply(n, "Expr", nil, n.Expr)
  901. case *pg.TransactionStmt:
  902. a.apply(n, "Options", nil, n.Options)
  903. case *pg.TriggerTransition:
  904. // pass
  905. case *pg.TruncateStmt:
  906. a.apply(n, "Relations", nil, n.Relations)
  907. case *pg.TypeCast:
  908. a.apply(n, "Arg", nil, n.Arg)
  909. a.apply(n, "TypeName", nil, n.TypeName)
  910. case *pg.TypeName:
  911. a.apply(n, "Names", nil, n.Names)
  912. a.apply(n, "Typmods", nil, n.Typmods)
  913. a.apply(n, "ArrayBounds", nil, n.ArrayBounds)
  914. case *pg.UnlistenStmt:
  915. // pass
  916. case *pg.UpdateStmt:
  917. a.apply(n, "Relation", nil, n.Relation)
  918. a.apply(n, "TargetList", nil, n.TargetList)
  919. a.apply(n, "WhereClause", nil, n.WhereClause)
  920. a.apply(n, "FromClause", nil, n.FromClause)
  921. a.apply(n, "ReturningList", nil, n.ReturningList)
  922. a.apply(n, "WithClause", nil, n.WithClause)
  923. case *pg.VacuumStmt:
  924. a.apply(n, "Relation", nil, n.Relation)
  925. a.apply(n, "VaCols", nil, n.VaCols)
  926. case *pg.Var:
  927. a.apply(n, "Xpr", nil, n.Xpr)
  928. case *pg.VariableSetStmt:
  929. a.apply(n, "Args", nil, n.Args)
  930. case *pg.VariableShowStmt:
  931. // pass
  932. case *pg.ViewStmt:
  933. a.apply(n, "View", nil, n.View)
  934. a.apply(n, "Aliases", nil, n.Aliases)
  935. a.apply(n, "Query", nil, n.Query)
  936. a.apply(n, "Options", nil, n.Options)
  937. case *pg.WindowClause:
  938. a.apply(n, "PartitionClause", nil, n.PartitionClause)
  939. a.apply(n, "OrderClause", nil, n.OrderClause)
  940. a.apply(n, "StartOffset", nil, n.StartOffset)
  941. a.apply(n, "EndOffset", nil, n.EndOffset)
  942. case *ast.WindowDef:
  943. a.apply(n, "PartitionClause", nil, n.PartitionClause)
  944. a.apply(n, "OrderClause", nil, n.OrderClause)
  945. a.apply(n, "StartOffset", nil, n.StartOffset)
  946. a.apply(n, "EndOffset", nil, n.EndOffset)
  947. case *pg.WindowFunc:
  948. a.apply(n, "Xpr", nil, n.Xpr)
  949. a.apply(n, "Args", nil, n.Args)
  950. a.apply(n, "Aggfilter", nil, n.Aggfilter)
  951. case *pg.WithCheckOption:
  952. a.apply(n, "Qual", nil, n.Qual)
  953. case *pg.WithClause:
  954. a.apply(n, "Ctes", nil, n.Ctes)
  955. case *pg.XmlExpr:
  956. a.apply(n, "Xpr", nil, n.Xpr)
  957. a.apply(n, "NamedArgs", nil, n.NamedArgs)
  958. a.apply(n, "ArgNames", nil, n.ArgNames)
  959. a.apply(n, "Args", nil, n.Args)
  960. case *pg.XmlSerialize:
  961. a.apply(n, "Expr", nil, n.Expr)
  962. a.apply(n, "TypeName", nil, n.TypeName)
  963. // Comments and fields
  964. default:
  965. panic(fmt.Sprintf("Apply: unexpected node type %T", n))
  966. }
  967. if a.post != nil && !a.post(&a.cursor) {
  968. panic(abort)
  969. }
  970. a.cursor = saved
  971. }
  972. // An iterator controls iteration over a slice of nodes.
  973. type iterator struct {
  974. index, step int
  975. }
  976. func (a *application) applyList(parent ast.Node, name string) {
  977. // avoid heap-allocating a new iterator for each applyList call; reuse a.iter instead
  978. saved := a.iter
  979. a.iter.index = 0
  980. for {
  981. // must reload parent.name each time, since cursor modifications might change it
  982. v := reflect.Indirect(reflect.ValueOf(parent)).FieldByName(name)
  983. if a.iter.index >= v.Len() {
  984. break
  985. }
  986. // element x may be nil in a bad AST - be cautious
  987. var x ast.Node
  988. if e := v.Index(a.iter.index); e.IsValid() {
  989. x = e.Interface().(ast.Node)
  990. }
  991. a.iter.step = 1
  992. a.apply(parent, name, &a.iter, x)
  993. a.iter.index += a.iter.step
  994. }
  995. a.iter = saved
  996. }