@@ -309,38 +309,46 @@ func parseUpdate(node *sqlparser.Update, query string, s *Schema, settings dinos
309309}
310310
311311func parseInsert (node * sqlparser.Insert , query string , s * Schema , settings dinosql.GenerateSettings ) (* Query , error ) {
312+ params := []* Param {}
312313 cols := node .Columns
313314 tableName := node .Table .Name .String ()
314- rows , ok := node .Rows .(sqlparser.Values )
315- if ! ok {
316- return nil , fmt .Errorf ("Unknown insert row type of %T" , node .Rows )
317- }
318315
319- params := []* Param {}
320-
321- for _ , row := range rows {
322- for colIx , item := range row {
323- switch v := item .(type ) {
324- case * sqlparser.SQLVal :
325- if v .Type == sqlparser .ValArg {
326- colName := cols [colIx ].String ()
327- colDfn , err := s .schemaLookup (tableName , colName )
328- varName := string (v .Val )
329- p := & Param {OriginalName : varName }
330- if err == nil {
331- p .Name = paramName (colDfn .Name , varName )
332- p .Typ = goTypeCol (colDfn , settings )
333- } else {
334- p .Name = "Unknown"
335- p .Typ = "interface{}"
316+ switch rows := node .Rows .(type ) {
317+ case * sqlparser.Select :
318+ selectQuery , err := parseSelect (rows , query , s , settings )
319+ if err != nil {
320+ return nil , err
321+ }
322+ params = append (params , selectQuery .Params ... )
323+ case sqlparser.Values :
324+ for _ , row := range rows {
325+ for colIx , item := range row {
326+ switch v := item .(type ) {
327+ case * sqlparser.SQLVal :
328+ if v .Type == sqlparser .ValArg {
329+ colName := cols [colIx ].String ()
330+ colDfn , err := s .schemaLookup (tableName , colName )
331+ varName := string (v .Val )
332+ p := & Param {OriginalName : varName }
333+ if err == nil {
334+ p .Name = paramName (colDfn .Name , varName )
335+ p .Typ = goTypeCol (colDfn , settings )
336+ } else {
337+ p .Name = "Unknown"
338+ p .Typ = "interface{}"
339+ }
340+ params = append (params , p )
336341 }
337- params = append (params , p )
342+
343+ default :
344+ panic ("Error occurred in parsing INSERT statement" )
338345 }
339- default :
340- panic ("Error occurred in parsing INSERT statement" )
341346 }
342347 }
348+ default :
349+ return nil , fmt .Errorf ("Unknown insert row type of %T" , node .Rows )
343350 }
351+
344352 parsedQuery := & Query {
345353 SQL : query ,
346354 Params : params ,
0 commit comments