executor.go 68 KB

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