@@ -562,6 +562,23 @@ func (s *SelectStatement) SQL() string {
562562 sb .WriteString (joinSQL (& j ))
563563 }
564564
565+ if s .ArrayJoin != nil {
566+ if s .ArrayJoin .Left {
567+ sb .WriteString (" LEFT ARRAY JOIN " )
568+ } else {
569+ sb .WriteString (" ARRAY JOIN " )
570+ }
571+ elems := make ([]string , len (s .ArrayJoin .Elements ))
572+ for i , e := range s .ArrayJoin .Elements {
573+ elemStr := exprSQL (e .Expr )
574+ if e .Alias != "" {
575+ elemStr += " AS " + e .Alias
576+ }
577+ elems [i ] = elemStr
578+ }
579+ sb .WriteString (strings .Join (elems , ", " ))
580+ }
581+
565582 if s .PrewhereClause != nil {
566583 sb .WriteString (" PREWHERE " )
567584 sb .WriteString (exprSQL (s .PrewhereClause ))
@@ -1406,6 +1423,13 @@ func forSQL(f *ForClause) string {
14061423func cteSQL (cte * CommonTableExpr ) string {
14071424 sb := getBuilder ()
14081425 defer putBuilder (sb )
1426+ // ClickHouse scalar CTE: WITH <expr> AS <name>
1427+ if cte .ScalarExpr != nil {
1428+ sb .WriteString (exprSQL (cte .ScalarExpr ))
1429+ sb .WriteString (" AS " )
1430+ sb .WriteString (cte .Name )
1431+ return sb .String ()
1432+ }
14091433 sb .WriteString (cte .Name )
14101434 if len (cte .Columns ) > 0 {
14111435 sb .WriteString (" (" )
@@ -1740,6 +1764,83 @@ func (p *PeriodDefinition) SQL() string {
17401764 return b .String ()
17411765}
17421766
1767+ // SQL returns the SQL string for a PRAGMA statement (SQLite).
1768+ func (p * PragmaStatement ) SQL () string {
1769+ if p == nil {
1770+ return ""
1771+ }
1772+ sb := getBuilder ()
1773+ defer putBuilder (sb )
1774+ sb .WriteString ("PRAGMA " )
1775+ sb .WriteString (p .Name )
1776+ if p .Arg != "" {
1777+ sb .WriteString ("(" )
1778+ sb .WriteString (p .Arg )
1779+ sb .WriteString (")" )
1780+ } else if p .Value != "" {
1781+ sb .WriteString (" = " )
1782+ sb .WriteString (p .Value )
1783+ }
1784+ return sb .String ()
1785+ }
1786+
1787+ // SQL returns the SQL string for a SHOW statement (MySQL).
1788+ func (s * ShowStatement ) SQL () string {
1789+ if s == nil {
1790+ return ""
1791+ }
1792+ sb := getBuilder ()
1793+ defer putBuilder (sb )
1794+ sb .WriteString ("SHOW " )
1795+ sb .WriteString (s .ShowType )
1796+ if s .ObjectName != "" {
1797+ sb .WriteString (" " )
1798+ sb .WriteString (s .ObjectName )
1799+ }
1800+ if s .From != "" {
1801+ sb .WriteString (" FROM " )
1802+ sb .WriteString (s .From )
1803+ }
1804+ return sb .String ()
1805+ }
1806+
1807+ // SQL returns the SQL string for a DESCRIBE statement (MySQL).
1808+ func (d * DescribeStatement ) SQL () string {
1809+ if d == nil {
1810+ return ""
1811+ }
1812+ return "DESCRIBE " + d .TableName
1813+ }
1814+
1815+ // SQL returns the SQL string for a REPLACE statement (MySQL).
1816+ func (r * ReplaceStatement ) SQL () string {
1817+ if r == nil {
1818+ return ""
1819+ }
1820+ sb := getBuilder ()
1821+ defer putBuilder (sb )
1822+ sb .WriteString ("REPLACE INTO " )
1823+ sb .WriteString (r .TableName )
1824+ if len (r .Columns ) > 0 {
1825+ sb .WriteString (" (" )
1826+ sb .WriteString (exprListSQL (r .Columns ))
1827+ sb .WriteString (")" )
1828+ }
1829+ if len (r .Values ) > 0 {
1830+ sb .WriteString (" VALUES " )
1831+ rows := make ([]string , len (r .Values ))
1832+ for idx , row := range r .Values {
1833+ vals := make ([]string , len (row ))
1834+ for j , v := range row {
1835+ vals [j ] = exprSQL (v )
1836+ }
1837+ rows [idx ] = "(" + strings .Join (vals , ", " ) + ")"
1838+ }
1839+ sb .WriteString (strings .Join (rows , ", " ))
1840+ }
1841+ return sb .String ()
1842+ }
1843+
17431844// ToSQL returns the SQL string for a CONNECT BY clause (MariaDB 10.2+).
17441845func (c * ConnectByClause ) ToSQL () string {
17451846 var b strings.Builder
0 commit comments