2
0

executor.go 67 KB

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