executor.go 68 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846
  1. package executor
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "sort"
  6. "strconv"
  7. "strings"
  8. "github.com/danfragoso/pizzasql-next/pkg/analyzer"
  9. "github.com/danfragoso/pizzasql-next/pkg/lexer"
  10. "github.com/danfragoso/pizzasql-next/pkg/parser"
  11. "github.com/danfragoso/pizzasql-next/pkg/storage"
  12. )
  13. // Executor executes SQL statements.
  14. type Executor struct {
  15. schema *storage.SchemaManager
  16. table *storage.TableManager
  17. analyzer *analyzer.Analyzer
  18. catalog *analyzer.Catalog
  19. // Multi-database support
  20. attachedDatabases map[string]*DatabaseConnection // alias -> connection
  21. currentDatabase string // current database alias (default is "main")
  22. // Transaction state
  23. inTransaction bool
  24. savepoints []string // stack of savepoint names
  25. txLog []txLogEntry // transaction log for rollback
  26. // Subquery context for correlated subqueries
  27. outerRow storage.Row
  28. }
  29. // DatabaseConnection represents an attached database.
  30. type DatabaseConnection struct {
  31. Alias string
  32. Path string // Database path or identifier
  33. Schema *storage.SchemaManager
  34. Table *storage.TableManager
  35. }
  36. // txLogEntry represents a transaction log entry for rollback support.
  37. type txLogEntry struct {
  38. operation string // "INSERT", "UPDATE", "DELETE"
  39. table string
  40. key string
  41. oldData storage.Row // for UPDATE/DELETE, the original row data
  42. }
  43. // New creates a new executor.
  44. func New(schema *storage.SchemaManager, table *storage.TableManager) *Executor {
  45. catalog := analyzer.NewCatalog()
  46. executor := &Executor{
  47. schema: schema,
  48. table: table,
  49. analyzer: analyzer.New(catalog),
  50. catalog: catalog,
  51. attachedDatabases: make(map[string]*DatabaseConnection),
  52. currentDatabase: "main",
  53. }
  54. // Register the main database
  55. executor.attachedDatabases["main"] = &DatabaseConnection{
  56. Alias: "main",
  57. Path: schema.GetDatabaseName(),
  58. Schema: schema,
  59. Table: table,
  60. }
  61. return executor
  62. }
  63. // SyncCatalog synchronizes the analyzer catalog with the storage schema.
  64. func (e *Executor) SyncCatalog() error {
  65. tables, err := e.schema.ListTables()
  66. if err != nil {
  67. return err
  68. }
  69. for _, tableName := range tables {
  70. schema, err := e.schema.GetSchema(tableName)
  71. if err != nil {
  72. continue
  73. }
  74. // Drop table from catalog if it exists, then recreate with updated schema
  75. e.catalog.DropTable(tableName)
  76. e.catalog.CreateTable(schema.ToAnalyzerTableInfo())
  77. }
  78. return nil
  79. }
  80. // Execute executes a SQL statement.
  81. func (e *Executor) Execute(stmt parser.Statement) (*Result, error) {
  82. // PRAGMA doesn't need analysis
  83. if pragma, ok := stmt.(*parser.PragmaStmt); ok {
  84. return e.executePragma(pragma)
  85. }
  86. // EXPLAIN doesn't need analysis
  87. if explain, ok := stmt.(*parser.ExplainStmt); ok {
  88. return e.executeExplain(explain)
  89. }
  90. // Transaction statements don't need analysis
  91. switch s := stmt.(type) {
  92. case *parser.BeginStmt:
  93. return e.executeBegin(s)
  94. case *parser.CommitStmt:
  95. return e.executeCommit(s)
  96. case *parser.RollbackStmt:
  97. return e.executeRollback(s)
  98. case *parser.SavepointStmt:
  99. return e.executeSavepoint(s)
  100. case *parser.ReleaseStmt:
  101. return e.executeRelease(s)
  102. case *parser.CreateIndexStmt:
  103. return e.executeCreateIndex(s)
  104. case *parser.DropIndexStmt:
  105. return e.executeDropIndex(s)
  106. case *parser.AttachStmt:
  107. return e.executeAttach(s)
  108. case *parser.DetachStmt:
  109. return e.executeDetach(s)
  110. }
  111. // Analyze first — create a fresh analyzer per call so concurrent requests
  112. // don't share mutable scope state (e.analyzer.scope would race otherwise).
  113. a := analyzer.New(e.catalog)
  114. if err := a.Analyze(stmt); err != nil {
  115. return nil, err
  116. }
  117. switch s := stmt.(type) {
  118. case *parser.SelectStmt:
  119. return e.executeSelect(s)
  120. case *parser.InsertStmt:
  121. return e.executeInsert(s)
  122. case *parser.UpdateStmt:
  123. return e.executeUpdate(s)
  124. case *parser.DeleteStmt:
  125. return e.executeDelete(s)
  126. case *parser.CreateTableStmt:
  127. return e.executeCreateTable(s)
  128. case *parser.DropTableStmt:
  129. return e.executeDropTable(s)
  130. case *parser.CreateIndexStmt:
  131. return e.executeCreateIndex(s)
  132. case *parser.DropIndexStmt:
  133. return e.executeDropIndex(s)
  134. case *parser.AlterTableStmt:
  135. return e.executeAlterTable(s)
  136. default:
  137. return nil, fmt.Errorf("unsupported statement type: %T", stmt)
  138. }
  139. }
  140. // executeSelect executes a SELECT statement.
  141. func (e *Executor) executeSelect(stmt *parser.SelectStmt) (*Result, error) {
  142. if len(stmt.From) == 0 {
  143. // SELECT without FROM (e.g., SELECT 1+1)
  144. return e.executeSelectExpr(stmt)
  145. }
  146. // Check if FROM clause is a subquery (derived table)
  147. if stmt.From[0].Subquery != nil {
  148. return e.executeSelectFromSubquery(stmt)
  149. }
  150. tableName := stmt.From[0].Name
  151. schema, err := e.schema.GetSchema(tableName)
  152. if err != nil {
  153. return nil, err
  154. }
  155. // Try to use index for WHERE clause
  156. var rows []storage.Row
  157. usedIndex := false
  158. if stmt.Where != nil {
  159. // Check if we can use an index
  160. colName, colValue, isEquality := e.extractIndexableCondition(stmt.Where)
  161. if isEquality {
  162. // Look for an index on this column
  163. indexes, _ := e.schema.ListTableIndexes(tableName)
  164. for _, idx := range indexes {
  165. if len(idx.Columns) == 1 && strings.EqualFold(idx.Columns[0].Name, colName) {
  166. // Use this index
  167. rows, err = e.table.SelectByIndex(tableName, idx.Name, colValue)
  168. if err == nil {
  169. usedIndex = true
  170. }
  171. break
  172. }
  173. }
  174. }
  175. }
  176. // Fall back to full table scan if no index used
  177. if !usedIndex {
  178. // Build filter function from WHERE clause
  179. // Only use filter during scan if there's NO alias (otherwise the filter won't have the right column names)
  180. var filter func(storage.Row) bool
  181. if stmt.Where != nil && stmt.From[0].Alias == "" {
  182. filter = func(row storage.Row) bool {
  183. val, err := e.evalExpr(stmt.Where, row)
  184. if err != nil {
  185. return false
  186. }
  187. return toBool(val)
  188. }
  189. }
  190. rows, err = e.table.Select(tableName, filter)
  191. }
  192. if err != nil {
  193. return nil, err
  194. }
  195. // Add table alias to rows if there's an explicit alias
  196. // This needs to happen BEFORE filtering so that the WHERE clause can reference the alias
  197. if stmt.From[0].Alias != "" {
  198. for i := range rows {
  199. rows[i] = e.addTableAlias(rows[i], stmt.From[0].Alias)
  200. }
  201. }
  202. // Apply WHERE clause filter if we have an alias (we couldn't filter during scan)
  203. if stmt.Where != nil && stmt.From[0].Alias != "" {
  204. var filtered []storage.Row
  205. for _, row := range rows {
  206. val, err := e.evalExpr(stmt.Where, row)
  207. if err != nil {
  208. continue // Skip rows that error
  209. }
  210. if toBool(val) {
  211. filtered = append(filtered, row)
  212. }
  213. }
  214. rows = filtered
  215. }
  216. // Handle JOINs
  217. if len(stmt.From) > 0 && stmt.From[0].Join != nil {
  218. rows, err = e.executeJoins(stmt.From[0], rows)
  219. if err != nil {
  220. return nil, err
  221. }
  222. }
  223. // Handle GROUP BY
  224. if len(stmt.GroupBy) > 0 {
  225. return e.executeGroupBy(stmt, rows, schema)
  226. }
  227. // Check for aggregate functions without GROUP BY
  228. hasAggregate := e.hasAggregates(stmt.Columns)
  229. if hasAggregate {
  230. return e.executeAggregateSelect(stmt, rows, schema)
  231. }
  232. // Apply ORDER BY
  233. if len(stmt.OrderBy) > 0 {
  234. e.sortRows(rows, stmt.OrderBy)
  235. }
  236. // Apply LIMIT/OFFSET
  237. if stmt.Offset != nil {
  238. offset := e.evalIntExpr(stmt.Offset)
  239. if offset < len(rows) {
  240. rows = rows[offset:]
  241. } else {
  242. rows = nil
  243. }
  244. }
  245. if stmt.Limit != nil {
  246. limit := e.evalIntExpr(stmt.Limit)
  247. if limit < len(rows) {
  248. rows = rows[:limit]
  249. }
  250. }
  251. // Build result
  252. result := NewResult("SELECT")
  253. // Determine columns
  254. for i, col := range stmt.Columns {
  255. if col.Alias != "" {
  256. result.AddColumn(col.Alias)
  257. } else if ref, ok := col.Expr.(*parser.ColumnRef); ok {
  258. result.AddColumn(ref.Column)
  259. } else if col.Star {
  260. // Handle SELECT * - add all columns from schema
  261. for _, c := range schema.Columns {
  262. result.AddColumn(c.Name)
  263. }
  264. } else {
  265. result.AddColumn(fmt.Sprintf("column%d", i+1))
  266. }
  267. }
  268. // Add rows - evaluate each select expression
  269. for _, row := range rows {
  270. values := make([]interface{}, 0)
  271. for _, col := range stmt.Columns {
  272. if col.Star {
  273. // For SELECT *, add all columns in order
  274. for _, c := range schema.Columns {
  275. if storage.IsRowIDColumn(c.Name) {
  276. values = append(values, row["_rowid_"])
  277. } else {
  278. values = append(values, row[c.Name])
  279. }
  280. }
  281. } else {
  282. // Evaluate the expression
  283. val, err := e.evalExpr(col.Expr, row)
  284. if err != nil {
  285. return nil, err
  286. }
  287. values = append(values, val)
  288. }
  289. }
  290. result.AddRow(values...)
  291. }
  292. // Apply DISTINCT if specified
  293. if stmt.Distinct {
  294. result.Rows = e.applyDistinct(result.Rows)
  295. }
  296. return result, nil
  297. }
  298. // executeSelectExpr executes a SELECT without FROM.
  299. func (e *Executor) executeSelectExpr(stmt *parser.SelectStmt) (*Result, error) {
  300. result := NewResult("SELECT")
  301. // Determine columns
  302. for i, col := range stmt.Columns {
  303. if col.Alias != "" {
  304. result.AddColumn(col.Alias)
  305. } else {
  306. result.AddColumn(fmt.Sprintf("column%d", i+1))
  307. }
  308. }
  309. // Evaluate expressions
  310. values := make([]interface{}, len(stmt.Columns))
  311. for i, col := range stmt.Columns {
  312. val, err := e.evalExpr(col.Expr, nil)
  313. if err != nil {
  314. return nil, err
  315. }
  316. values[i] = val
  317. }
  318. result.AddRow(values...)
  319. return result, nil
  320. }
  321. // executeSelectFromSubquery executes a SELECT with a subquery in FROM clause.
  322. func (e *Executor) executeSelectFromSubquery(stmt *parser.SelectStmt) (*Result, error) {
  323. // Execute the subquery to get the derived table
  324. subqueryResult, err := e.executeSelect(stmt.From[0].Subquery)
  325. if err != nil {
  326. return nil, fmt.Errorf("subquery error: %w", err)
  327. }
  328. // Convert subquery result to rows for further processing
  329. derivedRows := make([]storage.Row, 0, subqueryResult.RowCount)
  330. for _, rowValues := range subqueryResult.Rows {
  331. row := make(storage.Row)
  332. for i, col := range subqueryResult.Columns {
  333. row[col] = rowValues[i]
  334. }
  335. derivedRows = append(derivedRows, row)
  336. }
  337. // Handle JOINs if present
  338. if stmt.From[0].Join != nil {
  339. derivedRows, err = e.executeJoin(stmt.From[0], derivedRows)
  340. if err != nil {
  341. return nil, err
  342. }
  343. }
  344. // Apply WHERE clause on derived table
  345. if stmt.Where != nil {
  346. filteredRows := make([]storage.Row, 0)
  347. for _, row := range derivedRows {
  348. val, err := e.evalExpr(stmt.Where, row)
  349. if err != nil {
  350. continue
  351. }
  352. if toBool(val) {
  353. filteredRows = append(filteredRows, row)
  354. }
  355. }
  356. derivedRows = filteredRows
  357. }
  358. // Handle GROUP BY
  359. if len(stmt.GroupBy) > 0 {
  360. // Create a temporary schema from subquery columns
  361. tempSchema := &storage.Schema{
  362. Name: "derived",
  363. Columns: make([]storage.Column, len(subqueryResult.Columns)),
  364. }
  365. for i, col := range subqueryResult.Columns {
  366. tempSchema.Columns[i] = storage.Column{
  367. Name: col,
  368. Type: "ANY",
  369. }
  370. }
  371. return e.executeGroupBy(stmt, derivedRows, tempSchema)
  372. }
  373. // Check for aggregate functions without GROUP BY
  374. hasAggregate := e.hasAggregates(stmt.Columns)
  375. if hasAggregate {
  376. tempSchema := &storage.Schema{
  377. Name: "derived",
  378. Columns: make([]storage.Column, len(subqueryResult.Columns)),
  379. }
  380. for i, col := range subqueryResult.Columns {
  381. tempSchema.Columns[i] = storage.Column{
  382. Name: col,
  383. Type: "ANY",
  384. }
  385. }
  386. return e.executeAggregateSelect(stmt, derivedRows, tempSchema)
  387. }
  388. // Apply ORDER BY
  389. if len(stmt.OrderBy) > 0 {
  390. e.sortRows(derivedRows, stmt.OrderBy)
  391. }
  392. // Apply LIMIT/OFFSET
  393. if stmt.Offset != nil {
  394. offset := e.evalIntExpr(stmt.Offset)
  395. if offset < len(derivedRows) {
  396. derivedRows = derivedRows[offset:]
  397. } else {
  398. derivedRows = nil
  399. }
  400. }
  401. if stmt.Limit != nil {
  402. limit := e.evalIntExpr(stmt.Limit)
  403. if limit < len(derivedRows) {
  404. derivedRows = derivedRows[:limit]
  405. }
  406. }
  407. // Build result
  408. result := NewResult("SELECT")
  409. // Determine output columns
  410. if stmt.Columns[0].Star {
  411. // SELECT * from derived table
  412. for _, col := range subqueryResult.Columns {
  413. result.AddColumn(col)
  414. }
  415. } else {
  416. // Specific columns
  417. for _, col := range stmt.Columns {
  418. if col.Alias != "" {
  419. result.AddColumn(col.Alias)
  420. } else if colRef, ok := col.Expr.(*parser.ColumnRef); ok {
  421. result.AddColumn(colRef.Column)
  422. } else {
  423. result.AddColumn("column")
  424. }
  425. }
  426. }
  427. // Add rows
  428. for _, row := range derivedRows {
  429. if stmt.Columns[0].Star {
  430. // SELECT * - use all columns
  431. values := make([]interface{}, len(subqueryResult.Columns))
  432. for i, col := range subqueryResult.Columns {
  433. values[i] = row[col]
  434. }
  435. result.AddRow(values...)
  436. } else {
  437. // Specific columns - evaluate expressions
  438. values := make([]interface{}, len(stmt.Columns))
  439. for i, col := range stmt.Columns {
  440. val, err := e.evalExpr(col.Expr, row)
  441. if err != nil {
  442. return nil, err
  443. }
  444. values[i] = val
  445. }
  446. result.AddRow(values...)
  447. }
  448. }
  449. return result, nil
  450. }
  451. // executeAggregateSelect executes a SELECT with aggregate functions.
  452. func (e *Executor) executeAggregateSelect(stmt *parser.SelectStmt, rows []storage.Row, schema *storage.Schema) (*Result, error) {
  453. result := NewResult("SELECT")
  454. // Determine columns and evaluate aggregates
  455. for i, col := range stmt.Columns {
  456. if col.Alias != "" {
  457. result.AddColumn(col.Alias)
  458. } else if col.Star {
  459. result.AddColumn("*")
  460. } else {
  461. result.AddColumn(fmt.Sprintf("column%d", i+1))
  462. }
  463. }
  464. // Calculate values
  465. values := make([]interface{}, len(stmt.Columns))
  466. for i, col := range stmt.Columns {
  467. val, err := e.evalAggregateExpr(col.Expr, rows)
  468. if err != nil {
  469. return nil, err
  470. }
  471. values[i] = val
  472. }
  473. result.AddRow(values...)
  474. return result, nil
  475. }
  476. // executeGroupBy executes a GROUP BY query.
  477. func (e *Executor) executeGroupBy(stmt *parser.SelectStmt, rows []storage.Row, schema *storage.Schema) (*Result, error) {
  478. // Group rows
  479. groups := make(map[string][]storage.Row)
  480. for _, row := range rows {
  481. key := e.buildGroupKey(stmt.GroupBy, row)
  482. groups[key] = append(groups[key], row)
  483. }
  484. result := NewResult("SELECT")
  485. // Determine columns
  486. columnNames := make([]string, len(stmt.Columns))
  487. for i, col := range stmt.Columns {
  488. if col.Alias != "" {
  489. columnNames[i] = col.Alias
  490. result.AddColumn(col.Alias)
  491. } else if ref, ok := col.Expr.(*parser.ColumnRef); ok {
  492. columnNames[i] = ref.Column
  493. result.AddColumn(ref.Column)
  494. } else {
  495. columnNames[i] = fmt.Sprintf("column%d", i+1)
  496. result.AddColumn(columnNames[i])
  497. }
  498. }
  499. // Process each group
  500. for _, groupRows := range groups {
  501. // Apply HAVING
  502. if stmt.Having != nil {
  503. val, err := e.evalAggregateExpr(stmt.Having, groupRows)
  504. if err != nil {
  505. continue
  506. }
  507. if !toBool(val) {
  508. continue
  509. }
  510. }
  511. values := make([]interface{}, len(stmt.Columns))
  512. for i, col := range stmt.Columns {
  513. if e.isAggregate(col.Expr) {
  514. val, err := e.evalAggregateExpr(col.Expr, groupRows)
  515. if err != nil {
  516. return nil, err
  517. }
  518. values[i] = val
  519. } else {
  520. // Use first row's value for non-aggregate columns
  521. val, err := e.evalExpr(col.Expr, groupRows[0])
  522. if err != nil {
  523. return nil, err
  524. }
  525. values[i] = val
  526. }
  527. }
  528. result.AddRow(values...)
  529. }
  530. // Apply ORDER BY
  531. if len(stmt.OrderBy) > 0 {
  532. e.sortResultRows(result, stmt.OrderBy, stmt.Columns, columnNames)
  533. }
  534. // Apply LIMIT/OFFSET
  535. if stmt.Offset != nil {
  536. offset := e.evalIntExpr(stmt.Offset)
  537. if offset < len(result.Rows) {
  538. result.Rows = result.Rows[offset:]
  539. } else {
  540. result.Rows = nil
  541. }
  542. result.RowCount = len(result.Rows)
  543. }
  544. if stmt.Limit != nil {
  545. limit := e.evalIntExpr(stmt.Limit)
  546. if limit < len(result.Rows) {
  547. result.Rows = result.Rows[:limit]
  548. }
  549. result.RowCount = len(result.Rows)
  550. }
  551. return result, nil
  552. }
  553. // executeJoins recursively processes all JOIN clauses in a table reference.
  554. func (e *Executor) executeJoins(tableRef parser.TableRef, leftRows []storage.Row) ([]storage.Row, error) {
  555. if tableRef.Join == nil || tableRef.Join.Table == nil {
  556. return leftRows, nil
  557. }
  558. // Get the right table name and its data
  559. rightTableRef := tableRef.Join.Table
  560. rightTable := rightTableRef.Name
  561. rightRows, err := e.table.Select(rightTable, nil)
  562. if err != nil {
  563. return nil, err
  564. }
  565. // Perform the join between left and right
  566. var result []storage.Row
  567. leftTableName := tableRef.Name
  568. leftAlias := tableRef.Alias
  569. rightAlias := rightTableRef.Alias
  570. // If leftAlias is empty, use the table name
  571. if leftAlias == "" {
  572. leftAlias = leftTableName
  573. }
  574. if rightAlias == "" {
  575. rightAlias = rightTable
  576. }
  577. switch tableRef.Join.Type {
  578. case parser.JoinInner:
  579. for _, left := range leftRows {
  580. for _, right := range rightRows {
  581. merged := e.mergeRows(left, right, leftAlias, rightAlias)
  582. if tableRef.Join.Condition != nil {
  583. match, _ := e.evalExpr(tableRef.Join.Condition, merged)
  584. if toBool(match) {
  585. result = append(result, merged)
  586. }
  587. } else {
  588. result = append(result, merged)
  589. }
  590. }
  591. }
  592. case parser.JoinLeft:
  593. for _, left := range leftRows {
  594. matched := false
  595. for _, right := range rightRows {
  596. merged := e.mergeRows(left, right, leftAlias, rightAlias)
  597. if tableRef.Join.Condition != nil {
  598. match, _ := e.evalExpr(tableRef.Join.Condition, merged)
  599. if toBool(match) {
  600. result = append(result, merged)
  601. matched = true
  602. }
  603. }
  604. }
  605. if !matched {
  606. // Add left row with nulls for right
  607. result = append(result, left)
  608. }
  609. }
  610. case parser.JoinCross:
  611. for _, left := range leftRows {
  612. for _, right := range rightRows {
  613. result = append(result, e.mergeRows(left, right, leftAlias, rightAlias))
  614. }
  615. }
  616. }
  617. // Recursively process any additional joins
  618. if rightTableRef.Join != nil {
  619. return e.executeJoins(*rightTableRef, result)
  620. }
  621. return result, nil
  622. }
  623. // executeJoin executes a JOIN operation.
  624. func (e *Executor) executeJoin(tableRef parser.TableRef, leftRows []storage.Row) ([]storage.Row, error) {
  625. join := tableRef.Join
  626. if join == nil || join.Table == nil {
  627. return leftRows, nil
  628. }
  629. rightTable := join.Table.Name
  630. rightRows, err := e.table.Select(rightTable, nil)
  631. if err != nil {
  632. return nil, err
  633. }
  634. var result []storage.Row
  635. switch join.Type {
  636. case parser.JoinInner:
  637. for _, left := range leftRows {
  638. for _, right := range rightRows {
  639. merged := e.mergeRows(left, right, tableRef.Alias, join.Table.Alias)
  640. if join.Condition != nil {
  641. match, _ := e.evalExpr(join.Condition, merged)
  642. if toBool(match) {
  643. result = append(result, merged)
  644. }
  645. } else {
  646. result = append(result, merged)
  647. }
  648. }
  649. }
  650. case parser.JoinLeft:
  651. for _, left := range leftRows {
  652. matched := false
  653. for _, right := range rightRows {
  654. merged := e.mergeRows(left, right, tableRef.Alias, join.Table.Alias)
  655. if join.Condition != nil {
  656. match, _ := e.evalExpr(join.Condition, merged)
  657. if toBool(match) {
  658. result = append(result, merged)
  659. matched = true
  660. }
  661. }
  662. }
  663. if !matched {
  664. // Add left row with nulls for right
  665. result = append(result, left)
  666. }
  667. }
  668. case parser.JoinCross:
  669. for _, left := range leftRows {
  670. for _, right := range rightRows {
  671. result = append(result, e.mergeRows(left, right, tableRef.Alias, join.Table.Alias))
  672. }
  673. }
  674. }
  675. return result, nil
  676. }
  677. // mergeRows merges two rows with optional table aliases.
  678. func (e *Executor) mergeRows(left, right storage.Row, leftAlias, rightAlias string) storage.Row {
  679. result := make(storage.Row)
  680. for k, v := range left {
  681. // Copy the key as-is (it might already be qualified)
  682. result[k] = v
  683. // Only add qualified name if the key is NOT already qualified and we have an alias
  684. if leftAlias != "" && !strings.Contains(k, ".") {
  685. result[leftAlias+"."+k] = v
  686. }
  687. }
  688. for k, v := range right {
  689. // For unqualified names, only add if they don't already exist
  690. // This prevents right table columns from overwriting left table columns
  691. if !strings.Contains(k, ".") {
  692. if _, exists := result[k]; !exists {
  693. result[k] = v
  694. }
  695. // Add qualified name for right table
  696. if rightAlias != "" {
  697. result[rightAlias+"."+k] = v
  698. }
  699. } else {
  700. // Already qualified, just copy it
  701. result[k] = v
  702. }
  703. }
  704. return result
  705. }
  706. // addTableAlias adds table-qualified names to a row.
  707. func (e *Executor) addTableAlias(row storage.Row, alias string) storage.Row {
  708. result := make(storage.Row)
  709. for k, v := range row {
  710. result[k] = v
  711. // Don't add alias to already-qualified names
  712. if !strings.Contains(k, ".") {
  713. result[alias+"."+k] = v
  714. }
  715. }
  716. return result
  717. }
  718. // executeInsert executes an INSERT statement.
  719. func (e *Executor) executeInsert(stmt *parser.InsertStmt) (*Result, error) {
  720. tableName := stmt.Table.Name
  721. schema, err := e.schema.GetSchema(tableName)
  722. if err != nil {
  723. return nil, err
  724. }
  725. count := 0
  726. for _, values := range stmt.Values {
  727. row := make(storage.Row)
  728. if len(stmt.Columns) > 0 {
  729. // Named columns
  730. for i, col := range stmt.Columns {
  731. if i < len(values) {
  732. val, err := e.evalExpr(values[i], nil)
  733. if err != nil {
  734. return nil, err
  735. }
  736. row[col] = val
  737. }
  738. }
  739. } else {
  740. // All columns in order
  741. for i, col := range schema.Columns {
  742. if i < len(values) {
  743. val, err := e.evalExpr(values[i], nil)
  744. if err != nil {
  745. return nil, err
  746. }
  747. row[col.Name] = val
  748. }
  749. }
  750. }
  751. err := e.table.Insert(tableName, row)
  752. if err != nil {
  753. // Handle conflict based on OnConflict action
  754. if strings.Contains(err.Error(), "duplicate") {
  755. switch stmt.OnConflict {
  756. case parser.ConflictIgnore:
  757. // Silently ignore the duplicate
  758. continue
  759. case parser.ConflictReplace:
  760. // Delete existing row and insert new one
  761. pkValue := row[schema.PrimaryKey]
  762. if pkValue != nil {
  763. e.table.Delete(tableName, func(r storage.Row) bool {
  764. return fmt.Sprintf("%v", r[schema.PrimaryKey]) == fmt.Sprintf("%v", pkValue)
  765. })
  766. // Try insert again
  767. if err := e.table.Insert(tableName, row); err != nil {
  768. return nil, err
  769. }
  770. }
  771. case parser.ConflictAbort, parser.ConflictFail:
  772. return nil, err
  773. case parser.ConflictRollback:
  774. // In a real implementation, this would rollback the transaction
  775. return nil, err
  776. default:
  777. return nil, err
  778. }
  779. } else {
  780. return nil, err
  781. }
  782. }
  783. count++
  784. }
  785. result := NewResult("INSERT")
  786. result.SetRowCount(count)
  787. return result, nil
  788. }
  789. // executeUpdate executes an UPDATE statement.
  790. func (e *Executor) executeUpdate(stmt *parser.UpdateStmt) (*Result, error) {
  791. tableName := stmt.Table.Name
  792. // Build filter
  793. var filter func(storage.Row) bool
  794. if stmt.Where != nil {
  795. filter = func(row storage.Row) bool {
  796. val, err := e.evalExpr(stmt.Where, row)
  797. if err != nil {
  798. return false
  799. }
  800. return toBool(val)
  801. }
  802. }
  803. // Use UpdateFunc to evaluate expressions per-row (supports self-referencing like balance = balance + 100)
  804. updateFn := func(row storage.Row) (storage.Row, error) {
  805. updates := make(storage.Row)
  806. for _, assign := range stmt.Set {
  807. val, err := e.evalExpr(assign.Value, row)
  808. if err != nil {
  809. return nil, err
  810. }
  811. updates[assign.Column] = val
  812. }
  813. return updates, nil
  814. }
  815. count, err := e.table.UpdateFunc(tableName, updateFn, filter)
  816. if err != nil {
  817. return nil, err
  818. }
  819. result := NewResult("UPDATE")
  820. result.SetRowCount(count)
  821. return result, nil
  822. }
  823. // executeDelete executes a DELETE statement.
  824. func (e *Executor) executeDelete(stmt *parser.DeleteStmt) (*Result, error) {
  825. tableName := stmt.Table.Name
  826. // Build filter
  827. var filter func(storage.Row) bool
  828. if stmt.Where != nil {
  829. filter = func(row storage.Row) bool {
  830. val, err := e.evalExpr(stmt.Where, row)
  831. if err != nil {
  832. return false
  833. }
  834. return toBool(val)
  835. }
  836. }
  837. count, err := e.table.Delete(tableName, filter)
  838. if err != nil {
  839. return nil, err
  840. }
  841. result := NewResult("DELETE")
  842. result.SetRowCount(count)
  843. return result, nil
  844. }
  845. // executeCreateTable executes a CREATE TABLE statement.
  846. func (e *Executor) executeCreateTable(stmt *parser.CreateTableStmt) (*Result, error) {
  847. // Check if exists
  848. if e.schema.TableExists(stmt.Table.Name) {
  849. if stmt.IfNotExists {
  850. result := NewResult("CREATE TABLE")
  851. return result, nil
  852. }
  853. return nil, fmt.Errorf("table already exists: %s", stmt.Table.Name)
  854. }
  855. // Build schema
  856. schema := &storage.Schema{
  857. Name: stmt.Table.Name,
  858. }
  859. for _, colDef := range stmt.Columns {
  860. col := storage.Column{
  861. Name: colDef.Name,
  862. Type: colDef.Type.Name,
  863. Nullable: true,
  864. }
  865. for _, constraint := range colDef.Constraints {
  866. switch constraint.Type {
  867. case parser.ConstraintPrimaryKey:
  868. col.PrimaryKey = true
  869. col.Nullable = false
  870. schema.PrimaryKey = col.Name
  871. case parser.ConstraintNotNull:
  872. col.Nullable = false
  873. case parser.ConstraintDefault:
  874. if constraint.Default != nil {
  875. val, _ := e.evalExpr(constraint.Default, nil)
  876. col.Default = val
  877. }
  878. case parser.ConstraintAutoIncrement:
  879. schema.AutoIncrement = true
  880. }
  881. }
  882. schema.Columns = append(schema.Columns, col)
  883. }
  884. // Handle table-level constraints
  885. for _, constraint := range stmt.Constraints {
  886. if constraint.Type == parser.ConstraintPrimaryKey && len(constraint.Columns) > 0 {
  887. schema.PrimaryKey = constraint.Columns[0]
  888. for i := range schema.Columns {
  889. if strings.EqualFold(schema.Columns[i].Name, schema.PrimaryKey) {
  890. schema.Columns[i].PrimaryKey = true
  891. schema.Columns[i].Nullable = false
  892. }
  893. }
  894. }
  895. }
  896. if err := e.schema.CreateTable(schema); err != nil {
  897. return nil, err
  898. }
  899. // Update analyzer catalog
  900. e.catalog.CreateTable(schema.ToAnalyzerTableInfo())
  901. result := NewResult("CREATE TABLE")
  902. return result, nil
  903. }
  904. // executeDropTable executes a DROP TABLE statement.
  905. func (e *Executor) executeDropTable(stmt *parser.DropTableStmt) (*Result, error) {
  906. for _, tableRef := range stmt.Tables {
  907. if !e.schema.TableExists(tableRef.Name) {
  908. if stmt.IfExists {
  909. continue
  910. }
  911. return nil, fmt.Errorf("table not found: %s", tableRef.Name)
  912. }
  913. // First, drop all indexes associated with this table
  914. indexes, _ := e.schema.ListTableIndexes(tableRef.Name)
  915. for _, idx := range indexes {
  916. // Clear index entries
  917. columns := make([]string, len(idx.Columns))
  918. for i, col := range idx.Columns {
  919. columns[i] = col.Name
  920. }
  921. e.table.ClearIndex(idx.Name, tableRef.Name, columns)
  922. // Drop the index schema
  923. e.schema.DropIndex(idx.Name)
  924. }
  925. // Then, truncate all data rows
  926. e.table.Truncate(tableRef.Name)
  927. // Finally, drop the table schema
  928. if err := e.schema.DropTable(tableRef.Name); err != nil {
  929. return nil, err
  930. }
  931. // Update analyzer catalog
  932. e.catalog.DropTable(tableRef.Name)
  933. }
  934. result := NewResult("DROP TABLE")
  935. return result, nil
  936. }
  937. // executeCreateIndex creates a new index.
  938. func (e *Executor) executeCreateIndex(stmt *parser.CreateIndexStmt) (*Result, error) {
  939. // Check if index already exists
  940. if e.schema.IndexExists(stmt.Name) {
  941. if stmt.IfNotExists {
  942. result := NewResult("CREATE INDEX")
  943. return result, nil
  944. }
  945. return nil, fmt.Errorf("index already exists: %s", stmt.Name)
  946. }
  947. // Verify table exists
  948. if !e.schema.TableExists(stmt.Table) {
  949. return nil, fmt.Errorf("table not found: %s", stmt.Table)
  950. }
  951. // Verify columns exist
  952. schema, err := e.schema.GetSchema(stmt.Table)
  953. if err != nil {
  954. return nil, err
  955. }
  956. for _, col := range stmt.Columns {
  957. if _, found := schema.GetColumn(col.Name); !found {
  958. return nil, fmt.Errorf("column not found: %s", col.Name)
  959. }
  960. }
  961. // Create storage index
  962. index := &storage.Index{
  963. Name: stmt.Name,
  964. Table: stmt.Table,
  965. Unique: stmt.Unique,
  966. }
  967. for _, col := range stmt.Columns {
  968. index.Columns = append(index.Columns, storage.IndexColumn{
  969. Name: col.Name,
  970. Desc: col.Desc,
  971. })
  972. }
  973. if err := e.schema.CreateIndex(index); err != nil {
  974. return nil, err
  975. }
  976. // Build index entries for existing rows
  977. columns := make([]string, len(stmt.Columns))
  978. for i, col := range stmt.Columns {
  979. columns[i] = col.Name
  980. }
  981. if err := e.table.BuildIndex(stmt.Name, stmt.Table, columns); err != nil {
  982. // Rollback index creation on failure
  983. e.schema.DropIndex(stmt.Name)
  984. return nil, fmt.Errorf("failed to build index: %w", err)
  985. }
  986. result := NewResult("CREATE INDEX")
  987. return result, nil
  988. }
  989. // executeDropIndex drops an index.
  990. func (e *Executor) executeDropIndex(stmt *parser.DropIndexStmt) (*Result, error) {
  991. if !e.schema.IndexExists(stmt.Name) {
  992. if stmt.IfExists {
  993. result := NewResult("DROP INDEX")
  994. return result, nil
  995. }
  996. return nil, fmt.Errorf("index not found: %s", stmt.Name)
  997. }
  998. // Get index info to clear entries
  999. index, err := e.schema.GetIndex(stmt.Name)
  1000. if err == nil && index != nil {
  1001. columns := make([]string, len(index.Columns))
  1002. for i, col := range index.Columns {
  1003. columns[i] = col.Name
  1004. }
  1005. e.table.ClearIndex(stmt.Name, index.Table, columns)
  1006. }
  1007. if err := e.schema.DropIndex(stmt.Name); err != nil {
  1008. return nil, err
  1009. }
  1010. result := NewResult("DROP INDEX")
  1011. return result, nil
  1012. }
  1013. // executeAlterTable executes an ALTER TABLE statement.
  1014. func (e *Executor) executeAlterTable(stmt *parser.AlterTableStmt) (*Result, error) {
  1015. switch action := stmt.Action.(type) {
  1016. case *parser.AddColumnAction:
  1017. return e.executeAlterTableAddColumn(stmt.Table, action)
  1018. case *parser.DropColumnAction:
  1019. return e.executeAlterTableDropColumn(stmt.Table, action)
  1020. case *parser.RenameTableAction:
  1021. return e.executeAlterTableRename(stmt.Table, action)
  1022. case *parser.RenameColumnAction:
  1023. return e.executeAlterTableRenameColumn(stmt.Table, action)
  1024. default:
  1025. return nil, fmt.Errorf("unsupported ALTER TABLE action: %T", action)
  1026. }
  1027. }
  1028. // executeAlterTableAddColumn adds a column to a table.
  1029. func (e *Executor) executeAlterTableAddColumn(table string, action *parser.AddColumnAction) (*Result, error) {
  1030. col := storage.Column{
  1031. Name: action.Column.Name,
  1032. Type: action.Column.Type.Name,
  1033. Nullable: true,
  1034. }
  1035. // Process column constraints
  1036. for _, constraint := range action.Column.Constraints {
  1037. switch constraint.Type {
  1038. case parser.ConstraintPrimaryKey:
  1039. col.PrimaryKey = true
  1040. col.Nullable = false
  1041. case parser.ConstraintNotNull:
  1042. col.Nullable = false
  1043. case parser.ConstraintDefault:
  1044. if constraint.Default != nil {
  1045. val, _ := e.evalExpr(constraint.Default, nil)
  1046. col.Default = val
  1047. }
  1048. }
  1049. }
  1050. if err := e.schema.AddColumn(table, col); err != nil {
  1051. return nil, err
  1052. }
  1053. // Update catalog
  1054. e.SyncCatalog()
  1055. result := NewResult("ALTER TABLE")
  1056. return result, nil
  1057. }
  1058. // executeAlterTableDropColumn drops a column from a table.
  1059. func (e *Executor) executeAlterTableDropColumn(table string, action *parser.DropColumnAction) (*Result, error) {
  1060. if err := e.schema.DropColumn(table, action.Column); err != nil {
  1061. return nil, err
  1062. }
  1063. // Update catalog
  1064. e.SyncCatalog()
  1065. result := NewResult("ALTER TABLE")
  1066. return result, nil
  1067. }
  1068. // executeAlterTableRename renames a table.
  1069. func (e *Executor) executeAlterTableRename(table string, action *parser.RenameTableAction) (*Result, error) {
  1070. if err := e.schema.RenameTable(table, action.NewName); err != nil {
  1071. return nil, err
  1072. }
  1073. // Update catalog
  1074. e.SyncCatalog()
  1075. result := NewResult("ALTER TABLE")
  1076. return result, nil
  1077. }
  1078. // executeAlterTableRenameColumn renames a column.
  1079. func (e *Executor) executeAlterTableRenameColumn(table string, action *parser.RenameColumnAction) (*Result, error) {
  1080. if err := e.schema.RenameColumn(table, action.OldName, action.NewName); err != nil {
  1081. return nil, err
  1082. }
  1083. // Update catalog
  1084. e.SyncCatalog()
  1085. result := NewResult("ALTER TABLE")
  1086. return result, nil
  1087. }
  1088. // Transaction execution methods
  1089. // executeBegin starts a new transaction.
  1090. func (e *Executor) executeBegin(stmt *parser.BeginStmt) (*Result, error) {
  1091. if e.inTransaction {
  1092. return nil, fmt.Errorf("cannot start a transaction within a transaction")
  1093. }
  1094. e.inTransaction = true
  1095. e.savepoints = nil
  1096. e.txLog = nil
  1097. result := NewResult("BEGIN")
  1098. return result, nil
  1099. }
  1100. // executeCommit commits the current transaction.
  1101. func (e *Executor) executeCommit(stmt *parser.CommitStmt) (*Result, error) {
  1102. if !e.inTransaction {
  1103. return nil, fmt.Errorf("cannot commit: no transaction in progress")
  1104. }
  1105. // Clear transaction state
  1106. e.inTransaction = false
  1107. e.savepoints = nil
  1108. e.txLog = nil
  1109. result := NewResult("COMMIT")
  1110. return result, nil
  1111. }
  1112. // executeRollback rolls back the current transaction or to a savepoint.
  1113. func (e *Executor) executeRollback(stmt *parser.RollbackStmt) (*Result, error) {
  1114. if !e.inTransaction {
  1115. return nil, fmt.Errorf("cannot rollback: no transaction in progress")
  1116. }
  1117. if stmt.Savepoint != "" {
  1118. // Rollback to savepoint
  1119. return e.rollbackToSavepoint(stmt.Savepoint)
  1120. }
  1121. // Full rollback - undo all operations in reverse order
  1122. for i := len(e.txLog) - 1; i >= 0; i-- {
  1123. entry := e.txLog[i]
  1124. if err := e.undoOperation(entry); err != nil {
  1125. // Log error but continue with rollback
  1126. continue
  1127. }
  1128. }
  1129. // Clear transaction state
  1130. e.inTransaction = false
  1131. e.savepoints = nil
  1132. e.txLog = nil
  1133. result := NewResult("ROLLBACK")
  1134. return result, nil
  1135. }
  1136. // executeSavepoint creates a savepoint.
  1137. func (e *Executor) executeSavepoint(stmt *parser.SavepointStmt) (*Result, error) {
  1138. if !e.inTransaction {
  1139. // SQLite allows SAVEPOINT outside transaction (starts implicit transaction)
  1140. e.inTransaction = true
  1141. e.txLog = nil
  1142. }
  1143. // Add savepoint marker
  1144. e.savepoints = append(e.savepoints, stmt.Name)
  1145. result := NewResult("SAVEPOINT")
  1146. return result, nil
  1147. }
  1148. // executeRelease releases a savepoint.
  1149. func (e *Executor) executeRelease(stmt *parser.ReleaseStmt) (*Result, error) {
  1150. if !e.inTransaction {
  1151. return nil, fmt.Errorf("cannot release savepoint: no transaction in progress")
  1152. }
  1153. // Find and remove the savepoint
  1154. found := false
  1155. for i := len(e.savepoints) - 1; i >= 0; i-- {
  1156. if e.savepoints[i] == stmt.Name {
  1157. e.savepoints = e.savepoints[:i]
  1158. found = true
  1159. break
  1160. }
  1161. }
  1162. if !found {
  1163. return nil, fmt.Errorf("no such savepoint: %s", stmt.Name)
  1164. }
  1165. result := NewResult("RELEASE")
  1166. return result, nil
  1167. }
  1168. // executeAttach attaches a database.
  1169. func (e *Executor) executeAttach(stmt *parser.AttachStmt) (*Result, error) {
  1170. // Check if alias already exists
  1171. if _, exists := e.attachedDatabases[stmt.Alias]; exists {
  1172. return nil, fmt.Errorf("database alias already exists: %s", stmt.Alias)
  1173. }
  1174. // Reserved alias check
  1175. if strings.EqualFold(stmt.Alias, "temp") || strings.EqualFold(stmt.Alias, "temporary") {
  1176. return nil, fmt.Errorf("reserved database alias: %s", stmt.Alias)
  1177. }
  1178. // Get the pool from the main schema manager
  1179. pool := e.schema.GetPool()
  1180. // Create new schema and table managers for the attached database
  1181. // In PizzaKV, each database is just a different namespace/prefix
  1182. schema := storage.NewSchemaManager(pool, stmt.FilePath)
  1183. table := storage.NewTableManager(pool, schema, stmt.FilePath)
  1184. // Register the database connection
  1185. e.attachedDatabases[stmt.Alias] = &DatabaseConnection{
  1186. Alias: stmt.Alias,
  1187. Path: stmt.FilePath,
  1188. Schema: schema,
  1189. Table: table,
  1190. }
  1191. // Sync the catalog with the attached database's tables
  1192. tables, _ := schema.ListTables()
  1193. for _, tableName := range tables {
  1194. tSchema, err := schema.GetSchema(tableName)
  1195. if err != nil {
  1196. continue
  1197. }
  1198. // Add with database prefix
  1199. tableInfo := tSchema.ToAnalyzerTableInfo()
  1200. tableInfo.Name = stmt.Alias + "." + tableInfo.Name
  1201. e.catalog.CreateTable(tableInfo)
  1202. }
  1203. result := NewResult("ATTACH")
  1204. return result, nil
  1205. }
  1206. // executeDetach detaches a database.
  1207. func (e *Executor) executeDetach(stmt *parser.DetachStmt) (*Result, error) {
  1208. // Cannot detach main database
  1209. if strings.EqualFold(stmt.Alias, "main") {
  1210. return nil, fmt.Errorf("cannot detach main database")
  1211. }
  1212. // Check if database exists
  1213. if _, exists := e.attachedDatabases[stmt.Alias]; !exists {
  1214. return nil, fmt.Errorf("no such database: %s", stmt.Alias)
  1215. }
  1216. // Remove from attached databases
  1217. delete(e.attachedDatabases, stmt.Alias)
  1218. // Note: We don't remove from catalog as that would be more complex
  1219. // In a production system, we'd need to track which tables belong to which database
  1220. result := NewResult("DETACH")
  1221. return result, nil
  1222. }
  1223. // rollbackToSavepoint rolls back to a specific savepoint.
  1224. func (e *Executor) rollbackToSavepoint(name string) (*Result, error) {
  1225. // Find savepoint index
  1226. savepointIdx := -1
  1227. for i := len(e.savepoints) - 1; i >= 0; i-- {
  1228. if e.savepoints[i] == name {
  1229. savepointIdx = i
  1230. break
  1231. }
  1232. }
  1233. if savepointIdx == -1 {
  1234. return nil, fmt.Errorf("no such savepoint: %s", name)
  1235. }
  1236. // Count operations to undo (operations after the savepoint)
  1237. // For simplicity, we track savepoint positions by counting log entries
  1238. // In a real implementation, we'd track log positions per savepoint
  1239. // Undo operations in reverse order
  1240. for i := len(e.txLog) - 1; i >= 0; i-- {
  1241. entry := e.txLog[i]
  1242. if err := e.undoOperation(entry); err != nil {
  1243. continue
  1244. }
  1245. }
  1246. // Remove savepoints after the target
  1247. e.savepoints = e.savepoints[:savepointIdx+1]
  1248. result := NewResult("ROLLBACK")
  1249. return result, nil
  1250. }
  1251. // undoOperation reverses a single operation.
  1252. func (e *Executor) undoOperation(entry txLogEntry) error {
  1253. switch entry.operation {
  1254. case "INSERT":
  1255. // Delete the inserted row
  1256. _, err := e.table.Delete(entry.table, func(r storage.Row) bool {
  1257. // Match by primary key stored in entry.key
  1258. pk := e.getPrimaryKey(entry.table)
  1259. if pk == "" {
  1260. return false
  1261. }
  1262. return fmt.Sprintf("%v", r[pk]) == entry.key
  1263. })
  1264. return err
  1265. case "DELETE":
  1266. // Re-insert the deleted row
  1267. if entry.oldData != nil {
  1268. return e.table.Insert(entry.table, entry.oldData)
  1269. }
  1270. case "UPDATE":
  1271. // Restore the old data
  1272. if entry.oldData != nil {
  1273. pk := e.getPrimaryKey(entry.table)
  1274. if pk != "" {
  1275. // Delete current row and insert old data
  1276. e.table.Delete(entry.table, func(r storage.Row) bool {
  1277. return fmt.Sprintf("%v", r[pk]) == entry.key
  1278. })
  1279. return e.table.Insert(entry.table, entry.oldData)
  1280. }
  1281. }
  1282. }
  1283. return nil
  1284. }
  1285. // getPrimaryKey returns the primary key column name for a table.
  1286. func (e *Executor) getPrimaryKey(tableName string) string {
  1287. schema, err := e.schema.GetSchema(tableName)
  1288. if err != nil {
  1289. return ""
  1290. }
  1291. return schema.PrimaryKey
  1292. }
  1293. // extractIndexableCondition extracts column name and value from a simple equality condition.
  1294. // Returns (column, value, true) if the expression is column = literal.
  1295. func (e *Executor) extractIndexableCondition(expr parser.Expr) (string, interface{}, bool) {
  1296. binExpr, ok := expr.(*parser.BinaryExpr)
  1297. if !ok {
  1298. return "", nil, false
  1299. }
  1300. // Only handle equality for now
  1301. if binExpr.Op != lexer.TokenEq {
  1302. return "", nil, false
  1303. }
  1304. // Check for column = literal pattern
  1305. colRef, leftIsCol := binExpr.Left.(*parser.ColumnRef)
  1306. litExpr, rightIsLit := binExpr.Right.(*parser.LiteralExpr)
  1307. if leftIsCol && rightIsLit {
  1308. val, _ := e.evalLiteral(litExpr)
  1309. return colRef.Column, val, true
  1310. }
  1311. // Check for literal = column pattern
  1312. litExpr, leftIsLit := binExpr.Left.(*parser.LiteralExpr)
  1313. colRef, rightIsCol := binExpr.Right.(*parser.ColumnRef)
  1314. if leftIsLit && rightIsCol {
  1315. val, _ := e.evalLiteral(litExpr)
  1316. return colRef.Column, val, true
  1317. }
  1318. return "", nil, false
  1319. }
  1320. // executePragma executes a PRAGMA statement.
  1321. func (e *Executor) executePragma(stmt *parser.PragmaStmt) (*Result, error) {
  1322. switch stmt.Name {
  1323. case "table_info":
  1324. return e.pragmaTableInfo(stmt.Arg)
  1325. case "table_list":
  1326. return e.pragmaTableList()
  1327. case "database_list":
  1328. return e.pragmaDatabaseList()
  1329. case "version":
  1330. return e.pragmaVersion()
  1331. default:
  1332. return nil, fmt.Errorf("unknown pragma: %s", stmt.Name)
  1333. }
  1334. }
  1335. // pragmaTableInfo returns column information for a table.
  1336. func (e *Executor) pragmaTableInfo(tableName string) (*Result, error) {
  1337. if tableName == "" {
  1338. return nil, fmt.Errorf("table_info requires a table name")
  1339. }
  1340. schema, err := e.schema.GetSchema(tableName)
  1341. if err != nil {
  1342. return nil, err
  1343. }
  1344. result := NewResult("PRAGMA")
  1345. result.AddColumn("cid")
  1346. result.AddColumn("name")
  1347. result.AddColumn("type")
  1348. result.AddColumn("notnull")
  1349. result.AddColumn("dflt_value")
  1350. result.AddColumn("pk")
  1351. for i, col := range schema.Columns {
  1352. notnull := 0
  1353. if !col.Nullable {
  1354. notnull = 1
  1355. }
  1356. pk := 0
  1357. if col.PrimaryKey {
  1358. pk = 1
  1359. }
  1360. result.AddRow(int64(i), col.Name, col.Type, int64(notnull), col.Default, int64(pk))
  1361. }
  1362. return result, nil
  1363. }
  1364. // pragmaTableList returns a list of all tables.
  1365. func (e *Executor) pragmaTableList() (*Result, error) {
  1366. tables, err := e.schema.ListTables()
  1367. if err != nil {
  1368. return nil, err
  1369. }
  1370. result := NewResult("PRAGMA")
  1371. result.AddColumn("schema")
  1372. result.AddColumn("name")
  1373. result.AddColumn("type")
  1374. for _, t := range tables {
  1375. result.AddRow("main", t, "table")
  1376. }
  1377. return result, nil
  1378. }
  1379. // pragmaDatabaseList returns a list of databases.
  1380. func (e *Executor) pragmaDatabaseList() (*Result, error) {
  1381. result := NewResult("PRAGMA")
  1382. result.AddColumn("seq")
  1383. result.AddColumn("name")
  1384. result.AddColumn("file")
  1385. // We only have one database
  1386. result.AddRow(int64(0), "main", "")
  1387. return result, nil
  1388. }
  1389. // pragmaVersion returns the PizzaSQL version.
  1390. func (e *Executor) pragmaVersion() (*Result, error) {
  1391. result := NewResult("PRAGMA")
  1392. result.AddColumn("version")
  1393. result.AddRow("PizzaSQL 1.0.0")
  1394. return result, nil
  1395. }
  1396. // executeExplain executes an EXPLAIN statement.
  1397. func (e *Executor) executeExplain(stmt *parser.ExplainStmt) (*Result, error) {
  1398. result := NewResult("EXPLAIN")
  1399. if stmt.QueryPlan {
  1400. // EXPLAIN QUERY PLAN format
  1401. result.AddColumn("id")
  1402. result.AddColumn("parent")
  1403. result.AddColumn("notused")
  1404. result.AddColumn("detail")
  1405. plan := e.generateQueryPlan(stmt.Statement)
  1406. for i, step := range plan {
  1407. result.AddRow(int64(i), int64(0), int64(0), step)
  1408. }
  1409. } else {
  1410. // Simple EXPLAIN format
  1411. result.AddColumn("addr")
  1412. result.AddColumn("opcode")
  1413. result.AddColumn("p1")
  1414. result.AddColumn("p2")
  1415. result.AddColumn("p3")
  1416. result.AddColumn("p4")
  1417. result.AddColumn("p5")
  1418. result.AddColumn("comment")
  1419. ops := e.generateOpcodes(stmt.Statement)
  1420. for i, op := range ops {
  1421. result.AddRow(int64(i), op, int64(0), int64(0), int64(0), "", int64(0), "")
  1422. }
  1423. }
  1424. return result, nil
  1425. }
  1426. // generateQueryPlan generates a simple query plan description.
  1427. func (e *Executor) generateQueryPlan(stmt parser.Statement) []string {
  1428. var plan []string
  1429. switch s := stmt.(type) {
  1430. case *parser.SelectStmt:
  1431. if len(s.From) > 0 {
  1432. plan = append(plan, fmt.Sprintf("SCAN TABLE %s", s.From[0].Name))
  1433. if s.Where != nil {
  1434. plan = append(plan, "FILTER")
  1435. }
  1436. if len(s.OrderBy) > 0 {
  1437. plan = append(plan, "SORT")
  1438. }
  1439. if s.Limit != nil {
  1440. plan = append(plan, "LIMIT")
  1441. }
  1442. } else {
  1443. plan = append(plan, "SCALAR EXPRESSION")
  1444. }
  1445. case *parser.InsertStmt:
  1446. plan = append(plan, fmt.Sprintf("INSERT INTO %s", s.Table.Name))
  1447. case *parser.UpdateStmt:
  1448. plan = append(plan, fmt.Sprintf("SCAN TABLE %s", s.Table.Name))
  1449. plan = append(plan, "UPDATE")
  1450. case *parser.DeleteStmt:
  1451. plan = append(plan, fmt.Sprintf("SCAN TABLE %s", s.Table.Name))
  1452. plan = append(plan, "DELETE")
  1453. default:
  1454. plan = append(plan, "EXECUTE")
  1455. }
  1456. return plan
  1457. }
  1458. // generateOpcodes generates simplified opcodes for EXPLAIN.
  1459. func (e *Executor) generateOpcodes(stmt parser.Statement) []string {
  1460. var ops []string
  1461. switch s := stmt.(type) {
  1462. case *parser.SelectStmt:
  1463. ops = append(ops, "Init")
  1464. if len(s.From) > 0 {
  1465. ops = append(ops, "OpenRead")
  1466. ops = append(ops, "Rewind")
  1467. ops = append(ops, "Column")
  1468. ops = append(ops, "ResultRow")
  1469. ops = append(ops, "Next")
  1470. ops = append(ops, "Close")
  1471. } else {
  1472. ops = append(ops, "Integer")
  1473. ops = append(ops, "ResultRow")
  1474. }
  1475. ops = append(ops, "Halt")
  1476. case *parser.InsertStmt:
  1477. ops = append(ops, "Init")
  1478. ops = append(ops, "OpenWrite")
  1479. ops = append(ops, "NewRowid")
  1480. ops = append(ops, "Insert")
  1481. ops = append(ops, "Close")
  1482. ops = append(ops, "Halt")
  1483. case *parser.UpdateStmt:
  1484. ops = append(ops, "Init")
  1485. ops = append(ops, "OpenWrite")
  1486. ops = append(ops, "Rewind")
  1487. ops = append(ops, "Column")
  1488. ops = append(ops, "Update")
  1489. ops = append(ops, "Next")
  1490. ops = append(ops, "Close")
  1491. ops = append(ops, "Halt")
  1492. case *parser.DeleteStmt:
  1493. ops = append(ops, "Init")
  1494. ops = append(ops, "OpenWrite")
  1495. ops = append(ops, "Rewind")
  1496. ops = append(ops, "Delete")
  1497. ops = append(ops, "Next")
  1498. ops = append(ops, "Close")
  1499. ops = append(ops, "Halt")
  1500. default:
  1501. ops = append(ops, "Init")
  1502. ops = append(ops, "Halt")
  1503. }
  1504. return ops
  1505. }
  1506. // evalExpr evaluates an expression.
  1507. func (e *Executor) evalExpr(expr parser.Expr, row storage.Row) (interface{}, error) {
  1508. switch ex := expr.(type) {
  1509. case *parser.LiteralExpr:
  1510. return e.evalLiteral(ex)
  1511. case *parser.ColumnRef:
  1512. return e.evalColumnRef(ex, row)
  1513. case *parser.BinaryExpr:
  1514. return e.evalBinaryExpr(ex, row)
  1515. case *parser.UnaryExpr:
  1516. return e.evalUnaryExpr(ex, row)
  1517. case *parser.FunctionCall:
  1518. return e.evalFunctionCall(ex, row)
  1519. case *parser.ParenExpr:
  1520. return e.evalExpr(ex.Expr, row)
  1521. case *parser.CaseExpr:
  1522. return e.evalCaseExpr(ex, row)
  1523. case *parser.InExpr:
  1524. return e.evalInExpr(ex, row)
  1525. case *parser.BetweenExpr:
  1526. return e.evalBetweenExpr(ex, row)
  1527. case *parser.LikeExpr:
  1528. return e.evalLikeExpr(ex, row)
  1529. case *parser.IsNullExpr:
  1530. return e.evalIsNullExpr(ex, row)
  1531. case *parser.CastExpr:
  1532. return e.evalCastExpr(ex, row)
  1533. case *parser.SubqueryExpr:
  1534. return e.evalSubqueryExpr(ex, row)
  1535. case *parser.ExistsExpr:
  1536. return e.evalExistsExpr(ex, row)
  1537. default:
  1538. return nil, fmt.Errorf("unsupported expression type: %T", expr)
  1539. }
  1540. }
  1541. func (e *Executor) evalLiteral(lit *parser.LiteralExpr) (interface{}, error) {
  1542. switch lit.Type {
  1543. case lexer.TokenNumber:
  1544. // Check for scientific notation (e.g., 1e+06) or decimal point
  1545. if strings.Contains(lit.Value, ".") || strings.ContainsAny(lit.Value, "eE") {
  1546. f, err := strconv.ParseFloat(lit.Value, 64)
  1547. if err != nil {
  1548. return nil, err
  1549. }
  1550. // If it's a whole number (no fractional part), return as int64
  1551. if f == float64(int64(f)) {
  1552. return int64(f), nil
  1553. }
  1554. return f, nil
  1555. }
  1556. return strconv.ParseInt(lit.Value, 10, 64)
  1557. case lexer.TokenString:
  1558. return lit.Value, nil
  1559. case lexer.TokenNULL:
  1560. return nil, nil
  1561. case lexer.TokenTRUE:
  1562. return true, nil
  1563. case lexer.TokenFALSE:
  1564. return false, nil
  1565. default:
  1566. return lit.Value, nil
  1567. }
  1568. }
  1569. func (e *Executor) evalColumnRef(ref *parser.ColumnRef, row storage.Row) (interface{}, error) {
  1570. if row == nil {
  1571. return nil, fmt.Errorf("no row context for column: %s", ref.Column)
  1572. }
  1573. // Check for ROWID aliases (rowid, oid, _rowid_)
  1574. if storage.IsRowIDColumn(ref.Column) {
  1575. if val, ok := row["_rowid_"]; ok {
  1576. return val, nil
  1577. }
  1578. return nil, nil
  1579. }
  1580. // For qualified column references (table.column), check outer row first
  1581. // This handles correlated subqueries where the qualifier refers to an outer table
  1582. if ref.Table != "" && e.outerRow != nil {
  1583. // Try qualified name in outer row first
  1584. if val, ok := e.outerRow[ref.Table+"."+ref.Column]; ok {
  1585. return val, nil
  1586. }
  1587. // Try case-insensitive in outer row
  1588. for k, v := range e.outerRow {
  1589. if strings.EqualFold(k, ref.Table+"."+ref.Column) {
  1590. return v, nil
  1591. }
  1592. }
  1593. }
  1594. // Try qualified name in current row
  1595. if ref.Table != "" {
  1596. if val, ok := row[ref.Table+"."+ref.Column]; ok {
  1597. return val, nil
  1598. }
  1599. }
  1600. // Try direct column name
  1601. if val, ok := row[ref.Column]; ok {
  1602. return val, nil
  1603. }
  1604. // Case-insensitive search in current row
  1605. for k, v := range row {
  1606. if strings.EqualFold(k, ref.Column) {
  1607. return v, nil
  1608. }
  1609. if ref.Table != "" && strings.EqualFold(k, ref.Table+"."+ref.Column) {
  1610. return v, nil
  1611. }
  1612. }
  1613. // For unqualified references, also check the outer row context
  1614. if e.outerRow != nil {
  1615. // Try direct column name in outer row
  1616. if val, ok := e.outerRow[ref.Column]; ok {
  1617. return val, nil
  1618. }
  1619. // Case-insensitive search in outer row
  1620. for k, v := range e.outerRow {
  1621. if strings.EqualFold(k, ref.Column) {
  1622. return v, nil
  1623. }
  1624. }
  1625. }
  1626. return nil, nil // Column not found, return NULL
  1627. }
  1628. func (e *Executor) evalBinaryExpr(expr *parser.BinaryExpr, row storage.Row) (interface{}, error) {
  1629. left, err := e.evalExpr(expr.Left, row)
  1630. if err != nil {
  1631. return nil, err
  1632. }
  1633. right, err := e.evalExpr(expr.Right, row)
  1634. if err != nil {
  1635. return nil, err
  1636. }
  1637. switch expr.Op {
  1638. case lexer.TokenPlus:
  1639. return toFloat(left) + toFloat(right), nil
  1640. case lexer.TokenMinus:
  1641. return toFloat(left) - toFloat(right), nil
  1642. case lexer.TokenStar:
  1643. return toFloat(left) * toFloat(right), nil
  1644. case lexer.TokenSlash:
  1645. r := toFloat(right)
  1646. if r == 0 {
  1647. return nil, nil // Division by zero returns NULL
  1648. }
  1649. return toFloat(left) / r, nil
  1650. case lexer.TokenPercent:
  1651. return int64(toFloat(left)) % int64(toFloat(right)), nil
  1652. case lexer.TokenEq:
  1653. return compare(left, right) == 0, nil
  1654. case lexer.TokenNeq:
  1655. return compare(left, right) != 0, nil
  1656. case lexer.TokenLt:
  1657. return compare(left, right) < 0, nil
  1658. case lexer.TokenLte:
  1659. return compare(left, right) <= 0, nil
  1660. case lexer.TokenGt:
  1661. return compare(left, right) > 0, nil
  1662. case lexer.TokenGte:
  1663. return compare(left, right) >= 0, nil
  1664. case lexer.TokenAND:
  1665. return toBool(left) && toBool(right), nil
  1666. case lexer.TokenOR:
  1667. return toBool(left) || toBool(right), nil
  1668. case lexer.TokenConcat:
  1669. return toString(left) + toString(right), nil
  1670. default:
  1671. return nil, fmt.Errorf("unsupported operator: %v", expr.Op)
  1672. }
  1673. }
  1674. func (e *Executor) evalUnaryExpr(expr *parser.UnaryExpr, row storage.Row) (interface{}, error) {
  1675. val, err := e.evalExpr(expr.Operand, row)
  1676. if err != nil {
  1677. return nil, err
  1678. }
  1679. switch expr.Op {
  1680. case lexer.TokenMinus:
  1681. return -toFloat(val), nil
  1682. case lexer.TokenPlus:
  1683. return toFloat(val), nil
  1684. case lexer.TokenNOT:
  1685. return !toBool(val), nil
  1686. default:
  1687. return val, nil
  1688. }
  1689. }
  1690. func (e *Executor) evalFunctionCall(fn *parser.FunctionCall, row storage.Row) (interface{}, error) {
  1691. name := strings.ToUpper(fn.Name)
  1692. // Evaluate arguments
  1693. args := make([]interface{}, len(fn.Args))
  1694. for i, arg := range fn.Args {
  1695. val, err := e.evalExpr(arg, row)
  1696. if err != nil {
  1697. return nil, err
  1698. }
  1699. args[i] = val
  1700. }
  1701. switch name {
  1702. case "UPPER":
  1703. if len(args) > 0 {
  1704. if args[0] == nil {
  1705. return nil, nil // NULL propagation
  1706. }
  1707. return strings.ToUpper(toString(args[0])), nil
  1708. }
  1709. case "LOWER":
  1710. if len(args) > 0 {
  1711. if args[0] == nil {
  1712. return nil, nil // NULL propagation
  1713. }
  1714. return strings.ToLower(toString(args[0])), nil
  1715. }
  1716. case "LENGTH":
  1717. if len(args) > 0 {
  1718. if args[0] == nil {
  1719. return nil, nil // NULL propagation
  1720. }
  1721. return int64(len(toString(args[0]))), nil
  1722. }
  1723. case "ABS":
  1724. if len(args) > 0 {
  1725. v := toFloat(args[0])
  1726. if v < 0 {
  1727. return -v, nil
  1728. }
  1729. return v, nil
  1730. }
  1731. case "COALESCE":
  1732. for _, arg := range args {
  1733. if arg != nil {
  1734. return arg, nil
  1735. }
  1736. }
  1737. return nil, nil
  1738. case "NULLIF":
  1739. if len(args) >= 2 && compare(args[0], args[1]) == 0 {
  1740. return nil, nil
  1741. }
  1742. if len(args) > 0 {
  1743. return args[0], nil
  1744. }
  1745. case "IFNULL":
  1746. if len(args) >= 2 {
  1747. if args[0] == nil {
  1748. return args[1], nil
  1749. }
  1750. return args[0], nil
  1751. }
  1752. case "TYPEOF":
  1753. if len(args) > 0 {
  1754. switch args[0].(type) {
  1755. case nil:
  1756. return "null", nil
  1757. case int64, int:
  1758. return "integer", nil
  1759. case float64:
  1760. return "real", nil
  1761. case string:
  1762. return "text", nil
  1763. case []byte:
  1764. return "blob", nil
  1765. default:
  1766. return "text", nil
  1767. }
  1768. }
  1769. case "SUBSTR", "SUBSTRING":
  1770. if len(args) >= 2 {
  1771. s := toString(args[0])
  1772. start := int(toFloat(args[1])) - 1 // SQL is 1-indexed
  1773. if start < 0 {
  1774. start = 0
  1775. }
  1776. if start >= len(s) {
  1777. return "", nil
  1778. }
  1779. if len(args) >= 3 {
  1780. length := int(toFloat(args[2]))
  1781. if start+length > len(s) {
  1782. length = len(s) - start
  1783. }
  1784. return s[start : start+length], nil
  1785. }
  1786. return s[start:], nil
  1787. }
  1788. case "TRIM":
  1789. if len(args) > 0 {
  1790. return strings.TrimSpace(toString(args[0])), nil
  1791. }
  1792. case "REPLACE":
  1793. if len(args) >= 3 {
  1794. return strings.ReplaceAll(toString(args[0]), toString(args[1]), toString(args[2])), nil
  1795. }
  1796. // Additional SQLite functions
  1797. case "PRINTF":
  1798. if len(args) > 0 {
  1799. format := toString(args[0])
  1800. fmtArgs := make([]interface{}, len(args)-1)
  1801. for i := 1; i < len(args); i++ {
  1802. fmtArgs[i-1] = args[i]
  1803. }
  1804. return fmt.Sprintf(format, fmtArgs...), nil
  1805. }
  1806. case "HEX":
  1807. if len(args) > 0 {
  1808. s := toString(args[0])
  1809. return strings.ToUpper(fmt.Sprintf("%x", []byte(s))), nil
  1810. }
  1811. case "UNHEX":
  1812. if len(args) > 0 {
  1813. s := toString(args[0])
  1814. var result []byte
  1815. for i := 0; i < len(s)-1; i += 2 {
  1816. var b byte
  1817. fmt.Sscanf(s[i:i+2], "%x", &b)
  1818. result = append(result, b)
  1819. }
  1820. return string(result), nil
  1821. }
  1822. case "RANDOM":
  1823. return rand.Int63(), nil
  1824. case "RANDOMBLOB":
  1825. if len(args) > 0 {
  1826. n := int(toFloat(args[0]))
  1827. if n <= 0 {
  1828. n = 1
  1829. }
  1830. if n > 1000000 {
  1831. n = 1000000
  1832. }
  1833. blob := make([]byte, n)
  1834. rand.Read(blob)
  1835. return string(blob), nil
  1836. }
  1837. case "ZEROBLOB":
  1838. if len(args) > 0 {
  1839. n := int(toFloat(args[0]))
  1840. if n <= 0 {
  1841. n = 1
  1842. }
  1843. if n > 1000000 {
  1844. n = 1000000
  1845. }
  1846. return string(make([]byte, n)), nil
  1847. }
  1848. case "INSTR":
  1849. if len(args) >= 2 {
  1850. s := toString(args[0])
  1851. substr := toString(args[1])
  1852. idx := strings.Index(s, substr)
  1853. if idx < 0 {
  1854. return int64(0), nil
  1855. }
  1856. return int64(idx + 1), nil // SQL is 1-indexed
  1857. }
  1858. case "GLOB":
  1859. if len(args) >= 2 {
  1860. pattern := toString(args[0])
  1861. s := toString(args[1])
  1862. return matchGlob(pattern, s), nil
  1863. }
  1864. case "ROUND":
  1865. if len(args) > 0 {
  1866. v := toFloat(args[0])
  1867. decimals := 0
  1868. if len(args) >= 2 {
  1869. decimals = int(toFloat(args[1]))
  1870. }
  1871. mult := 1.0
  1872. for i := 0; i < decimals; i++ {
  1873. mult *= 10
  1874. }
  1875. return float64(int64(v*mult+0.5)) / mult, nil
  1876. }
  1877. case "MAX":
  1878. if len(args) > 0 {
  1879. max := args[0]
  1880. for _, arg := range args[1:] {
  1881. if compare(arg, max) > 0 {
  1882. max = arg
  1883. }
  1884. }
  1885. return max, nil
  1886. }
  1887. case "MIN":
  1888. if len(args) > 0 {
  1889. min := args[0]
  1890. for _, arg := range args[1:] {
  1891. if compare(arg, min) < 0 {
  1892. min = arg
  1893. }
  1894. }
  1895. return min, nil
  1896. }
  1897. case "CONCAT":
  1898. var result strings.Builder
  1899. for _, arg := range args {
  1900. result.WriteString(toString(arg))
  1901. }
  1902. return result.String(), nil
  1903. }
  1904. return nil, nil
  1905. }
  1906. func (e *Executor) evalCaseExpr(expr *parser.CaseExpr, row storage.Row) (interface{}, error) {
  1907. var operand interface{}
  1908. if expr.Operand != nil {
  1909. var err error
  1910. operand, err = e.evalExpr(expr.Operand, row)
  1911. if err != nil {
  1912. return nil, err
  1913. }
  1914. }
  1915. for _, when := range expr.Whens {
  1916. cond, err := e.evalExpr(when.Condition, row)
  1917. if err != nil {
  1918. return nil, err
  1919. }
  1920. var match bool
  1921. if operand != nil {
  1922. match = compare(operand, cond) == 0
  1923. } else {
  1924. match = toBool(cond)
  1925. }
  1926. if match {
  1927. return e.evalExpr(when.Result, row)
  1928. }
  1929. }
  1930. if expr.Else != nil {
  1931. return e.evalExpr(expr.Else, row)
  1932. }
  1933. return nil, nil
  1934. }
  1935. func (e *Executor) evalInExpr(expr *parser.InExpr, row storage.Row) (interface{}, error) {
  1936. left, err := e.evalExpr(expr.Left, row)
  1937. if err != nil {
  1938. return nil, err
  1939. }
  1940. // Handle subquery: IN (SELECT ...)
  1941. if expr.Subquery != nil {
  1942. result, err := e.executeSelect(expr.Subquery)
  1943. if err != nil {
  1944. return nil, fmt.Errorf("IN subquery error: %w", err)
  1945. }
  1946. // Check each row's first column value
  1947. for _, resultRow := range result.Rows {
  1948. if len(resultRow) > 0 {
  1949. if compare(left, resultRow[0]) == 0 {
  1950. return !expr.Not, nil
  1951. }
  1952. }
  1953. }
  1954. return expr.Not, nil
  1955. }
  1956. // Handle value list: IN (1, 2, 3)
  1957. for _, val := range expr.Values {
  1958. v, err := e.evalExpr(val, row)
  1959. if err != nil {
  1960. return nil, err
  1961. }
  1962. if compare(left, v) == 0 {
  1963. return !expr.Not, nil
  1964. }
  1965. }
  1966. return expr.Not, nil
  1967. }
  1968. func (e *Executor) evalBetweenExpr(expr *parser.BetweenExpr, row storage.Row) (interface{}, error) {
  1969. val, err := e.evalExpr(expr.Left, row)
  1970. if err != nil {
  1971. return nil, err
  1972. }
  1973. low, err := e.evalExpr(expr.Low, row)
  1974. if err != nil {
  1975. return nil, err
  1976. }
  1977. high, err := e.evalExpr(expr.High, row)
  1978. if err != nil {
  1979. return nil, err
  1980. }
  1981. inRange := compare(val, low) >= 0 && compare(val, high) <= 0
  1982. if expr.Not {
  1983. return !inRange, nil
  1984. }
  1985. return inRange, nil
  1986. }
  1987. func (e *Executor) evalLikeExpr(expr *parser.LikeExpr, row storage.Row) (interface{}, error) {
  1988. val, err := e.evalExpr(expr.Left, row)
  1989. if err != nil {
  1990. return nil, err
  1991. }
  1992. pattern, err := e.evalExpr(expr.Pattern, row)
  1993. if err != nil {
  1994. return nil, err
  1995. }
  1996. s := toString(val)
  1997. p := toString(pattern)
  1998. // Convert SQL LIKE pattern to simple matching
  1999. // % matches any sequence, _ matches single character
  2000. matched := matchLike(s, p)
  2001. if expr.Not {
  2002. return !matched, nil
  2003. }
  2004. return matched, nil
  2005. }
  2006. func (e *Executor) evalIsNullExpr(expr *parser.IsNullExpr, row storage.Row) (interface{}, error) {
  2007. val, err := e.evalExpr(expr.Left, row)
  2008. if err != nil {
  2009. return nil, err
  2010. }
  2011. isNull := val == nil
  2012. if expr.Not {
  2013. return !isNull, nil
  2014. }
  2015. return isNull, nil
  2016. }
  2017. func (e *Executor) evalCastExpr(expr *parser.CastExpr, row storage.Row) (interface{}, error) {
  2018. val, err := e.evalExpr(expr.Expr, row)
  2019. if err != nil {
  2020. return nil, err
  2021. }
  2022. typeName := strings.ToUpper(expr.Type.Name)
  2023. switch {
  2024. case strings.Contains(typeName, "INT"):
  2025. return int64(toFloat(val)), nil
  2026. case strings.Contains(typeName, "REAL"), strings.Contains(typeName, "FLOAT"), strings.Contains(typeName, "DOUBLE"):
  2027. return toFloat(val), nil
  2028. case strings.Contains(typeName, "TEXT"), strings.Contains(typeName, "CHAR"):
  2029. return toString(val), nil
  2030. default:
  2031. return val, nil
  2032. }
  2033. }
  2034. // evalSubqueryExpr executes a scalar subquery and returns its value.
  2035. // A scalar subquery must return exactly one column. It returns:
  2036. // - The single value if the subquery returns one row
  2037. // - NULL if the subquery returns no rows
  2038. // - Error if the subquery returns more than one row (for strict SQL compliance)
  2039. func (e *Executor) evalSubqueryExpr(expr *parser.SubqueryExpr, row storage.Row) (interface{}, error) {
  2040. // Save and set outer row context for correlated subqueries
  2041. savedOuter := e.outerRow
  2042. e.outerRow = row
  2043. defer func() { e.outerRow = savedOuter }()
  2044. // Execute the subquery
  2045. result, err := e.executeSelect(expr.Query)
  2046. if err != nil {
  2047. return nil, fmt.Errorf("subquery error: %w", err)
  2048. }
  2049. // Check for empty result
  2050. if result.RowCount == 0 {
  2051. return nil, nil // Return NULL for empty subquery
  2052. }
  2053. // Check column count
  2054. if len(result.Columns) == 0 {
  2055. return nil, fmt.Errorf("subquery must return at least one column")
  2056. }
  2057. // For scalar subquery, return first column of first row
  2058. // Note: Strict SQL would error if more than one row is returned
  2059. // but we follow SQLite behavior which just returns the first value
  2060. if len(result.Rows) > 0 && len(result.Rows[0]) > 0 {
  2061. return result.Rows[0][0], nil
  2062. }
  2063. return nil, nil
  2064. }
  2065. // evalExistsExpr evaluates an EXISTS expression.
  2066. // Returns true if the subquery returns at least one row, false otherwise.
  2067. func (e *Executor) evalExistsExpr(expr *parser.ExistsExpr, row storage.Row) (interface{}, error) {
  2068. // Save and set outer row context for correlated subqueries
  2069. savedOuter := e.outerRow
  2070. e.outerRow = row
  2071. defer func() { e.outerRow = savedOuter }()
  2072. // Execute the subquery
  2073. result, err := e.executeSelect(expr.Subquery)
  2074. if err != nil {
  2075. return nil, fmt.Errorf("EXISTS subquery error: %w", err)
  2076. }
  2077. // EXISTS returns true if any rows are returned
  2078. return len(result.Rows) > 0, nil
  2079. }
  2080. // evalAggregateExpr evaluates an aggregate expression over multiple rows.
  2081. func (e *Executor) evalAggregateExpr(expr parser.Expr, rows []storage.Row) (interface{}, error) {
  2082. fn, ok := expr.(*parser.FunctionCall)
  2083. if !ok {
  2084. // Not a function call - could be a binary expression with aggregates inside
  2085. // Evaluate it with the aggregate evaluation context
  2086. return e.evalExprWithAggregates(expr, rows)
  2087. }
  2088. name := strings.ToUpper(fn.Name)
  2089. switch name {
  2090. case "COUNT":
  2091. if fn.Star {
  2092. return int64(len(rows)), nil
  2093. }
  2094. if fn.Distinct {
  2095. seen := make(map[interface{}]struct{})
  2096. for _, row := range rows {
  2097. if len(fn.Args) > 0 {
  2098. val, _ := e.evalExpr(fn.Args[0], row)
  2099. if val != nil {
  2100. seen[val] = struct{}{}
  2101. }
  2102. }
  2103. }
  2104. return int64(len(seen)), nil
  2105. }
  2106. count := int64(0)
  2107. for _, row := range rows {
  2108. if len(fn.Args) > 0 {
  2109. val, _ := e.evalExpr(fn.Args[0], row)
  2110. if val != nil {
  2111. count++
  2112. }
  2113. }
  2114. }
  2115. return count, nil
  2116. case "SUM":
  2117. var sum float64
  2118. for _, row := range rows {
  2119. if len(fn.Args) > 0 {
  2120. val, _ := e.evalExpr(fn.Args[0], row)
  2121. if val != nil {
  2122. sum += toFloat(val)
  2123. }
  2124. }
  2125. }
  2126. return sum, nil
  2127. case "AVG":
  2128. var sum float64
  2129. count := 0
  2130. for _, row := range rows {
  2131. if len(fn.Args) > 0 {
  2132. val, _ := e.evalExpr(fn.Args[0], row)
  2133. if val != nil {
  2134. sum += toFloat(val)
  2135. count++
  2136. }
  2137. }
  2138. }
  2139. if count == 0 {
  2140. return nil, nil
  2141. }
  2142. return sum / float64(count), nil
  2143. case "MIN":
  2144. var min interface{}
  2145. for _, row := range rows {
  2146. if len(fn.Args) > 0 {
  2147. val, _ := e.evalExpr(fn.Args[0], row)
  2148. if val != nil && (min == nil || compare(val, min) < 0) {
  2149. min = val
  2150. }
  2151. }
  2152. }
  2153. return min, nil
  2154. case "MAX":
  2155. var max interface{}
  2156. for _, row := range rows {
  2157. if len(fn.Args) > 0 {
  2158. val, _ := e.evalExpr(fn.Args[0], row)
  2159. if val != nil && (max == nil || compare(val, max) > 0) {
  2160. max = val
  2161. }
  2162. }
  2163. }
  2164. return max, nil
  2165. default:
  2166. // Try scalar function
  2167. if len(rows) > 0 {
  2168. return e.evalFunctionCall(fn, rows[0])
  2169. }
  2170. return nil, nil
  2171. }
  2172. }
  2173. // evalExprWithAggregates evaluates an expression that may contain aggregate functions
  2174. func (e *Executor) evalExprWithAggregates(expr parser.Expr, rows []storage.Row) (interface{}, error) {
  2175. switch ex := expr.(type) {
  2176. case *parser.BinaryExpr:
  2177. left, err := e.evalExprWithAggregates(ex.Left, rows)
  2178. if err != nil {
  2179. return nil, err
  2180. }
  2181. right, err := e.evalExprWithAggregates(ex.Right, rows)
  2182. if err != nil {
  2183. return nil, err
  2184. }
  2185. // Apply the binary operator
  2186. switch ex.Op {
  2187. case lexer.TokenPlus:
  2188. return toFloat(left) + toFloat(right), nil
  2189. case lexer.TokenMinus:
  2190. return toFloat(left) - toFloat(right), nil
  2191. case lexer.TokenStar:
  2192. return toFloat(left) * toFloat(right), nil
  2193. case lexer.TokenSlash:
  2194. r := toFloat(right)
  2195. if r == 0 {
  2196. return nil, nil
  2197. }
  2198. return toFloat(left) / r, nil
  2199. case lexer.TokenPercent:
  2200. return int64(toFloat(left)) % int64(toFloat(right)), nil
  2201. case lexer.TokenEq:
  2202. return compare(left, right) == 0, nil
  2203. case lexer.TokenNeq:
  2204. return compare(left, right) != 0, nil
  2205. case lexer.TokenLt:
  2206. return compare(left, right) < 0, nil
  2207. case lexer.TokenLte:
  2208. return compare(left, right) <= 0, nil
  2209. case lexer.TokenGt:
  2210. return compare(left, right) > 0, nil
  2211. case lexer.TokenGte:
  2212. return compare(left, right) >= 0, nil
  2213. case lexer.TokenAND:
  2214. return toBool(left) && toBool(right), nil
  2215. case lexer.TokenOR:
  2216. return toBool(left) || toBool(right), nil
  2217. case lexer.TokenConcat:
  2218. return toString(left) + toString(right), nil
  2219. default:
  2220. return nil, fmt.Errorf("unsupported operator: %v", ex.Op)
  2221. }
  2222. case *parser.FunctionCall:
  2223. return e.evalAggregateExpr(expr, rows)
  2224. default:
  2225. // Non-aggregate expression, use first row
  2226. if len(rows) > 0 {
  2227. return e.evalExpr(expr, rows[0])
  2228. }
  2229. return nil, nil
  2230. }
  2231. }
  2232. // Helper functions
  2233. func (e *Executor) getSelectColumns(stmt *parser.SelectStmt, schema *storage.Schema) []string {
  2234. var columns []string
  2235. for _, col := range stmt.Columns {
  2236. if col.Star {
  2237. for _, c := range schema.Columns {
  2238. columns = append(columns, c.Name)
  2239. }
  2240. } else if col.Alias != "" {
  2241. columns = append(columns, col.Alias)
  2242. } else if ref, ok := col.Expr.(*parser.ColumnRef); ok {
  2243. columns = append(columns, ref.Column)
  2244. } else {
  2245. columns = append(columns, fmt.Sprintf("column%d", len(columns)+1))
  2246. }
  2247. }
  2248. return columns
  2249. }
  2250. func (e *Executor) hasAggregates(columns []parser.SelectColumn) bool {
  2251. for _, col := range columns {
  2252. if e.isAggregate(col.Expr) {
  2253. return true
  2254. }
  2255. }
  2256. return false
  2257. }
  2258. func (e *Executor) isAggregate(expr parser.Expr) bool {
  2259. if fn, ok := expr.(*parser.FunctionCall); ok {
  2260. name := strings.ToUpper(fn.Name)
  2261. switch name {
  2262. case "COUNT", "SUM", "AVG", "MIN", "MAX", "TOTAL", "GROUP_CONCAT":
  2263. return true
  2264. }
  2265. }
  2266. return false
  2267. }
  2268. func (e *Executor) buildGroupKey(groupBy []parser.Expr, row storage.Row) string {
  2269. var parts []string
  2270. for _, expr := range groupBy {
  2271. val, _ := e.evalExpr(expr, row)
  2272. parts = append(parts, fmt.Sprintf("%v", val))
  2273. }
  2274. return strings.Join(parts, "|")
  2275. }
  2276. func (e *Executor) sortRows(rows []storage.Row, orderBy []parser.OrderByItem) {
  2277. sort.Slice(rows, func(i, j int) bool {
  2278. for _, item := range orderBy {
  2279. vi, _ := e.evalExpr(item.Expr, rows[i])
  2280. vj, _ := e.evalExpr(item.Expr, rows[j])
  2281. cmp := compare(vi, vj)
  2282. if cmp != 0 {
  2283. if item.Desc {
  2284. return cmp > 0
  2285. }
  2286. return cmp < 0
  2287. }
  2288. }
  2289. return false
  2290. })
  2291. }
  2292. // sortResultRows sorts Result.Rows based on ORDER BY clauses.
  2293. // It handles column aliases by matching them against the select columns.
  2294. func (e *Executor) sortResultRows(result *Result, orderBy []parser.OrderByItem, selectColumns []parser.SelectColumn, columnNames []string) {
  2295. sort.Slice(result.Rows, func(i, j int) bool {
  2296. for _, item := range orderBy {
  2297. var vi, vj interface{}
  2298. var rowI, rowJ storage.Row
  2299. // Check if ORDER BY references a column alias
  2300. if ref, ok := item.Expr.(*parser.ColumnRef); ok && ref.Table == "" {
  2301. // Look for matching alias in select columns
  2302. for idx, name := range columnNames {
  2303. if strings.EqualFold(name, ref.Column) {
  2304. if idx < len(result.Rows[i]) {
  2305. vi = result.Rows[i][idx]
  2306. vj = result.Rows[j][idx]
  2307. goto compare
  2308. }
  2309. }
  2310. }
  2311. }
  2312. // If not found as alias, try to evaluate the expression
  2313. // Create temporary rows from result rows for evaluation
  2314. rowI = e.resultRowToStorageRow(result, i)
  2315. rowJ = e.resultRowToStorageRow(result, j)
  2316. vi, _ = e.evalExpr(item.Expr, rowI)
  2317. vj, _ = e.evalExpr(item.Expr, rowJ)
  2318. compare:
  2319. cmp := compare(vi, vj)
  2320. if cmp != 0 {
  2321. if item.Desc {
  2322. return cmp > 0
  2323. }
  2324. return cmp < 0
  2325. }
  2326. }
  2327. return false
  2328. })
  2329. }
  2330. // resultRowToStorageRow converts a Result row back to storage.Row for expression evaluation.
  2331. func (e *Executor) resultRowToStorageRow(result *Result, rowIdx int) storage.Row {
  2332. row := make(storage.Row)
  2333. for colIdx, colName := range result.Columns {
  2334. if colIdx < len(result.Rows[rowIdx]) {
  2335. row[colName] = result.Rows[rowIdx][colIdx]
  2336. }
  2337. }
  2338. return row
  2339. }
  2340. func (e *Executor) evalIntExpr(expr parser.Expr) int {
  2341. val, _ := e.evalExpr(expr, nil)
  2342. return int(toFloat(val))
  2343. }
  2344. // Type conversion helpers
  2345. func toFloat(v interface{}) float64 {
  2346. switch val := v.(type) {
  2347. case nil:
  2348. return 0
  2349. case int64:
  2350. return float64(val)
  2351. case int:
  2352. return float64(val)
  2353. case float64:
  2354. return val
  2355. case bool:
  2356. if val {
  2357. return 1
  2358. }
  2359. return 0
  2360. case string:
  2361. f, _ := strconv.ParseFloat(val, 64)
  2362. return f
  2363. default:
  2364. return 0
  2365. }
  2366. }
  2367. func toBool(v interface{}) bool {
  2368. switch val := v.(type) {
  2369. case nil:
  2370. return false
  2371. case bool:
  2372. return val
  2373. case int64:
  2374. return val != 0
  2375. case int:
  2376. return val != 0
  2377. case float64:
  2378. return val != 0
  2379. case string:
  2380. return val != "" && val != "0" && strings.ToLower(val) != "false"
  2381. default:
  2382. return false
  2383. }
  2384. }
  2385. func toString(v interface{}) string {
  2386. if v == nil {
  2387. return ""
  2388. }
  2389. return fmt.Sprintf("%v", v)
  2390. }
  2391. func compare(a, b interface{}) int {
  2392. if a == nil && b == nil {
  2393. return 0
  2394. }
  2395. if a == nil {
  2396. return -1
  2397. }
  2398. if b == nil {
  2399. return 1
  2400. }
  2401. // Try numeric comparison
  2402. fa, oka := toNumeric(a)
  2403. fb, okb := toNumeric(b)
  2404. if oka && okb {
  2405. if fa < fb {
  2406. return -1
  2407. }
  2408. if fa > fb {
  2409. return 1
  2410. }
  2411. return 0
  2412. }
  2413. // String comparison
  2414. sa := toString(a)
  2415. sb := toString(b)
  2416. return strings.Compare(sa, sb)
  2417. }
  2418. func toNumeric(v interface{}) (float64, bool) {
  2419. switch val := v.(type) {
  2420. case int64:
  2421. return float64(val), true
  2422. case int:
  2423. return float64(val), true
  2424. case float64:
  2425. return val, true
  2426. case string:
  2427. f, err := strconv.ParseFloat(val, 64)
  2428. return f, err == nil
  2429. default:
  2430. return 0, false
  2431. }
  2432. }
  2433. // matchLike matches a string against a SQL LIKE pattern.
  2434. func matchLike(s, pattern string) bool {
  2435. // Simple implementation - convert to lowercase for case-insensitive matching
  2436. s = strings.ToLower(s)
  2437. pattern = strings.ToLower(pattern)
  2438. return matchLikeHelper(s, pattern)
  2439. }
  2440. func matchLikeHelper(s, p string) bool {
  2441. if p == "" {
  2442. return s == ""
  2443. }
  2444. if p[0] == '%' {
  2445. // % matches any sequence
  2446. for i := 0; i <= len(s); i++ {
  2447. if matchLikeHelper(s[i:], p[1:]) {
  2448. return true
  2449. }
  2450. }
  2451. return false
  2452. }
  2453. if s == "" {
  2454. return false
  2455. }
  2456. if p[0] == '_' || p[0] == s[0] {
  2457. return matchLikeHelper(s[1:], p[1:])
  2458. }
  2459. return false
  2460. }
  2461. // matchGlob matches a string against a GLOB pattern.
  2462. // GLOB uses * for any sequence and ? for single character (case-sensitive).
  2463. func matchGlob(pattern, s string) bool {
  2464. return matchGlobHelper(pattern, s)
  2465. }
  2466. func matchGlobHelper(p, s string) bool {
  2467. if p == "" {
  2468. return s == ""
  2469. }
  2470. if p[0] == '*' {
  2471. // * matches any sequence
  2472. for i := 0; i <= len(s); i++ {
  2473. if matchGlobHelper(p[1:], s[i:]) {
  2474. return true
  2475. }
  2476. }
  2477. return false
  2478. }
  2479. if s == "" {
  2480. return false
  2481. }
  2482. if p[0] == '?' || p[0] == s[0] {
  2483. return matchGlobHelper(p[1:], s[1:])
  2484. }
  2485. // Handle character classes [...]
  2486. if p[0] == '[' {
  2487. end := strings.Index(p, "]")
  2488. if end > 0 {
  2489. class := p[1:end]
  2490. match := false
  2491. negate := false
  2492. if len(class) > 0 && class[0] == '^' {
  2493. negate = true
  2494. class = class[1:]
  2495. }
  2496. for _, c := range class {
  2497. if byte(c) == s[0] {
  2498. match = true
  2499. break
  2500. }
  2501. }
  2502. if negate {
  2503. match = !match
  2504. }
  2505. if match {
  2506. return matchGlobHelper(p[end+1:], s[1:])
  2507. }
  2508. }
  2509. }
  2510. return false
  2511. }
  2512. // applyDistinct removes duplicate rows from the result
  2513. func (e *Executor) applyDistinct(rows [][]interface{}) [][]interface{} {
  2514. if len(rows) == 0 {
  2515. return rows
  2516. }
  2517. seen := make(map[string]bool)
  2518. uniqueRows := make([][]interface{}, 0)
  2519. for _, row := range rows {
  2520. // Create a key from all column values
  2521. key := ""
  2522. for i, val := range row {
  2523. if i > 0 {
  2524. key += "\x00" // Use null byte as separator
  2525. }
  2526. key += fmt.Sprintf("%v", val)
  2527. }
  2528. if !seen[key] {
  2529. seen[key] = true
  2530. uniqueRows = append(uniqueRows, row)
  2531. }
  2532. }
  2533. return uniqueRows
  2534. }