1/* wc-queries.sql -- queries used to interact with the wc-metadata 2 * SQLite database 3 * This is intended for use with SQLite 3 4 * 5 * ==================================================================== 6 * Licensed to the Apache Software Foundation (ASF) under one 7 * or more contributor license agreements. See the NOTICE file 8 * distributed with this work for additional information 9 * regarding copyright ownership. The ASF licenses this file 10 * to you under the Apache License, Version 2.0 (the 11 * "License"); you may not use this file except in compliance 12 * with the License. You may obtain a copy of the License at 13 * 14 * http://www.apache.org/licenses/LICENSE-2.0 15 * 16 * Unless required by applicable law or agreed to in writing, 17 * software distributed under the License is distributed on an 18 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 19 * KIND, either express or implied. See the License for the 20 * specific language governing permissions and limitations 21 * under the License. 22 * ==================================================================== 23 */ 24 25/* ------------------------------------------------------------------------- */ 26 27/* these are used in wc_db.c */ 28 29-- STMT_SELECT_NODE_INFO 30SELECT op_depth, repos_id, repos_path, presence, kind, revision, checksum, 31 translated_size, changed_revision, changed_date, changed_author, depth, 32 symlink_target, last_mod_time, properties, moved_here, inherited_props, 33 moved_to 34FROM nodes 35WHERE wc_id = ?1 AND local_relpath = ?2 36ORDER BY op_depth DESC 37 38-- STMT_SELECT_NODE_INFO_WITH_LOCK 39SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision, 40 checksum, translated_size, changed_revision, changed_date, changed_author, 41 depth, symlink_target, last_mod_time, properties, moved_here, 42 inherited_props, 43 /* All the columns until now must match those returned by 44 STMT_SELECT_NODE_INFO. The implementation of svn_wc__db_read_info() 45 assumes that these columns are followed by the lock information) */ 46 lock_token, lock_owner, lock_comment, lock_date 47FROM nodes 48LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id 49 AND nodes.repos_path = lock.repos_relpath AND nodes.op_depth=0 50WHERE wc_id = ?1 AND local_relpath = ?2 51ORDER BY op_depth DESC 52 53-- STMT_SELECT_BASE_NODE 54SELECT repos_id, repos_path, presence, kind, revision, checksum, 55 translated_size, changed_revision, changed_date, changed_author, depth, 56 symlink_target, last_mod_time, properties, file_external 57FROM nodes 58WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 59 60-- STMT_SELECT_BASE_NODE_WITH_LOCK 61SELECT nodes.repos_id, nodes.repos_path, presence, kind, revision, 62 checksum, translated_size, changed_revision, changed_date, changed_author, 63 depth, symlink_target, last_mod_time, properties, file_external, 64 /* All the columns until now must match those returned by 65 STMT_SELECT_BASE_NODE. The implementation of svn_wc__db_base_get_info() 66 assumes that these columns are followed by the lock information) */ 67 lock_token, lock_owner, lock_comment, lock_date 68FROM nodes 69LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id 70 AND nodes.repos_path = lock.repos_relpath 71WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 72 73-- STMT_SELECT_BASE_CHILDREN_INFO 74SELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind, 75 revision, depth, file_external 76FROM nodes 77WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 78 79-- STMT_SELECT_BASE_CHILDREN_INFO_LOCK 80SELECT local_relpath, nodes.repos_id, nodes.repos_path, presence, kind, 81 revision, depth, file_external, 82 lock_token, lock_owner, lock_comment, lock_date 83FROM nodes 84LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id 85 AND nodes.repos_path = lock.repos_relpath 86WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 87 88 89-- STMT_SELECT_WORKING_NODE 90SELECT op_depth, presence, kind, checksum, translated_size, 91 changed_revision, changed_date, changed_author, depth, symlink_target, 92 repos_id, repos_path, revision, 93 moved_here, moved_to, last_mod_time, properties 94FROM nodes 95WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0 96ORDER BY op_depth DESC 97LIMIT 1 98 99-- STMT_SELECT_DEPTH_NODE 100SELECT repos_id, repos_path, presence, kind, revision, checksum, 101 translated_size, changed_revision, changed_date, changed_author, depth, 102 symlink_target, properties, moved_to, moved_here 103FROM nodes 104WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 105 106-- STMT_SELECT_LOWEST_WORKING_NODE 107SELECT op_depth, presence, kind, moved_to 108FROM nodes 109WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 110ORDER BY op_depth 111LIMIT 1 112 113-- STMT_SELECT_HIGHEST_WORKING_NODE 114SELECT op_depth 115FROM nodes 116WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth < ?3 117ORDER BY op_depth DESC 118LIMIT 1 119 120-- STMT_SELECT_PRESENT_HIGHEST_WORKING_NODES_BY_BASENAME_AND_KIND 121SELECT presence, local_relpath 122FROM nodes n 123WHERE wc_id = ?1 AND local_relpath = RELPATH_JOIN(parent_relpath, ?2) 124 AND kind = ?3 125 AND presence in (MAP_NORMAL, MAP_INCOMPLETE) 126 AND op_depth = (SELECT MAX(op_depth) 127 FROM NODES w 128 WHERE w.wc_id = ?1 129 AND w.local_relpath = n.local_relpath) 130 131-- STMT_SELECT_ACTUAL_NODE 132SELECT changelist, properties, conflict_data 133FROM actual_node 134WHERE wc_id = ?1 AND local_relpath = ?2 135 136-- STMT_SELECT_NODE_CHILDREN_INFO 137/* Getting rows in an advantageous order using 138 ORDER BY local_relpath, op_depth DESC 139 doesn't work as the index is created without the DESC keyword. 140 Using both local_relpath and op_depth descending does work without any 141 performance penalty. */ 142SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision, 143 checksum, translated_size, changed_revision, changed_date, changed_author, 144 depth, symlink_target, last_mod_time, properties, lock_token, lock_owner, 145 lock_comment, lock_date, local_relpath, moved_here, moved_to, file_external 146FROM nodes 147LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id 148 AND nodes.repos_path = lock.repos_relpath AND nodes.op_depth = 0 149WHERE wc_id = ?1 AND parent_relpath = ?2 150ORDER BY local_relpath DESC, op_depth DESC 151 152-- STMT_SELECT_BASE_NODE_CHILDREN_INFO 153/* See above re: result ordering. The results of this query must be in 154the same order as returned by STMT_SELECT_NODE_CHILDREN_INFO, because 155read_children_info expects them to be. */ 156SELECT op_depth, nodes.repos_id, nodes.repos_path, presence, kind, revision, 157 checksum, translated_size, changed_revision, changed_date, changed_author, 158 depth, symlink_target, last_mod_time, properties, lock_token, lock_owner, 159 lock_comment, lock_date, local_relpath, moved_here, moved_to, file_external 160FROM nodes 161LEFT OUTER JOIN lock ON nodes.repos_id = lock.repos_id 162 AND nodes.repos_path = lock.repos_relpath 163WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 164ORDER BY local_relpath DESC 165 166-- STMT_SELECT_NODE_CHILDREN_WALKER_INFO 167SELECT local_relpath, op_depth, presence, kind 168FROM nodes_current 169WHERE wc_id = ?1 AND parent_relpath = ?2 170ORDER BY local_relpath 171 172-- STMT_SELECT_ACTUAL_CHILDREN_INFO 173SELECT local_relpath, changelist, properties, conflict_data 174FROM actual_node 175WHERE wc_id = ?1 AND parent_relpath = ?2 176 177-- STMT_SELECT_REPOSITORY_BY_ID 178SELECT root, uuid FROM repository WHERE id = ?1 179 180-- STMT_SELECT_WCROOT_NULL 181SELECT id FROM wcroot WHERE local_abspath IS NULL 182 183-- STMT_SELECT_REPOSITORY 184SELECT id FROM repository WHERE root = ?1 185 186-- STMT_INSERT_REPOSITORY 187INSERT INTO repository (root, uuid) VALUES (?1, ?2) 188 189-- STMT_INSERT_NODE 190INSERT OR REPLACE INTO nodes ( 191 wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, 192 revision, presence, depth, kind, changed_revision, changed_date, 193 changed_author, checksum, properties, translated_size, last_mod_time, 194 dav_cache, symlink_target, file_external, moved_to, moved_here, 195 inherited_props) 196VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, 197 ?15, ?16, ?17, ?18, ?19, ?20, ?21, ?22, ?23) 198 199-- STMT_SELECT_WORKING_PRESENT 200SELECT local_relpath, kind, checksum, translated_size, last_mod_time 201FROM nodes n 202WHERE wc_id = ?1 203 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 204 AND presence in (MAP_NORMAL, MAP_INCOMPLETE) 205 AND op_depth = (SELECT MAX(op_depth) 206 FROM NODES w 207 WHERE w.wc_id = ?1 208 AND w.local_relpath = n.local_relpath) 209ORDER BY local_relpath DESC 210 211-- STMT_DELETE_NODE_RECURSIVE 212DELETE FROM NODES 213WHERE wc_id = ?1 214 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 215 216-- STMT_DELETE_NODE 217DELETE 218FROM NODES 219WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 220 221-- STMT_DELETE_ACTUAL_FOR_BASE_RECURSIVE 222/* The ACTUAL_NODE applies to BASE, unless there is in at least one op_depth 223 a WORKING node that could have a conflict */ 224DELETE FROM actual_node 225WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 226 AND EXISTS(SELECT 1 FROM NODES b 227 WHERE b.wc_id = ?1 228 AND b.local_relpath = actual_node.local_relpath 229 AND op_depth = 0) 230 AND NOT EXISTS(SELECT 1 FROM NODES w 231 WHERE w.wc_id = ?1 232 AND w.local_relpath = actual_node.local_relpath 233 AND op_depth > 0 234 AND presence in (MAP_NORMAL, MAP_INCOMPLETE, MAP_NOT_PRESENT)) 235 236-- STMT_DELETE_WORKING_BASE_DELETE 237DELETE FROM nodes 238WHERE wc_id = ?1 AND local_relpath = ?2 239 AND presence = MAP_BASE_DELETED 240 AND op_depth > ?3 241 AND op_depth = (SELECT MIN(op_depth) FROM nodes n 242 WHERE n.wc_id = ?1 243 AND n.local_relpath = nodes.local_relpath 244 AND op_depth > ?3) 245 246-- STMT_DELETE_WORKING_BASE_DELETE_RECURSIVE 247DELETE FROM nodes 248WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 249 AND presence = MAP_BASE_DELETED 250 AND op_depth > ?3 251 AND op_depth = (SELECT MIN(op_depth) FROM nodes n 252 WHERE n.wc_id = ?1 253 AND n.local_relpath = nodes.local_relpath 254 AND op_depth > ?3) 255 256-- STMT_DELETE_WORKING_RECURSIVE 257DELETE FROM nodes 258WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 259 AND op_depth > 0 260 261-- STMT_DELETE_BASE_RECURSIVE 262DELETE FROM nodes 263WHERE wc_id = ?1 AND (local_relpath = ?2 264 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 265 AND op_depth = 0 266 267-- STMT_DELETE_WORKING_OP_DEPTH 268DELETE FROM nodes 269WHERE wc_id = ?1 270 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 271 AND op_depth = ?3 272 273/* Full layer replacement check code for handling moves 274The op_root must exist (or there is no layer to replace) and an op-root 275 always has presence 'normal' */ 276-- STMT_SELECT_LAYER_FOR_REPLACE 277SELECT s.local_relpath, s.kind, 278 RELPATH_SKIP_JOIN(?2, ?4, s.local_relpath) drp, 'normal' 279FROM nodes s 280WHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3 281UNION ALL 282SELECT s.local_relpath, s.kind, 283 RELPATH_SKIP_JOIN(?2, ?4, s.local_relpath) drp, d.presence 284FROM nodes s 285LEFT OUTER JOIN nodes d ON d.wc_id= ?1 AND d.op_depth = ?5 286 AND d.local_relpath = drp 287WHERE s.wc_id = ?1 288 AND IS_STRICT_DESCENDANT_OF(s.local_relpath, ?2) 289 AND s.op_depth = ?3 290ORDER BY s.local_relpath 291 292-- STMT_SELECT_DESCENDANTS_OP_DEPTH_RV 293SELECT local_relpath, kind 294FROM nodes 295WHERE wc_id = ?1 296 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 297 AND op_depth = ?3 298 AND presence in (MAP_NORMAL, MAP_INCOMPLETE) 299ORDER BY local_relpath DESC 300 301-- STMT_COPY_NODE_MOVE 302INSERT OR REPLACE INTO nodes ( 303 wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, 304 revision, presence, depth, kind, changed_revision, changed_date, 305 changed_author, checksum, properties, translated_size, last_mod_time, 306 symlink_target, moved_here, moved_to ) 307SELECT 308 s.wc_id, ?4 /*local_relpath */, ?5 /*op_depth*/, ?6 /* parent_relpath */, 309 s.repos_id, 310 s.repos_path, s.revision, s.presence, s.depth, s.kind, s.changed_revision, 311 s.changed_date, s.changed_author, s.checksum, s.properties, 312 CASE WHEN d.checksum=s.checksum THEN d.translated_size END, 313 CASE WHEN d.checksum=s.checksum THEN d.last_mod_time END, 314 s.symlink_target, 1, d.moved_to 315FROM nodes s 316LEFT JOIN nodes d ON d.wc_id=?1 AND d.local_relpath=?4 AND d.op_depth=?5 317WHERE s.wc_id = ?1 AND s.local_relpath = ?2 AND s.op_depth = ?3 318 319-- STMT_SELECT_NO_LONGER_MOVED_RV 320SELECT d.local_relpath, RELPATH_SKIP_JOIN(?2, ?4, d.local_relpath) srp, 321 b.presence, b.op_depth 322FROM nodes d 323LEFT OUTER JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = d.local_relpath 324 AND b.op_depth = (SELECT MAX(x.op_depth) FROM nodes x 325 WHERE x.wc_id = ?1 326 AND x.local_relpath = b.local_relpath 327 AND x.op_depth < ?3) 328WHERE d.wc_id = ?1 329 AND IS_STRICT_DESCENDANT_OF(d.local_relpath, ?2) 330 AND d.op_depth = ?3 331 AND NOT EXISTS(SELECT * FROM nodes s 332 WHERE s.wc_id = ?1 333 AND s.local_relpath = srp 334 AND s.op_depth = ?5) 335ORDER BY d.local_relpath DESC 336 337-- STMT_SELECT_OP_DEPTH_CHILDREN 338SELECT local_relpath, kind FROM nodes 339WHERE wc_id = ?1 340 AND parent_relpath = ?2 341 AND op_depth = ?3 342 AND presence != MAP_BASE_DELETED 343 AND file_external is NULL 344ORDER BY local_relpath 345 346-- STMT_SELECT_OP_DEPTH_CHILDREN_EXISTS 347SELECT local_relpath, kind FROM nodes 348WHERE wc_id = ?1 349 AND parent_relpath = ?2 350 AND op_depth = ?3 351 AND presence IN (MAP_NORMAL, MAP_INCOMPLETE) 352ORDER BY local_relpath 353 354/* Used by non-recursive revert to detect higher level children, and 355 actual-only rows that would be left orphans, if the revert 356 proceeded. */ 357-- STMT_SELECT_GE_OP_DEPTH_CHILDREN 358SELECT 1 FROM nodes 359WHERE wc_id = ?1 AND parent_relpath = ?2 360 AND (op_depth > ?3 OR (op_depth = ?3 361 AND presence IN (MAP_NORMAL, MAP_INCOMPLETE))) 362UNION ALL 363SELECT 1 FROM ACTUAL_NODE a 364WHERE wc_id = ?1 AND parent_relpath = ?2 365 AND NOT EXISTS (SELECT 1 FROM nodes n 366 WHERE wc_id = ?1 AND n.local_relpath = a.local_relpath) 367 368/* Delete the nodes shadowed by local_relpath. Not valid for the wc-root */ 369-- STMT_DELETE_SHADOWED_RECURSIVE 370DELETE FROM nodes 371WHERE wc_id = ?1 372 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 373 AND (op_depth < ?3 374 OR (op_depth = ?3 AND presence = MAP_BASE_DELETED)) 375 376-- STMT_CLEAR_MOVED_TO_FROM_DEST 377UPDATE NODES SET moved_to = NULL 378WHERE wc_id = ?1 379 AND moved_to = ?2 380 381/* Get not-present descendants of a copied node. Not valid for the wc-root */ 382-- STMT_SELECT_NOT_PRESENT_DESCENDANTS 383SELECT local_relpath FROM nodes 384WHERE wc_id = ?1 AND op_depth = ?3 385 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 386 AND presence = MAP_NOT_PRESENT 387 388-- STMT_COMMIT_DESCENDANTS_TO_BASE 389UPDATE NODES SET op_depth = 0, 390 repos_id = ?4, 391 repos_path = RELPATH_SKIP_JOIN(?2, ?5, local_relpath), 392 revision = ?6, 393 dav_cache = NULL, 394 moved_here = NULL, 395 moved_to = NULL, 396 presence = CASE presence 397 WHEN MAP_NORMAL THEN MAP_NORMAL 398 WHEN MAP_EXCLUDED THEN MAP_EXCLUDED 399 ELSE MAP_NOT_PRESENT 400 END 401WHERE wc_id = ?1 402 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 403 AND op_depth = ?3 404 405-- STMT_SELECT_NODE_CHILDREN 406/* Return all paths that are children of the directory (?1, ?2) in any 407 op-depth, including children of any underlying, replaced directories. */ 408SELECT DISTINCT local_relpath FROM nodes 409WHERE wc_id = ?1 AND parent_relpath = ?2 410ORDER BY local_relpath 411 412-- STMT_SELECT_WORKING_CHILDREN 413/* Return all paths that are children of the working version of the 414 directory (?1, ?2). A given path is not included just because it is a 415 child of an underlying (replaced) directory, it has to be in the 416 working version of the directory. */ 417SELECT DISTINCT local_relpath FROM nodes 418WHERE wc_id = ?1 AND parent_relpath = ?2 419 AND (op_depth > (SELECT MAX(op_depth) FROM nodes 420 WHERE wc_id = ?1 AND local_relpath = ?2) 421 OR 422 (op_depth = (SELECT MAX(op_depth) FROM nodes 423 WHERE wc_id = ?1 AND local_relpath = ?2) 424 AND presence IN (MAP_NORMAL, MAP_INCOMPLETE))) 425ORDER BY local_relpath 426 427-- STMT_SELECT_BASE_NOT_PRESENT_CHILDREN 428SELECT local_relpath FROM nodes 429WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = 0 430 AND presence = MAP_NOT_PRESENT 431ORDER BY local_relpath 432 433-- STMT_SELECT_NODE_PROPS 434SELECT properties, presence FROM nodes 435WHERE wc_id = ?1 AND local_relpath = ?2 436ORDER BY op_depth DESC 437 438-- STMT_SELECT_ACTUAL_PROPS 439SELECT properties FROM actual_node 440WHERE wc_id = ?1 AND local_relpath = ?2 441 442-- STMT_UPDATE_ACTUAL_PROPS 443UPDATE actual_node SET properties = ?3 444WHERE wc_id = ?1 AND local_relpath = ?2 445 446-- STMT_INSERT_ACTUAL_PROPS 447INSERT INTO actual_node (wc_id, local_relpath, parent_relpath, properties) 448VALUES (?1, ?2, ?3, ?4) 449 450-- STMT_INSERT_LOCK 451INSERT OR REPLACE INTO lock 452(repos_id, repos_relpath, lock_token, lock_owner, lock_comment, 453 lock_date) 454VALUES (?1, ?2, ?3, ?4, ?5, ?6) 455 456/* Not valid for the working copy root */ 457-- STMT_SELECT_BASE_NODE_LOCK_TOKENS_RECURSIVE 458SELECT nodes.repos_id, nodes.repos_path, lock_token 459FROM nodes 460LEFT JOIN lock ON nodes.repos_id = lock.repos_id 461 AND nodes.repos_path = lock.repos_relpath 462WHERE wc_id = ?1 AND op_depth = 0 463 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 464 465-- STMT_INSERT_WCROOT 466INSERT INTO wcroot (local_abspath) 467VALUES (?1) 468 469-- STMT_UPDATE_BASE_NODE_DAV_CACHE 470UPDATE nodes SET dav_cache = ?3 471WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 472 473-- STMT_SELECT_BASE_DAV_CACHE 474SELECT dav_cache FROM nodes 475WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 476 477-- STMT_SELECT_DELETION_INFO 478SELECT b.presence, w.presence, w.op_depth, w.moved_to 479FROM nodes w 480LEFT JOIN nodes b ON b.wc_id = ?1 AND b.local_relpath = ?2 AND b.op_depth = 0 481WHERE w.wc_id = ?1 AND w.local_relpath = ?2 482 AND w.op_depth = (SELECT MAX(op_depth) FROM nodes d 483 WHERE d.wc_id = ?1 AND d.local_relpath = ?2 484 AND d.op_depth > 0) 485LIMIT 1 486 487-- STMT_SELECT_MOVED_TO_NODE 488SELECT op_depth, moved_to 489FROM nodes 490WHERE wc_id = ?1 AND local_relpath = ?2 AND moved_to IS NOT NULL 491ORDER BY op_depth DESC 492 493-- STMT_SELECT_OP_DEPTH_MOVED_TO 494SELECT op_depth, moved_to 495FROM nodes 496WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 497 AND EXISTS(SELECT * from nodes 498 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 499 AND presence IN (MAP_NORMAL, MAP_INCOMPLETE)) 500ORDER BY op_depth ASC 501LIMIT 1 502 503-- STMT_SELECT_MOVED_TO 504SELECT moved_to 505FROM nodes 506WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 507 508-- STMT_SELECT_MOVED_BACK 509SELECT u.local_relpath, 510 u.presence, u.repos_id, u.repos_path, u.revision, 511 l.presence, l.repos_id, l.repos_path, l.revision, 512 u.moved_here, u.moved_to 513FROM nodes u 514LEFT OUTER JOIN nodes l ON l.wc_id = ?1 515 AND l.local_relpath = u.local_relpath 516 AND l.op_depth = ?3 517WHERE u.wc_id = ?1 518 AND u.local_relpath = ?2 519 AND u.op_depth = ?4 520UNION ALL 521SELECT u.local_relpath, 522 u.presence, u.repos_id, u.repos_path, u.revision, 523 l.presence, l.repos_id, l.repos_path, l.revision, 524 u.moved_here, NULL 525FROM nodes u 526LEFT OUTER JOIN nodes l ON l.wc_id=?1 527 AND l.local_relpath=u.local_relpath 528 AND l.op_depth=?3 529WHERE u.wc_id = ?1 530 AND IS_STRICT_DESCENDANT_OF(u.local_relpath, ?2) 531 AND u.op_depth = ?4 532 533-- STMT_DELETE_LOCK 534DELETE FROM lock 535WHERE repos_id = ?1 AND repos_relpath = ?2 536 537-- STMT_DELETE_LOCK_RECURSIVELY 538DELETE FROM lock 539WHERE repos_id = ?1 AND (repos_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(repos_relpath, ?2)) 540 541-- STMT_CLEAR_BASE_NODE_RECURSIVE_DAV_CACHE 542UPDATE nodes SET dav_cache = NULL 543WHERE dav_cache IS NOT NULL AND wc_id = ?1 AND op_depth = 0 544 AND (local_relpath = ?2 545 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 546 547-- STMT_RECURSIVE_UPDATE_NODE_REPO 548UPDATE nodes SET repos_id = ?4, dav_cache = NULL 549/* ### The Sqlite optimizer needs help here ### 550 * WHERE wc_id = ?1 551 * AND repos_id = ?3 552 * AND (local_relpath = ?2 553 * OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))*/ 554WHERE (wc_id = ?1 AND local_relpath = ?2 AND repos_id = ?3) 555 OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 556 AND repos_id = ?3) 557 558 559-- STMT_UPDATE_LOCK_REPOS_ID 560UPDATE lock SET repos_id = ?2 561WHERE repos_id = ?1 562 563-- STMT_UPDATE_NODE_FILEINFO 564UPDATE nodes SET translated_size = ?3, last_mod_time = ?4 565WHERE wc_id = ?1 AND local_relpath = ?2 566 AND op_depth = (SELECT MAX(op_depth) FROM nodes 567 WHERE wc_id = ?1 AND local_relpath = ?2) 568 569-- STMT_INSERT_ACTUAL_CONFLICT 570INSERT INTO actual_node (wc_id, local_relpath, conflict_data, parent_relpath) 571VALUES (?1, ?2, ?3, ?4) 572 573-- STMT_UPDATE_ACTUAL_CONFLICT 574UPDATE actual_node SET conflict_data = ?3 575WHERE wc_id = ?1 AND local_relpath = ?2 576 577-- STMT_UPDATE_ACTUAL_CHANGELISTS 578UPDATE actual_node SET changelist = ?3 579WHERE wc_id = ?1 580 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 581 AND local_relpath = (SELECT local_relpath FROM targets_list AS t 582 WHERE wc_id = ?1 583 AND t.local_relpath = actual_node.local_relpath 584 AND kind = MAP_FILE) 585 586-- STMT_UPDATE_ACTUAL_CLEAR_CHANGELIST 587UPDATE actual_node SET changelist = NULL 588 WHERE wc_id = ?1 AND local_relpath = ?2 589 590-- STMT_MARK_SKIPPED_CHANGELIST_DIRS 591/* 7 corresponds to svn_wc_notify_skip */ 592INSERT INTO changelist_list (wc_id, local_relpath, notify, changelist) 593SELECT wc_id, local_relpath, 7, ?3 594FROM targets_list 595WHERE wc_id = ?1 596 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 597 AND kind = MAP_DIR 598 599-- STMT_RESET_ACTUAL_WITH_CHANGELIST 600REPLACE INTO actual_node ( 601 wc_id, local_relpath, parent_relpath, changelist) 602VALUES (?1, ?2, ?3, ?4) 603 604-- STMT_CREATE_CHANGELIST_LIST 605DROP TABLE IF EXISTS changelist_list; 606CREATE TEMPORARY TABLE changelist_list ( 607 wc_id INTEGER NOT NULL, 608 local_relpath TEXT NOT NULL, 609 notify INTEGER NOT NULL, 610 changelist TEXT NOT NULL, 611 /* Order NOTIFY descending to make us show clears (27) before adds (26) */ 612 PRIMARY KEY (wc_id, local_relpath, notify DESC) 613) 614 615/* Create notify items for when a node is removed from a changelist and 616 when a node is added to a changelist. Make sure nothing is notified 617 if there were no changes. 618*/ 619-- STMT_CREATE_CHANGELIST_TRIGGER 620DROP TRIGGER IF EXISTS trigger_changelist_list_change; 621CREATE TEMPORARY TRIGGER trigger_changelist_list_change 622BEFORE UPDATE ON actual_node 623WHEN old.changelist IS NOT new.changelist 624BEGIN 625 /* 27 corresponds to svn_wc_notify_changelist_clear */ 626 INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist) 627 SELECT old.wc_id, old.local_relpath, 27, old.changelist 628 WHERE old.changelist is NOT NULL; 629 630 /* 26 corresponds to svn_wc_notify_changelist_set */ 631 INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist) 632 SELECT new.wc_id, new.local_relpath, 26, new.changelist 633 WHERE new.changelist IS NOT NULL; 634END 635 636-- STMT_FINALIZE_CHANGELIST 637DROP TRIGGER trigger_changelist_list_change; 638DROP TABLE changelist_list; 639DROP TABLE targets_list 640 641-- STMT_SELECT_CHANGELIST_LIST 642SELECT wc_id, local_relpath, notify, changelist 643FROM changelist_list 644ORDER BY wc_id, local_relpath ASC, notify DESC 645 646-- STMT_CREATE_TARGETS_LIST 647DROP TABLE IF EXISTS targets_list; 648CREATE TEMPORARY TABLE targets_list ( 649 wc_id INTEGER NOT NULL, 650 local_relpath TEXT NOT NULL, 651 parent_relpath TEXT, 652 kind TEXT NOT NULL, 653 PRIMARY KEY (wc_id, local_relpath) 654 ); 655/* need more indicies? */ 656 657-- STMT_DROP_TARGETS_LIST 658DROP TABLE targets_list 659 660-- STMT_INSERT_TARGET 661INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) 662SELECT wc_id, local_relpath, parent_relpath, kind 663FROM nodes_current 664WHERE wc_id = ?1 665 AND local_relpath = ?2 666 667-- STMT_INSERT_TARGET_DEPTH_FILES 668INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) 669SELECT wc_id, local_relpath, parent_relpath, kind 670FROM nodes_current 671WHERE wc_id = ?1 672 AND parent_relpath = ?2 673 AND kind = MAP_FILE 674 675-- STMT_INSERT_TARGET_DEPTH_IMMEDIATES 676INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) 677SELECT wc_id, local_relpath, parent_relpath, kind 678FROM nodes_current 679WHERE wc_id = ?1 680 AND parent_relpath = ?2 681 682-- STMT_INSERT_TARGET_DEPTH_INFINITY 683INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) 684SELECT wc_id, local_relpath, parent_relpath, kind 685FROM nodes_current 686WHERE wc_id = ?1 687 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 688 689-- STMT_INSERT_TARGET_WITH_CHANGELIST 690INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) 691SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind 692 FROM actual_node AS A JOIN nodes_current AS N 693 ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath 694 WHERE N.wc_id = ?1 695 AND N.local_relpath = ?2 696 AND A.changelist = ?3 697 698-- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_FILES 699INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) 700SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind 701 FROM actual_node AS A JOIN nodes_current AS N 702 ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath 703 WHERE N.wc_id = ?1 704 AND N.parent_relpath = ?2 705 AND kind = MAP_FILE 706 AND A.changelist = ?3 707 708-- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_IMMEDIATES 709INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) 710SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind 711 FROM actual_node AS A JOIN nodes_current AS N 712 ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath 713 WHERE N.wc_id = ?1 714 AND N.parent_relpath = ?2 715 AND A.changelist = ?3 716 717-- STMT_INSERT_TARGET_WITH_CHANGELIST_DEPTH_INFINITY 718INSERT INTO targets_list(wc_id, local_relpath, parent_relpath, kind) 719SELECT N.wc_id, N.local_relpath, N.parent_relpath, N.kind 720 FROM actual_node AS A JOIN nodes_current AS N 721 ON A.wc_id = N.wc_id AND A.local_relpath = N.local_relpath 722 WHERE N.wc_id = ?1 723 AND IS_STRICT_DESCENDANT_OF(N.local_relpath, ?2) 724 AND A.changelist = ?3 725 726/* Only used by commented dump_targets() in wc_db.c */ 727/*-- STMT_SELECT_TARGETS 728SELECT local_relpath, parent_relpath from targets_list*/ 729 730-- STMT_INSERT_ACTUAL_EMPTIES 731INSERT OR IGNORE INTO actual_node ( 732 wc_id, local_relpath, parent_relpath) 733SELECT wc_id, local_relpath, parent_relpath 734FROM targets_list 735 736-- STMT_INSERT_ACTUAL_EMPTIES_FILES 737INSERT OR IGNORE INTO actual_node ( 738 wc_id, local_relpath, parent_relpath) 739SELECT wc_id, local_relpath, parent_relpath 740FROM targets_list 741WHERE kind=MAP_FILE 742 743-- STMT_DELETE_ACTUAL_EMPTY 744DELETE FROM actual_node 745WHERE wc_id = ?1 AND local_relpath = ?2 746 AND properties IS NULL 747 AND conflict_data IS NULL 748 AND changelist IS NULL 749 AND text_mod IS NULL 750 AND older_checksum IS NULL 751 AND right_checksum IS NULL 752 AND left_checksum IS NULL 753 754-- STMT_DELETE_ACTUAL_EMPTIES 755DELETE FROM actual_node 756WHERE wc_id = ?1 757 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 758 AND properties IS NULL 759 AND conflict_data IS NULL 760 AND changelist IS NULL 761 AND text_mod IS NULL 762 AND older_checksum IS NULL 763 AND right_checksum IS NULL 764 AND left_checksum IS NULL 765 766-- STMT_DELETE_BASE_NODE 767DELETE FROM nodes 768WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 769 770-- STMT_DELETE_WORKING_NODE 771DELETE FROM nodes 772WHERE wc_id = ?1 AND local_relpath = ?2 773 AND op_depth = (SELECT MAX(op_depth) FROM nodes 774 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0) 775 776-- STMT_DELETE_LOWEST_WORKING_NODE 777DELETE FROM nodes 778WHERE wc_id = ?1 AND local_relpath = ?2 779 AND op_depth = (SELECT MIN(op_depth) FROM nodes 780 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3) 781 AND presence = MAP_BASE_DELETED 782 783-- STMT_DELETE_NODE_ALL_LAYERS 784DELETE FROM nodes 785WHERE wc_id = ?1 AND local_relpath = ?2 786 787-- STMT_DELETE_NODES_ABOVE_DEPTH_RECURSIVE 788DELETE FROM nodes 789WHERE wc_id = ?1 790 AND (local_relpath = ?2 791 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 792 AND op_depth >= ?3 793 794-- STMT_DELETE_ACTUAL_NODE 795DELETE FROM actual_node 796WHERE wc_id = ?1 AND local_relpath = ?2 797 798/* Will not delete recursive when run on the wcroot */ 799-- STMT_DELETE_ACTUAL_NODE_RECURSIVE 800DELETE FROM actual_node 801WHERE wc_id = ?1 802 AND (local_relpath = ?2 803 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 804 805-- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST 806DELETE FROM actual_node 807WHERE wc_id = ?1 808 AND local_relpath = ?2 809 AND (changelist IS NULL 810 OR NOT EXISTS (SELECT 1 FROM nodes_current c 811 WHERE c.wc_id = ?1 AND c.local_relpath = ?2 812 AND c.kind = MAP_FILE)) 813 814-- STMT_DELETE_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE 815DELETE FROM actual_node 816WHERE wc_id = ?1 817 AND (local_relpath = ?2 818 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 819 AND (changelist IS NULL 820 OR NOT EXISTS (SELECT 1 FROM nodes_current c 821 WHERE c.wc_id = ?1 822 AND c.local_relpath = actual_node.local_relpath 823 AND c.kind = MAP_FILE)) 824 825-- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST 826UPDATE actual_node 827SET properties = NULL, 828 text_mod = NULL, 829 conflict_data = NULL, 830 tree_conflict_data = NULL, 831 older_checksum = NULL, 832 left_checksum = NULL, 833 right_checksum = NULL 834WHERE wc_id = ?1 AND local_relpath = ?2 835 836-- STMT_CLEAR_ACTUAL_NODE_LEAVING_CONFLICT 837UPDATE actual_node 838SET properties = NULL, 839 text_mod = NULL, 840 tree_conflict_data = NULL, 841 older_checksum = NULL, 842 left_checksum = NULL, 843 right_checksum = NULL, 844 changelist = NULL 845WHERE wc_id = ?1 AND local_relpath = ?2 846 847-- STMT_CLEAR_ACTUAL_NODE_LEAVING_CHANGELIST_RECURSIVE 848UPDATE actual_node 849SET properties = NULL, 850 text_mod = NULL, 851 conflict_data = NULL, 852 tree_conflict_data = NULL, 853 older_checksum = NULL, 854 left_checksum = NULL, 855 right_checksum = NULL 856WHERE wc_id = ?1 857 AND (local_relpath = ?2 858 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 859 860-- STMT_UPDATE_NODE_BASE_DEPTH 861UPDATE nodes SET depth = ?3 862WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 863 AND kind=MAP_DIR 864 AND presence IN (MAP_NORMAL, MAP_INCOMPLETE) 865 866-- STMT_UPDATE_NODE_BASE_PRESENCE 867UPDATE nodes SET presence = ?3 868WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 869 870-- STMT_UPDATE_BASE_NODE_PRESENCE_REVNUM_AND_REPOS_PATH 871UPDATE nodes SET presence = ?3, revision = ?4, repos_path = ?5 872WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 873 874-- STMT_LOOK_FOR_WORK 875SELECT id FROM work_queue LIMIT 1 876 877-- STMT_INSERT_WORK_ITEM 878INSERT INTO work_queue (work) VALUES (?1) 879 880-- STMT_SELECT_WORK_ITEM 881SELECT id, work FROM work_queue ORDER BY id LIMIT 1 882 883-- STMT_DELETE_WORK_ITEM 884DELETE FROM work_queue WHERE id = ?1 885 886-- STMT_INSERT_OR_IGNORE_PRISTINE 887INSERT OR IGNORE INTO pristine (checksum, md5_checksum, size, refcount) 888VALUES (?1, ?2, ?3, 0) 889 890-- STMT_INSERT_PRISTINE 891INSERT INTO pristine (checksum, md5_checksum, size, refcount) 892VALUES (?1, ?2, ?3, 0) 893 894-- STMT_SELECT_PRISTINE 895SELECT md5_checksum 896FROM pristine 897WHERE checksum = ?1 898 899-- STMT_SELECT_PRISTINE_SIZE 900SELECT size 901FROM pristine 902WHERE checksum = ?1 LIMIT 1 903 904-- STMT_SELECT_PRISTINE_BY_MD5 905SELECT checksum 906FROM pristine 907WHERE md5_checksum = ?1 908 909-- STMT_SELECT_UNREFERENCED_PRISTINES 910SELECT checksum 911FROM pristine 912WHERE refcount = 0 913 914-- STMT_DELETE_PRISTINE_IF_UNREFERENCED 915DELETE FROM pristine 916WHERE checksum = ?1 AND refcount = 0 917 918-- STMT_SELECT_COPY_PRISTINES 919/* For the root itself */ 920SELECT n.checksum, md5_checksum, size 921FROM nodes_current n 922LEFT JOIN pristine p ON n.checksum = p.checksum 923WHERE wc_id = ?1 924 AND n.local_relpath = ?2 925 AND n.checksum IS NOT NULL 926UNION ALL 927/* And all descendants */ 928SELECT n.checksum, md5_checksum, size 929FROM nodes n 930LEFT JOIN pristine p ON n.checksum = p.checksum 931WHERE wc_id = ?1 932 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2) 933 AND op_depth >= 934 (SELECT MAX(op_depth) FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2) 935 AND n.checksum IS NOT NULL 936 937-- STMT_VACUUM 938VACUUM 939 940-- STMT_SELECT_CONFLICT_VICTIMS 941SELECT local_relpath, conflict_data 942FROM actual_node 943WHERE wc_id = ?1 AND parent_relpath = ?2 AND 944 NOT (conflict_data IS NULL) 945 946-- STMT_INSERT_WC_LOCK 947INSERT INTO wc_lock (wc_id, local_dir_relpath, locked_levels) 948VALUES (?1, ?2, ?3) 949 950-- STMT_SELECT_WC_LOCK 951SELECT locked_levels FROM wc_lock 952WHERE wc_id = ?1 AND local_dir_relpath = ?2 953 954-- STMT_SELECT_ANCESTOR_WCLOCKS 955SELECT local_dir_relpath, locked_levels FROM wc_lock 956WHERE wc_id = ?1 957 AND ((local_dir_relpath >= ?3 AND local_dir_relpath <= ?2) 958 OR local_dir_relpath = '') 959 960-- STMT_DELETE_WC_LOCK 961DELETE FROM wc_lock 962WHERE wc_id = ?1 AND local_dir_relpath = ?2 963 964-- STMT_FIND_WC_LOCK 965SELECT local_dir_relpath FROM wc_lock 966WHERE wc_id = ?1 967 AND IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2) 968 969-- STMT_FIND_CONFLICT_DESCENDANT 970SELECT 1 FROM actual_node 971WHERE wc_id = ?1 972 AND local_relpath > (?2 || '/') 973 AND local_relpath < (?2 || '0') /* '0' = ascii('/') +1 */ 974 AND conflict_data IS NOT NULL 975LIMIT 1 976 977-- STMT_DELETE_WC_LOCK_ORPHAN 978DELETE FROM wc_lock 979WHERE wc_id = ?1 AND local_dir_relpath = ?2 980AND NOT EXISTS (SELECT 1 FROM nodes 981 WHERE nodes.wc_id = ?1 982 AND nodes.local_relpath = wc_lock.local_dir_relpath) 983 984-- STMT_DELETE_WC_LOCK_ORPHAN_RECURSIVE 985DELETE FROM wc_lock 986WHERE wc_id = ?1 987 AND (local_dir_relpath = ?2 988 OR IS_STRICT_DESCENDANT_OF(local_dir_relpath, ?2)) 989 AND NOT EXISTS (SELECT 1 FROM nodes 990 WHERE nodes.wc_id = ?1 991 AND nodes.local_relpath = wc_lock.local_dir_relpath) 992 993-- STMT_APPLY_CHANGES_TO_BASE_NODE 994/* translated_size and last_mod_time are not mentioned here because they will 995 be tweaked after the working-file is installed. When we replace an existing 996 BASE node (read: bump), preserve its file_external status. */ 997INSERT OR REPLACE INTO nodes ( 998 wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, 999 revision, presence, depth, kind, changed_revision, changed_date, 1000 changed_author, checksum, properties, dav_cache, symlink_target, 1001 inherited_props, file_external ) 1002VALUES (?1, ?2, 0, 1003 ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, 1004 (SELECT file_external FROM nodes 1005 WHERE wc_id = ?1 1006 AND local_relpath = ?2 1007 AND op_depth = 0)) 1008 1009-- STMT_INSTALL_WORKING_NODE_FOR_DELETE 1010INSERT INTO nodes ( 1011 wc_id, local_relpath, op_depth, 1012 parent_relpath, presence, kind) 1013VALUES(?1, ?2, ?3, ?4, MAP_BASE_DELETED, ?5) 1014 1015-- STMT_REPLACE_WITH_BASE_DELETED 1016INSERT OR REPLACE INTO nodes (wc_id, local_relpath, op_depth, parent_relpath, 1017 kind, moved_to, presence) 1018SELECT wc_id, local_relpath, op_depth, parent_relpath, 1019 kind, moved_to, MAP_BASE_DELETED 1020 FROM nodes 1021 WHERE wc_id = ?1 1022 AND local_relpath = ?2 1023 AND op_depth = ?3 1024 1025/* If this query is updated, STMT_INSERT_DELETE_LIST should too. 1026 Use UNION ALL instead of a simple 'OR' to avoid creating a temp table */ 1027-- STMT_INSERT_DELETE_FROM_NODE_RECURSIVE 1028INSERT INTO nodes ( 1029 wc_id, local_relpath, op_depth, parent_relpath, presence, kind) 1030SELECT wc_id, local_relpath, ?4 /*op_depth*/, parent_relpath, MAP_BASE_DELETED, 1031 kind 1032FROM nodes 1033WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 1034UNION ALL 1035SELECT wc_id, local_relpath, ?4 /*op_depth*/, parent_relpath, MAP_BASE_DELETED, 1036 kind 1037FROM nodes 1038WHERE wc_id = ?1 1039 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1040 AND op_depth = ?3 1041 AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED) 1042 AND file_external IS NULL 1043ORDER BY local_relpath 1044 1045-- STMT_INSERT_WORKING_NODE_FROM_BASE_COPY 1046INSERT OR REPLACE INTO nodes ( 1047 wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, 1048 revision, presence, depth, kind, changed_revision, changed_date, 1049 changed_author, checksum, properties, translated_size, last_mod_time, 1050 symlink_target, moved_to ) 1051SELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath, repos_id, 1052 repos_path, revision, presence, depth, kind, changed_revision, 1053 changed_date, changed_author, checksum, properties, translated_size, 1054 last_mod_time, symlink_target, 1055 (SELECT moved_to FROM nodes 1056 WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3) moved_to 1057FROM nodes 1058WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 1059 1060-- STMT_INSERT_DELETE_FROM_BASE 1061INSERT INTO nodes ( 1062 wc_id, local_relpath, op_depth, parent_relpath, presence, kind) 1063SELECT wc_id, local_relpath, ?3 /*op_depth*/, parent_relpath, 1064 MAP_BASE_DELETED, kind 1065FROM nodes 1066WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 1067 1068/* Not valid on the wc-root */ 1069-- STMT_UPDATE_OP_DEPTH_INCREASE_RECURSIVE 1070UPDATE nodes SET op_depth = ?3 + 1 1071WHERE wc_id = ?1 1072 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1073 AND op_depth = ?3 1074 1075/* Duplicated SELECT body to avoid creating temporary table */ 1076-- STMT_COPY_OP_DEPTH_RECURSIVE 1077INSERT INTO nodes ( 1078 wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path, 1079 revision, presence, depth, kind, changed_revision, changed_date, 1080 changed_author, checksum, properties, translated_size, last_mod_time, 1081 symlink_target, moved_here, moved_to ) 1082SELECT 1083 wc_id, local_relpath, ?4, parent_relpath, repos_id, 1084 repos_path, revision, presence, depth, kind, changed_revision, 1085 changed_date, changed_author, checksum, properties, translated_size, 1086 last_mod_time, symlink_target, NULL, NULL 1087FROM nodes 1088WHERE wc_id = ?1 AND op_depth = ?3 AND local_relpath = ?2 1089UNION ALL 1090SELECT 1091 wc_id, local_relpath, ?4, parent_relpath, repos_id, 1092 repos_path, revision, presence, depth, kind, changed_revision, 1093 changed_date, changed_author, checksum, properties, translated_size, 1094 last_mod_time, symlink_target, NULL, NULL 1095FROM nodes 1096WHERE wc_id = ?1 AND op_depth = ?3 1097 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1098ORDER BY local_relpath 1099 1100-- STMT_DOES_NODE_EXIST 1101SELECT 1 FROM nodes WHERE wc_id = ?1 AND local_relpath = ?2 1102LIMIT 1 1103 1104-- STMT_HAS_SERVER_EXCLUDED_DESCENDANTS 1105SELECT local_relpath FROM nodes 1106WHERE wc_id = ?1 1107 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1108 AND op_depth = 0 AND presence = MAP_SERVER_EXCLUDED 1109LIMIT 1 1110 1111/* Select all excluded nodes. Not valid on the WC-root */ 1112-- STMT_SELECT_ALL_EXCLUDED_DESCENDANTS 1113SELECT local_relpath FROM nodes 1114WHERE wc_id = ?1 1115 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1116 AND op_depth = 0 1117 AND (presence = MAP_SERVER_EXCLUDED OR presence = MAP_EXCLUDED) 1118 1119/* Creates a copy from one top level NODE to a different location */ 1120-- STMT_INSERT_WORKING_NODE_COPY_FROM 1121INSERT OR REPLACE INTO nodes ( 1122 wc_id, local_relpath, op_depth, parent_relpath, repos_id, 1123 repos_path, revision, presence, depth, moved_here, kind, changed_revision, 1124 changed_date, changed_author, checksum, properties, translated_size, 1125 last_mod_time, symlink_target, moved_to ) 1126SELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/, 1127 repos_id, repos_path, revision, ?6 /*presence*/, depth, 1128 ?7/*moved_here*/, kind, changed_revision, changed_date, 1129 changed_author, checksum, properties, translated_size, 1130 last_mod_time, symlink_target, 1131 (SELECT dst.moved_to FROM nodes AS dst 1132 WHERE dst.wc_id = ?1 1133 AND dst.local_relpath = ?3 1134 AND dst.op_depth = ?4) 1135FROM nodes_current 1136WHERE wc_id = ?1 AND local_relpath = ?2 1137 1138-- STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH 1139INSERT OR REPLACE INTO nodes ( 1140 wc_id, local_relpath, op_depth, parent_relpath, repos_id, 1141 repos_path, revision, presence, depth, moved_here, kind, changed_revision, 1142 changed_date, changed_author, checksum, properties, translated_size, 1143 last_mod_time, symlink_target, moved_to ) 1144SELECT wc_id, ?3 /*local_relpath*/, ?4 /*op_depth*/, ?5 /*parent_relpath*/, 1145 repos_id, repos_path, revision, ?6 /*presence*/, depth, 1146 ?8 /*moved_here*/, kind, changed_revision, changed_date, 1147 changed_author, checksum, properties, translated_size, 1148 last_mod_time, symlink_target, 1149 (SELECT dst.moved_to FROM nodes AS dst 1150 WHERE dst.wc_id = ?1 1151 AND dst.local_relpath = ?3 1152 AND dst.op_depth = ?4) 1153FROM nodes 1154WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?7 1155 1156-- STMT_UPDATE_BASE_REVISION 1157UPDATE nodes SET revision = ?3 1158WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 1159 1160-- STMT_UPDATE_BASE_REPOS 1161UPDATE nodes SET repos_id = ?3, repos_path = ?4 1162WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0 1163 1164-- STMT_ACTUAL_HAS_CHILDREN 1165SELECT 1 FROM actual_node 1166WHERE wc_id = ?1 AND parent_relpath = ?2 1167LIMIT 1 1168 1169-- STMT_INSERT_EXTERNAL 1170INSERT OR REPLACE INTO externals ( 1171 wc_id, local_relpath, parent_relpath, presence, kind, def_local_relpath, 1172 repos_id, def_repos_relpath, def_operational_revision, def_revision) 1173VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10) 1174 1175-- STMT_SELECT_EXTERNAL_INFO 1176SELECT presence, kind, def_local_relpath, repos_id, 1177 def_repos_relpath, def_operational_revision, def_revision 1178FROM externals WHERE wc_id = ?1 AND local_relpath = ?2 1179LIMIT 1 1180 1181-- STMT_DELETE_FILE_EXTERNALS 1182DELETE FROM nodes 1183WHERE wc_id = ?1 1184 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1185 AND op_depth = 0 1186 AND file_external IS NOT NULL 1187 1188-- STMT_DELETE_FILE_EXTERNAL_REGISTATIONS 1189DELETE FROM externals 1190WHERE wc_id = ?1 1191 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1192 AND kind != MAP_DIR 1193 1194-- STMT_DELETE_EXTERNAL_REGISTATIONS 1195DELETE FROM externals 1196WHERE wc_id = ?1 1197 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1198 1199/* Select all committable externals, i.e. only unpegged ones on the same 1200 * repository as the target path ?2, that are defined by WC ?1 to 1201 * live below the target path. It does not matter which ancestor has the 1202 * svn:externals definition, only the local path at which the external is 1203 * supposed to be checked out is queried. 1204 * Arguments: 1205 * ?1: wc_id. 1206 * ?2: the target path, local relpath inside ?1. 1207 * 1208 * ### NOTE: This statement deliberately removes file externals that live 1209 * inside an unversioned dir, because commit still breaks on those. 1210 * Once that's been fixed, the conditions below "--->8---" become obsolete. */ 1211-- STMT_SELECT_COMMITTABLE_EXTERNALS_BELOW 1212SELECT local_relpath, kind, def_repos_relpath, 1213 (SELECT root FROM repository AS r WHERE r.id = e.repos_id) 1214FROM externals e 1215WHERE wc_id = ?1 1216 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1217 AND def_revision IS NULL 1218 AND repos_id = (SELECT repos_id 1219 FROM nodes AS n 1220 WHERE n.wc_id = ?1 1221 AND n.local_relpath = '' 1222 AND n.op_depth = 0) 1223 AND ((kind='dir') 1224 OR EXISTS (SELECT 1 FROM nodes 1225 WHERE nodes.wc_id = e.wc_id 1226 AND nodes.local_relpath = e.parent_relpath)) 1227 1228-- STMT_SELECT_COMMITTABLE_EXTERNALS_IMMEDIATELY_BELOW 1229SELECT local_relpath, kind, def_repos_relpath, 1230 (SELECT root FROM repository AS r WHERE r.id = e.repos_id) 1231FROM externals e 1232WHERE wc_id = ?1 1233 AND IS_STRICT_DESCENDANT_OF(e.local_relpath, ?2) 1234 AND parent_relpath = ?2 1235 AND def_revision IS NULL 1236 AND repos_id = (SELECT repos_id 1237 FROM nodes AS n 1238 WHERE n.wc_id = ?1 1239 AND n.local_relpath = '' 1240 AND n.op_depth = 0) 1241 AND ((kind='dir') 1242 OR EXISTS (SELECT 1 FROM nodes 1243 WHERE nodes.wc_id = e.wc_id 1244 AND nodes.local_relpath = e.parent_relpath)) 1245 1246-- STMT_SELECT_EXTERNALS_DEFINED 1247SELECT local_relpath, def_local_relpath 1248FROM externals 1249/* ### The Sqlite optimizer needs help here ### 1250 * WHERE wc_id = ?1 1251 * AND (def_local_relpath = ?2 1252 * OR IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2)) */ 1253WHERE (wc_id = ?1 AND def_local_relpath = ?2) 1254 OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(def_local_relpath, ?2)) 1255 1256-- STMT_DELETE_EXTERNAL 1257DELETE FROM externals 1258WHERE wc_id = ?1 AND local_relpath = ?2 1259 1260-- STMT_SELECT_EXTERNAL_PROPERTIES 1261/* ### It would be nice if Sqlite would handle 1262 * SELECT IFNULL((SELECT properties FROM actual_node a 1263 * WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath), 1264 * properties), 1265 * local_relpath, depth 1266 * FROM nodes_current n 1267 * WHERE wc_id = ?1 1268 * AND (local_relpath = ?2 1269 * OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 1270 * AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE) 1271 * ### But it would take a double table scan execution plan for it. 1272 * ### Maybe there is something else going on? */ 1273SELECT IFNULL((SELECT properties FROM actual_node a 1274 WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath), 1275 properties), 1276 local_relpath, depth 1277FROM nodes_current n 1278WHERE wc_id = ?1 AND local_relpath = ?2 1279 AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE) 1280UNION ALL 1281SELECT IFNULL((SELECT properties FROM actual_node a 1282 WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath), 1283 properties), 1284 local_relpath, depth 1285FROM nodes_current n 1286WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1287 AND kind = MAP_DIR AND presence IN (MAP_NORMAL, MAP_INCOMPLETE) 1288 1289-- STMT_SELECT_CURRENT_PROPS_RECURSIVE 1290/* ### Ugly OR to make sqlite use the proper optimizations */ 1291SELECT IFNULL((SELECT properties FROM actual_node a 1292 WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath), 1293 properties), 1294 local_relpath 1295FROM nodes_current n 1296WHERE (wc_id = ?1 AND local_relpath = ?2) 1297 OR (wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 1298 1299-- STMT_PRAGMA_LOCKING_MODE 1300PRAGMA locking_mode = exclusive; 1301/* Testing shows DELETE is faster than TRUNCATE on NFS and 1302 exclusive-locking is mostly used on remote file systems. */ 1303PRAGMA journal_mode = DELETE 1304 1305-- STMT_FIND_REPOS_PATH_IN_WC 1306SELECT local_relpath FROM nodes_current 1307 WHERE wc_id = ?1 AND repos_path = ?2 1308 1309/* ------------------------------------------------------------------------- */ 1310 1311/* these are used in entries.c */ 1312 1313-- STMT_INSERT_ACTUAL_NODE 1314INSERT OR REPLACE INTO actual_node ( 1315 wc_id, local_relpath, parent_relpath, properties, changelist, conflict_data) 1316VALUES (?1, ?2, ?3, ?4, ?5, ?6) 1317 1318/* ------------------------------------------------------------------------- */ 1319 1320/* these are used in upgrade.c */ 1321 1322-- STMT_SELECT_ALL_FILES 1323SELECT local_relpath FROM nodes_current 1324WHERE wc_id = ?1 AND parent_relpath = ?2 AND kind = MAP_FILE 1325 1326-- STMT_UPDATE_NODE_PROPS 1327UPDATE nodes SET properties = ?4 1328WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 1329 1330-- STMT_PRAGMA_TABLE_INFO_NODES 1331PRAGMA table_info("NODES") 1332 1333/* -------------------------------------------------------------------------- 1334 * Complex queries for callback walks, caching results in a temporary table. 1335 * 1336 * These target table are then used for joins against NODES, or for reporting 1337 */ 1338 1339-- STMT_CREATE_TARGET_PROP_CACHE 1340DROP TABLE IF EXISTS target_prop_cache; 1341CREATE TEMPORARY TABLE target_prop_cache ( 1342 local_relpath TEXT NOT NULL PRIMARY KEY, 1343 kind TEXT NOT NULL, 1344 properties BLOB 1345); 1346/* ### Need index? 1347CREATE UNIQUE INDEX temp__node_props_cache_unique 1348 ON temp__node_props_cache (local_relpath) */ 1349 1350-- STMT_CACHE_TARGET_PROPS 1351INSERT INTO target_prop_cache(local_relpath, kind, properties) 1352 SELECT n.local_relpath, n.kind, 1353 IFNULL((SELECT properties FROM actual_node AS a 1354 WHERE a.wc_id = n.wc_id 1355 AND a.local_relpath = n.local_relpath), 1356 n.properties) 1357 FROM targets_list AS t 1358 JOIN nodes AS n 1359 ON n.wc_id = ?1 1360 AND n.local_relpath = t.local_relpath 1361 AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3 1362 WHERE n3.wc_id = ?1 1363 AND n3.local_relpath = t.local_relpath) 1364 WHERE t.wc_id = ?1 1365 AND (presence=MAP_NORMAL OR presence=MAP_INCOMPLETE) 1366 ORDER BY t.local_relpath 1367 1368-- STMT_CACHE_TARGET_PRISTINE_PROPS 1369INSERT INTO target_prop_cache(local_relpath, kind, properties) 1370 SELECT n.local_relpath, n.kind, 1371 CASE n.presence 1372 WHEN MAP_BASE_DELETED 1373 THEN (SELECT properties FROM nodes AS p 1374 WHERE p.wc_id = n.wc_id 1375 AND p.local_relpath = n.local_relpath 1376 AND p.op_depth < n.op_depth 1377 ORDER BY p.op_depth DESC /* LIMIT 1 */) 1378 ELSE properties END 1379 FROM targets_list AS t 1380 JOIN nodes AS n 1381 ON n.wc_id = ?1 1382 AND n.local_relpath = t.local_relpath 1383 AND n.op_depth = (SELECT MAX(op_depth) FROM nodes AS n3 1384 WHERE n3.wc_id = ?1 1385 AND n3.local_relpath = t.local_relpath) 1386 WHERE t.wc_id = ?1 1387 AND (presence = MAP_NORMAL 1388 OR presence = MAP_INCOMPLETE 1389 OR presence = MAP_BASE_DELETED) 1390 ORDER BY t.local_relpath 1391 1392-- STMT_SELECT_ALL_TARGET_PROP_CACHE 1393SELECT local_relpath, properties FROM target_prop_cache 1394ORDER BY local_relpath 1395 1396-- STMT_DROP_TARGET_PROP_CACHE 1397DROP TABLE target_prop_cache; 1398 1399-- STMT_CREATE_REVERT_LIST 1400DROP TABLE IF EXISTS revert_list; 1401CREATE TEMPORARY TABLE revert_list ( 1402 /* need wc_id if/when revert spans multiple working copies */ 1403 local_relpath TEXT NOT NULL, 1404 actual INTEGER NOT NULL, /* 1 if an actual row, 0 if a nodes row */ 1405 conflict_data BLOB, 1406 notify INTEGER, /* 1 if an actual row had props or tree conflict */ 1407 op_depth INTEGER, 1408 repos_id INTEGER, 1409 kind TEXT, 1410 PRIMARY KEY (local_relpath, actual) 1411 ); 1412DROP TRIGGER IF EXISTS trigger_revert_list_nodes; 1413CREATE TEMPORARY TRIGGER trigger_revert_list_nodes 1414BEFORE DELETE ON nodes 1415BEGIN 1416 INSERT OR REPLACE INTO revert_list(local_relpath, actual, op_depth, 1417 repos_id, kind) 1418 SELECT OLD.local_relpath, 0, OLD.op_depth, OLD.repos_id, OLD.kind; 1419END; 1420DROP TRIGGER IF EXISTS trigger_revert_list_actual_delete; 1421CREATE TEMPORARY TRIGGER trigger_revert_list_actual_delete 1422BEFORE DELETE ON actual_node 1423BEGIN 1424 INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data, 1425 notify) 1426 SELECT OLD.local_relpath, 1, OLD.conflict_data, 1427 CASE 1428 WHEN OLD.properties IS NOT NULL 1429 THEN 1 1430 WHEN NOT EXISTS(SELECT 1 FROM NODES n 1431 WHERE n.wc_id = OLD.wc_id 1432 AND n.local_relpath = OLD.local_relpath) 1433 THEN 1 1434 END notify 1435 WHERE OLD.conflict_data IS NOT NULL 1436 OR notify IS NOT NULL; 1437END; 1438DROP TRIGGER IF EXISTS trigger_revert_list_actual_update; 1439CREATE TEMPORARY TRIGGER trigger_revert_list_actual_update 1440BEFORE UPDATE ON actual_node 1441BEGIN 1442 INSERT OR REPLACE INTO revert_list(local_relpath, actual, conflict_data, 1443 notify) 1444 SELECT OLD.local_relpath, 1, OLD.conflict_data, 1445 CASE 1446 WHEN OLD.properties IS NOT NULL 1447 THEN 1 1448 WHEN NOT EXISTS(SELECT 1 FROM NODES n 1449 WHERE n.wc_id = OLD.wc_id 1450 AND n.local_relpath = OLD.local_relpath) 1451 THEN 1 1452 END notify 1453 WHERE OLD.conflict_data IS NOT NULL 1454 OR notify IS NOT NULL; 1455END 1456 1457-- STMT_DROP_REVERT_LIST_TRIGGERS 1458DROP TRIGGER trigger_revert_list_nodes; 1459DROP TRIGGER trigger_revert_list_actual_delete; 1460DROP TRIGGER trigger_revert_list_actual_update 1461 1462-- STMT_SELECT_REVERT_LIST 1463SELECT actual, notify, kind, op_depth, repos_id, conflict_data 1464FROM revert_list 1465WHERE local_relpath = ?1 1466ORDER BY actual DESC 1467 1468-- STMT_SELECT_REVERT_LIST_COPIED_CHILDREN 1469SELECT local_relpath, kind 1470FROM revert_list 1471WHERE IS_STRICT_DESCENDANT_OF(local_relpath, ?1) 1472 AND op_depth >= ?2 1473 AND repos_id IS NOT NULL 1474ORDER BY local_relpath 1475 1476-- STMT_DELETE_REVERT_LIST 1477DELETE FROM revert_list WHERE local_relpath = ?1 1478 1479-- STMT_SELECT_REVERT_LIST_RECURSIVE 1480SELECT p.local_relpath, n.kind, a.notify, a.kind 1481FROM (SELECT DISTINCT local_relpath 1482 FROM revert_list 1483 WHERE (local_relpath = ?1 1484 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1))) p 1485 1486LEFT JOIN revert_list n ON n.local_relpath=p.local_relpath AND n.actual=0 1487LEFT JOIN revert_list a ON a.local_relpath=p.local_relpath AND a.actual=1 1488ORDER BY p.local_relpath 1489 1490-- STMT_DELETE_REVERT_LIST_RECURSIVE 1491DELETE FROM revert_list 1492WHERE (local_relpath = ?1 1493 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?1)) 1494 1495-- STMT_DROP_REVERT_LIST 1496DROP TABLE IF EXISTS revert_list 1497 1498-- STMT_CREATE_DELETE_LIST 1499DROP TABLE IF EXISTS delete_list; 1500CREATE TEMPORARY TABLE delete_list ( 1501/* ### we should put the wc_id in here in case a delete spans multiple 1502 ### working copies. queries, etc will need to be adjusted. */ 1503 local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE 1504 ) 1505 1506/* This matches the selection in STMT_INSERT_DELETE_FROM_NODE_RECURSIVE. 1507 A subquery is used instead of nodes_current to avoid a table scan */ 1508-- STMT_INSERT_DELETE_LIST 1509INSERT INTO delete_list(local_relpath) 1510SELECT ?2 1511UNION ALL 1512SELECT local_relpath FROM nodes AS n 1513WHERE wc_id = ?1 1514 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1515 AND op_depth >= ?3 1516 AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s 1517 WHERE s.wc_id = ?1 1518 AND s.local_relpath = n.local_relpath) 1519 AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED) 1520 AND file_external IS NULL 1521ORDER by local_relpath 1522 1523-- STMT_SELECT_DELETE_LIST 1524SELECT local_relpath FROM delete_list 1525ORDER BY local_relpath 1526 1527-- STMT_FINALIZE_DELETE 1528DROP TABLE IF EXISTS delete_list 1529 1530-- STMT_CREATE_UPDATE_MOVE_LIST 1531DROP TABLE IF EXISTS update_move_list; 1532CREATE TEMPORARY TABLE update_move_list ( 1533/* ### we should put the wc_id in here in case a move update spans multiple 1534 ### working copies. queries, etc will need to be adjusted. */ 1535 local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE, 1536 action INTEGER NOT NULL, 1537 kind TEXT NOT NULL, 1538 content_state INTEGER NOT NULL, 1539 prop_state INTEGER NOT NULL 1540 ) 1541 1542-- STMT_INSERT_UPDATE_MOVE_LIST 1543INSERT INTO update_move_list(local_relpath, action, kind, content_state, 1544 prop_state) 1545VALUES (?1, ?2, ?3, ?4, ?5) 1546 1547-- STMT_SELECT_UPDATE_MOVE_LIST 1548SELECT local_relpath, action, kind, content_state, prop_state 1549FROM update_move_list 1550ORDER BY local_relpath 1551 1552-- STMT_FINALIZE_UPDATE_MOVE 1553DROP TABLE IF EXISTS update_move_list 1554 1555-- STMT_MOVE_NOTIFY_TO_REVERT 1556INSERT INTO revert_list (local_relpath, notify, kind, actual) 1557 SELECT local_relpath, 2, kind, 1 FROM update_move_list; 1558DROP TABLE update_move_list 1559 1560/* ------------------------------------------------------------------------- */ 1561 1562/* Queries for revision status. */ 1563 1564-- STMT_SELECT_MIN_MAX_REVISIONS 1565SELECT MIN(revision), MAX(revision), 1566 MIN(changed_revision), MAX(changed_revision) FROM nodes 1567 WHERE wc_id = ?1 1568 AND (local_relpath = ?2 1569 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 1570 AND presence IN (MAP_NORMAL, MAP_INCOMPLETE) 1571 AND file_external IS NULL 1572 AND op_depth = 0 1573 1574-- STMT_HAS_SPARSE_NODES 1575SELECT 1 FROM nodes 1576WHERE wc_id = ?1 1577 AND (local_relpath = ?2 1578 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 1579 AND op_depth = 0 1580 AND (presence IN (MAP_SERVER_EXCLUDED, MAP_EXCLUDED) 1581 OR depth NOT IN (MAP_DEPTH_INFINITY, MAP_DEPTH_UNKNOWN)) 1582 AND file_external IS NULL 1583LIMIT 1 1584 1585-- STMT_SUBTREE_HAS_TREE_MODIFICATIONS 1586SELECT 1 FROM nodes 1587WHERE wc_id = ?1 1588 AND (local_relpath = ?2 1589 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 1590 AND op_depth > 0 1591LIMIT 1 1592 1593-- STMT_SUBTREE_HAS_PROP_MODIFICATIONS 1594SELECT 1 FROM actual_node 1595WHERE wc_id = ?1 1596 AND (local_relpath = ?2 1597 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 1598 AND properties IS NOT NULL 1599LIMIT 1 1600 1601-- STMT_HAS_SWITCHED 1602SELECT 1 1603FROM nodes 1604WHERE wc_id = ?1 1605 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1606 AND op_depth = 0 1607 AND file_external IS NULL 1608 AND presence IN (MAP_NORMAL, MAP_INCOMPLETE) 1609 AND repos_path IS NOT RELPATH_SKIP_JOIN(?2, ?3, local_relpath) 1610LIMIT 1 1611 1612-- STMT_SELECT_MOVED_FROM_RELPATH 1613SELECT local_relpath, op_depth FROM nodes 1614WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0 1615 1616-- STMT_UPDATE_MOVED_TO_RELPATH 1617UPDATE nodes SET moved_to = ?4 1618WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 1619 1620-- STMT_CLEAR_MOVED_TO_RELPATH 1621UPDATE nodes SET moved_to = NULL 1622WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = ?3 1623 1624-- STMT_CLEAR_MOVED_HERE_RECURSIVE 1625UPDATE nodes SET moved_here = NULL 1626WHERE wc_id = ?1 1627 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 1628 AND op_depth = ?3 1629 1630/* This statement returns pairs of move-roots below the path ?2 in WC_ID ?1. 1631 * Each row returns a moved-here path (always a child of ?2) in the first 1632 * column, and its matching moved-away (deleted) path in the second column. */ 1633-- STMT_SELECT_MOVED_HERE_CHILDREN 1634SELECT moved_to, local_relpath FROM nodes 1635WHERE wc_id = ?1 AND op_depth > 0 1636 AND IS_STRICT_DESCENDANT_OF(moved_to, ?2) 1637 1638/* If the node is moved here (r.moved_here = 1) we are really interested in 1639 where the node was moved from. To obtain that we need the op_depth, but 1640 this form of select only allows a single return value */ 1641-- STMT_SELECT_MOVED_FOR_DELETE 1642SELECT local_relpath, moved_to, op_depth, 1643 (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r 1644 WHERE r.wc_id = ?1 1645 AND r.local_relpath = n.local_relpath 1646 AND r.op_depth < n.op_depth 1647 ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth 1648 FROM nodes n 1649WHERE wc_id = ?1 1650 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 1651 AND moved_to IS NOT NULL 1652 AND op_depth >= ?3 1653 1654-- STMT_SELECT_MOVED_FROM_FOR_DELETE 1655SELECT local_relpath, op_depth, 1656 (SELECT CASE WHEN r.moved_here THEN r.op_depth END FROM nodes r 1657 WHERE r.wc_id = ?1 1658 AND r.local_relpath = n.local_relpath 1659 AND r.op_depth < n.op_depth 1660 ORDER BY r.op_depth DESC LIMIT 1) AS moved_here_op_depth 1661 FROM nodes n 1662WHERE wc_id = ?1 AND moved_to = ?2 AND op_depth > 0 1663 1664-- STMT_UPDATE_MOVED_TO_DESCENDANTS 1665UPDATE nodes SET moved_to = RELPATH_SKIP_JOIN(?2, ?3, moved_to) 1666 WHERE wc_id = ?1 1667 AND IS_STRICT_DESCENDANT_OF(moved_to, ?2) 1668 1669-- STMT_CLEAR_MOVED_TO_DESCENDANTS 1670UPDATE nodes SET moved_to = NULL 1671 WHERE wc_id = ?1 1672 AND IS_STRICT_DESCENDANT_OF(moved_to, ?2) 1673 1674-- STMT_SELECT_MOVED_PAIR3 1675SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind 1676FROM nodes n 1677JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath 1678 AND d.op_depth = (SELECT MIN(dd.op_depth) 1679 FROM nodes dd 1680 WHERE dd.wc_id = ?1 1681 AND dd.local_relpath = d.local_relpath 1682 AND dd.op_depth > ?3) 1683WHERE n.wc_id = ?1 AND n.local_relpath = ?2 AND n.op_depth = ?3 1684 AND d.moved_to IS NOT NULL 1685UNION ALL 1686SELECT n.local_relpath, d.moved_to, d.op_depth, n.kind 1687FROM nodes n 1688JOIN nodes d ON d.wc_id = ?1 AND d.local_relpath = n.local_relpath 1689 AND d.op_depth = (SELECT MIN(dd.op_depth) 1690 FROM nodes dd 1691 WHERE dd.wc_id = ?1 1692 AND dd.local_relpath = d.local_relpath 1693 AND dd.op_depth > ?3) 1694WHERE n.wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2) 1695 AND n.op_depth = ?3 1696 AND d.moved_to IS NOT NULL 1697ORDER BY n.local_relpath 1698 1699-- STMT_SELECT_MOVED_OUTSIDE 1700SELECT local_relpath, moved_to, op_depth FROM nodes 1701WHERE wc_id = ?1 1702 AND (local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 1703 AND op_depth >= ?3 1704 AND moved_to IS NOT NULL 1705 AND NOT IS_STRICT_DESCENDANT_OF(moved_to, ?2) 1706 1707-- STMT_SELECT_MOVED_DESCENDANTS_SRC 1708SELECT s.op_depth, n.local_relpath, n.kind, n.repos_path, s.moved_to 1709FROM nodes n 1710JOIN nodes s ON s.wc_id = n.wc_id AND s.local_relpath = n.local_relpath 1711 AND s.op_depth = (SELECT MIN(d.op_depth) 1712 FROM nodes d 1713 WHERE d.wc_id = ?1 1714 AND d.local_relpath = s.local_relpath 1715 AND d.op_depth > ?3) 1716WHERE n.wc_id = ?1 AND n.op_depth = ?3 1717 AND (n.local_relpath = ?2 OR IS_STRICT_DESCENDANT_OF(n.local_relpath, ?2)) 1718 AND s.moved_to IS NOT NULL 1719 1720-- STMT_COMMIT_UPDATE_ORIGIN 1721UPDATE nodes SET repos_id = ?4, 1722 repos_path = RELPATH_SKIP_JOIN(?2, ?5, local_relpath), 1723 revision = ?6 1724WHERE wc_id = ?1 1725 AND (local_relpath = ?2 1726 OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2)) 1727 AND op_depth = ?3 1728 1729-- STMT_HAS_LAYER_BETWEEN 1730SELECT 1 FROM NODES 1731WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > ?3 AND op_depth < ?4 1732 1733-- STMT_SELECT_REPOS_PATH_REVISION 1734SELECT local_relpath, repos_path, revision FROM nodes 1735WHERE wc_id = ?1 1736 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1737 AND op_depth = 0 1738ORDER BY local_relpath 1739 1740-- STMT_SELECT_HAS_NON_FILE_CHILDREN 1741SELECT 1 FROM nodes 1742WHERE wc_id = ?1 AND parent_relpath = ?2 AND op_depth = ?3 AND kind != MAP_FILE 1743LIMIT 1 1744 1745-- STMT_SELECT_HAS_GRANDCHILDREN 1746SELECT 1 FROM nodes 1747WHERE wc_id = ?1 1748 AND IS_STRICT_DESCENDANT_OF(parent_relpath, ?2) 1749 AND op_depth = ?3 1750 AND file_external IS NULL 1751LIMIT 1 1752 1753/* ------------------------------------------------------------------------- */ 1754 1755/* Queries for verification. */ 1756 1757-- STMT_SELECT_ALL_NODES 1758SELECT op_depth, local_relpath, parent_relpath, file_external FROM nodes 1759WHERE wc_id = ?1 1760 1761/* ------------------------------------------------------------------------- */ 1762 1763/* Queries for cached inherited properties. */ 1764 1765/* Update the inherited properties of a single base node. */ 1766-- STMT_UPDATE_IPROP 1767UPDATE nodes 1768SET inherited_props = ?3 1769WHERE (wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0) 1770 1771/* Select a single path if its base node has cached inherited properties. */ 1772-- STMT_SELECT_IPROPS_NODE 1773SELECT local_relpath, repos_path FROM nodes 1774WHERE wc_id = ?1 1775 AND local_relpath = ?2 1776 AND op_depth = 0 1777 AND (inherited_props not null) 1778 1779/* Select all paths whose base nodes are below a given path, which 1780 have cached inherited properties. */ 1781-- STMT_SELECT_IPROPS_RECURSIVE 1782SELECT local_relpath, repos_path FROM nodes 1783WHERE wc_id = ?1 1784 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) 1785 AND op_depth = 0 1786 AND (inherited_props not null) 1787 1788-- STMT_SELECT_IPROPS_CHILDREN 1789SELECT local_relpath, repos_path FROM nodes 1790WHERE wc_id = ?1 1791 AND parent_relpath = ?2 1792 AND op_depth = 0 1793 AND (inherited_props not null) 1794 1795-- STMT_HAVE_STAT1_TABLE 1796SELECT 1 FROM sqlite_master WHERE name='sqlite_stat1' AND type='table' 1797LIMIT 1 1798 1799-- STMT_SELECT_COPIES_OF_REPOS_RELPATH 1800SELECT local_relpath 1801FROM nodes n 1802WHERE wc_id = ?1 AND repos_path = ?2 AND kind = ?3 1803 AND presence = MAP_NORMAL 1804 AND op_depth = (SELECT MAX(op_depth) 1805 FROM NODES w 1806 WHERE w.wc_id = ?1 1807 AND w.local_relpath = n.local_relpath) 1808ORDER BY local_relpath ASC 1809 1810/* ------------------------------------------------------------------------- */ 1811 1812/* Grab all the statements related to the schema. */ 1813 1814-- include: wc-metadata 1815-- include: wc-checks 1816