@@ -512,7 +512,7 @@ func (c *cc) convertMultiSelect_stmtContext(n *parser.Select_stmtContext) ast.No
512512 }
513513
514514 limitCount , limitOffset := c .convertLimit_stmtContext (n .Limit_stmt ())
515- sortClause := c .buildSortClause (n .Order_by_stmt ())
515+ sortClause := c .convertOrderby_stmtContext (n .Order_by_stmt ())
516516
517517 selectStmt .LimitCount = limitCount
518518 selectStmt .LimitOffset = limitOffset
@@ -624,22 +624,57 @@ func (c *cc) convertWildCardField(n *parser.Result_columnContext) *ast.ColumnRef
624624 }
625625}
626626
627- func (c * cc ) convertOrderby_stmtContext (n parser.IOrder_by_stmtContext ) ast.Node {
628- if orderBy , ok := n .(* parser.Order_by_stmtContext ); ok {
629- list := & ast.List {Items : []ast.Node {}}
630- for _ , o := range orderBy .AllOrdering_term () {
631- term , ok := o .(* parser.Ordering_termContext )
632- if ! ok {
633- continue
627+ func (c * cc ) convertOrderby_stmtContext (n parser.IOrder_by_stmtContext ) * ast.List {
628+ if n == nil {
629+ return nil
630+ }
631+
632+ orderBy , ok := n .(* parser.Order_by_stmtContext )
633+ if ! ok {
634+ if debug .Active {
635+ log .Printf ("sqlite.convertOrderby_stmtContext: unexpected type %T" , n )
636+ }
637+ return nil
638+ }
639+
640+ if len (orderBy .AllOrdering_term ()) == 0 {
641+ return nil
642+ }
643+
644+ sortItems := & ast.List {Items : []ast.Node {}}
645+ for _ , o := range orderBy .AllOrdering_term () {
646+ term , ok := o .(* parser.Ordering_termContext )
647+ if ! ok {
648+ continue
649+ }
650+
651+ sortByDir := ast .SortByDirDefault
652+ if adNode := term .Asc_desc (); adNode != nil {
653+ if adNode .ASC_ () != nil {
654+ sortByDir = ast .SortByDirAsc
655+ } else if adNode .DESC_ () != nil {
656+ sortByDir = ast .SortByDirDesc
634657 }
635- list .Items = append (list .Items , & ast.CaseExpr {
636- Xpr : c .convert (term .Expr ()),
637- Location : term .Expr ().GetStart ().GetStart (),
638- })
639658 }
640- return list
659+
660+ sortByNulls := ast .SortByNullsDefault
661+ if term .NULLS_ () != nil {
662+ if term .FIRST_ () != nil {
663+ sortByNulls = ast .SortByNullsFirst
664+ } else if term .LAST_ () != nil {
665+ sortByNulls = ast .SortByNullsLast
666+ }
667+ }
668+
669+ sortItems .Items = append (sortItems .Items , & ast.SortBy {
670+ Node : c .convert (term .Expr ()),
671+ SortbyDir : sortByDir ,
672+ SortbyNulls : sortByNulls ,
673+ UseOp : & ast.List {},
674+ Location : term .GetStart ().GetStart (),
675+ })
641676 }
642- return todo ( "convertOrderby_stmtContext" , n )
677+ return sortItems
643678}
644679
645680func (c * cc ) convertLimit_stmtContext (n parser.ILimit_stmtContext ) (ast.Node , ast.Node ) {
@@ -1316,9 +1351,6 @@ func (c *cc) convert(node node) ast.Node {
13161351 case * parser.Insert_stmtContext :
13171352 return c .convertInsert_stmtContext (n )
13181353
1319- case * parser.Order_by_stmtContext :
1320- return c .convertOrderby_stmtContext (n )
1321-
13221354 case * parser.Select_stmtContext :
13231355 return c .convertMultiSelect_stmtContext (n )
13241356
@@ -1342,60 +1374,3 @@ func (c *cc) convert(node node) ast.Node {
13421374 }
13431375}
13441376
1345- // buildSortClause converts an IOrder_by_stmtContext into an *ast.List of *ast.SortBy nodes.
1346- func (c * cc ) buildSortClause (orderByNode parser.IOrder_by_stmtContext ) * ast.List {
1347- if orderByNode == nil {
1348- return nil
1349- }
1350-
1351- orderByCtx , ok := orderByNode .(* parser.Order_by_stmtContext )
1352- if ! ok {
1353- if debug .Active {
1354- log .Printf ("sqlite.buildSortClause: unexpected type %T for IOrder_by_stmtContext" , orderByNode )
1355- }
1356- return nil
1357- }
1358-
1359- if len (orderByCtx .AllOrdering_term ()) == 0 {
1360- return nil
1361- }
1362-
1363- sortItems := & ast.List {Items : []ast.Node {}}
1364- for _ , otermIP := range orderByCtx .AllOrdering_term () {
1365- oterm , ok := otermIP .(* parser.Ordering_termContext )
1366- if ! ok {
1367- if debug .Active {
1368- log .Printf ("sqlite.buildSortClause: unexpected type %T for IOrdering_termContext" , otermIP )
1369- }
1370- continue
1371- }
1372-
1373- sortByDir := ast .SortByDirDefault
1374- if adNode := oterm .Asc_desc (); adNode != nil {
1375- // Asc_descContext has ASC_() and DESC_() methods which return TerminalNode
1376- if adNode .ASC_ () != nil {
1377- sortByDir = ast .SortByDirAsc
1378- } else if adNode .DESC_ () != nil {
1379- sortByDir = ast .SortByDirDesc
1380- }
1381- }
1382-
1383- sortByNulls := ast .SortByNullsDefault
1384- if oterm .NULLS_ () != nil { // NULLS_() is a TerminalNode
1385- if oterm .FIRST_ () != nil { // FIRST_() is a TerminalNode
1386- sortByNulls = ast .SortByNullsFirst
1387- } else if oterm .LAST_ () != nil { // LAST_() is a TerminalNode
1388- sortByNulls = ast .SortByNullsLast
1389- }
1390- }
1391-
1392- sortItems .Items = append (sortItems .Items , & ast.SortBy {
1393- Node : c .convert (oterm .Expr ()),
1394- SortbyDir : sortByDir ,
1395- SortbyNulls : sortByNulls ,
1396- UseOp : & ast.List {}, // Typically empty for standard SQLite ORDER BY
1397- Location : oterm .GetStart ().GetStart (),
1398- })
1399- }
1400- return sortItems
1401- }
0 commit comments