outerStatementOfCTE returns the portion of an uppercased query after all CTE definitions, or "" if the query doesn't start with WITH. For "WITH a AS (...) SELECT ...", it returns "SELECT ...".
(upper string)
| 1991 | strings.HasPrefix(s, "WITH") || |
| 1992 | strings.HasPrefix(s, "VALUES") || |
| 1993 | strings.HasPrefix(s, "TABLE") || |
| 1994 | strings.HasPrefix(s, "FROM") // DuckDB FROM-first syntax |
| 1995 | } |
| 1996 | |
| 1997 | // queryReturnsResults checks if a SQL query returns a result set. |
| 1998 | // This is used to determine whether to send RowDescription or NoData. |
| 1999 | func queryReturnsResults(query string) bool { |
| 2000 | upper := strings.ToUpper(stripLeadingNoise(query)) |
| 2001 | // SELECT is the most common |
| 2002 | if strings.HasPrefix(upper, "SELECT") { |
| 2003 | return true |
| 2004 | } |
| 2005 | // WITH ... SELECT (CTEs) |
| 2006 | if strings.HasPrefix(upper, "WITH") && (len(upper) == 4 || isWSChar(upper[4]) || upper[4] == '/' || upper[4] == '-') { |
| 2007 | return true |
| 2008 | } |
| 2009 | // VALUES clause returns rows |
| 2010 | if strings.HasPrefix(upper, "VALUES") { |
| 2011 | return true |
| 2012 | } |
| 2013 | // SHOW commands return results |
| 2014 | if strings.HasPrefix(upper, "SHOW") { |
| 2015 | return true |
| 2016 | } |
| 2017 | // TABLE is shorthand for SELECT * FROM table |
| 2018 | if strings.HasPrefix(upper, "TABLE") { |
| 2019 | return true |
| 2020 | } |
| 2021 | // EXECUTE can return results if the prepared statement is a SELECT |
| 2022 | if strings.HasPrefix(upper, "EXECUTE") { |
| 2023 | return true |
| 2024 | } |
| 2025 | // EXPLAIN returns results |
| 2026 | if strings.HasPrefix(upper, "EXPLAIN") { |
| 2027 | return true |
| 2028 | } |
| 2029 | // DESCRIBE returns results (DuckDB-specific) |
| 2030 | if strings.HasPrefix(upper, "DESCRIBE") { |
| 2031 | return true |
| 2032 | } |
| 2033 | // SUMMARIZE returns results (DuckDB-specific) |
| 2034 | if strings.HasPrefix(upper, "SUMMARIZE") { |
| 2035 | return true |
| 2036 | } |
| 2037 | // FROM-first syntax returns results (DuckDB-specific) |
| 2038 | if strings.HasPrefix(upper, "FROM") { |
| 2039 | return true |
| 2040 | } |
| 2041 | // DML with RETURNING clause produces result rows. |
| 2042 | // Check for RETURNING preceded by any whitespace (space, newline, tab). |
| 2043 | if (strings.HasPrefix(upper, "INSERT") || |
| 2044 | strings.HasPrefix(upper, "UPDATE") || |
| 2045 | strings.HasPrefix(upper, "DELETE")) && |
| 2046 | containsReturning(upper) { |
| 2047 | return true |
| 2048 | } |
| 2049 | return false |
| 2050 | } |
no test coverage detected