should be it

This commit is contained in:
2025-10-24 19:21:19 -05:00
parent a4b23fc57c
commit f09560c7b1
14047 changed files with 3161551 additions and 1 deletions

View File

@@ -0,0 +1,88 @@
# name: test/sql/alter/alter_col/test_drop_not_null.test
# description: Test ALTER TABLE ALTER COLUMN column_name DROP NOT NULL
# group: [alter_col]
# Happy path
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test(i INTEGER, j INTEGER NOT NULL)
statement ok
INSERT INTO test VALUES (1, 1), (2, 2)
statement error
INSERT INTO test VALUES (3, NULL)
----
query II
SELECT * FROM test
----
1 1
2 2
statement ok
ALTER TABLE test ALTER COLUMN j DROP NOT NULL
statement ok
INSERT INTO test VALUES (3, NULL)
query II
SELECT * FROM test
----
1 1
2 2
3 NULL
# Negative path
statement ok
CREATE TABLE test2(i INTEGER, j INTEGER)
statement ok
INSERT INTO test2 VALUES (1, 1), (2, 2)
statement ok
ALTER TABLE test2 ALTER COLUMN j DROP NOT NULL
statement ok
INSERT INTO test VALUES (3, NULL)
# Drop not null with generated column presented
statement ok
DROP TABLE IF EXISTS test
statement ok
CREATE TABLE test(i AS (1), j INTEGER NOT NULL)
statement ok
INSERT INTO test VALUES (1), (2)
statement error
INSERT INTO test VALUES (NULL)
----
query II
SELECT * FROM test
----
1 1
1 2
statement ok
ALTER TABLE test ALTER COLUMN i DROP NOT NULL
statement ok
ALTER TABLE test ALTER COLUMN j DROP NOT NULL
statement ok
INSERT INTO test VALUES (NULL)
query II
SELECT * FROM test
----
1 1
1 2
1 NULL

View File

@@ -0,0 +1,270 @@
# name: test/sql/alter/alter_col/test_not_null_in_tran.test
# description: Test Set/Drop NOT NULL in transaction
# group: [alter_col]
statement ok
PRAGMA enable_verification
# Scenario #1, alter with uncommitted data
statement ok
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok
INSERT INTO t SELECT i, i FROM RANGE(2048) tbl(i)
# Insert uncommitted null
statement ok
BEGIN TRANSACTION
statement ok
INSERT INTO t VALUES(9999, NULL)
statement error
ALTER TABLE t ALTER COLUMN j SET NOT NULL
----
statement ok
ROLLBACK
statement ok
INSERT INTO t VALUES(9999, NULL)
# Has null, cannot alter after tran
statement error
ALTER TABLE t ALTER COLUMN j SET NOT NULL
----
query I
SELECT i FROM t WHERE j IS NULL
----
9999
# Prepare persistent data
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok
INSERT INTO t SELECT i, i FROM RANGE(2048) tbl(i)
# Insert uncommitted data
statement ok
BEGIN TRANSACTION
statement ok
INSERT INTO t values(8888, 8888)
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok
COMMIT
# Cannot insert after tran
statement error
INSERT INTO t VALUES(9999, NULL)
----
# No null data
query II
SELECT * FROM t WHERE j = 8888
----
8888 8888
# Scenario #2, add/drop in the same tran
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i int, j int)
statement ok
INSERT INTO T SELECT 1,1 FROM RANGE(2048)
statement ok
BEGIN TRANSACTION
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok
INSERT INTO t VALUES(2, 2)
statement ok
ALTER TABLE t ALTER COLUMN j DROP NOT NULL
statement ok
INSERT INTO t values(3, NULL)
statement ok
COMMIT
# Insert null after tran
statement ok
INSERT INTO t VALUES(4, NULL)
query II
SELECT * FROM t WHERE j IS NULL
----
3 NULL
4 NULL
# Scenario #3, rollback alter
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i int, j int)
statement ok
INSERT INTO T SELECT 1,1 FROM RANGE(2048)
statement ok
BEGIN TRANSACTION
# Set&Rollback
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok
INSERT INTO T VALUES(8888, 8888)
statement ok
ROLLBACK
# CAN insert null after rollback
statement ok
INSERT INTO t VALUES(9999, NULL)
query I
SELECT i FROM t WHERE j IS NULL
----
9999
# Prepare data with NOT NULL constraint
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i int, j int)
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok
INSERT INTO T SELECT 1,1 FROM RANGE(2048)
statement ok
BEGIN TRANSACTION
# Drop&Rollback
statement ok
ALTER TABLE t ALTER COLUMN j DROP NOT NULL
statement ok
INSERT INTO T VALUES(7777, NULL)
statement ok
ROLLBACK
# CANNOT insert null after rollback
statement error
INSERT INTO t VALUES(8888, NULL)
----
# NO null values
query I
SELECT COUNT(*) FROM t WHERE j IS NULL
----
0
# Scenario #4, Create table then Alter in the same tran
# Set in the same tran
statement ok
DROP TABLE IF EXISTS t
statement ok
BEGIN TRANSACTION
statement ok
CREATE TABLE t(i INTEGER)
statement ok
ALTER TABLE t ALTER COLUMN i SET NOT NULL
statement ok
INSERT INTO t SELECT 1 FROM RANGE(1024)
statement ok
COMMIT
statement error
INSERT INTO t VALUES(NULL)
----
# Drop in the same tran
statement ok
DROP TABLE IF EXISTS t
statement ok
BEGIN TRANSACTION
statement ok
CREATE TABLE t(i INTEGER NOT NULL)
statement ok
INSERT INTO t SELECT 1 FROM RANGE(1024)
statement ok
ALTER TABLE t ALTER COLUMN i DROP NOT NULL
statement ok
INSERT INTO t VALUES(NULL)
statement ok
COMMIT
statement ok
INSERT INTO t VALUES(NULL)
mode skip
# Scenario #5, Insert null, delete null locally, then alter
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok
INSERT INTO t SELECT 1,1 FROM RANGE(1024)
# Insert null
statement ok
INSERT INTO t VALUES(2,NULL)
statement ok
BEGIN TRANSACTION
# Delete null locally
statement ok
DELETE FROM t WHERE i = 2
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok
COMMIT
statement error
INSERT INTO t VALUES(3, NULL)
----
# NO null values
query I
SELECT COUNT(*) FROM t WHERE j IS NULL
----
0
mode unskip

View File

@@ -0,0 +1,253 @@
# name: test/sql/alter/alter_col/test_not_null_multi_tran.test
# description: Test Set/Drop NOT NULL in multiple transactions
# group: [alter_col]
statement ok
PRAGMA enable_verification
# Scenario #1, tran1 set not null, tran2 not able to insert
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok con2
BEGIN TRANSACTION
statement error con2
INSERT INTO t VALUES(7777, NULL)
----
statement ok con1
INSERT INTO t VALUES(7, 7)
statement ok con2
ROLLBACK
statement ok con1
COMMIT
query I con1
SELECT i FROM t
----
7
# Scenario #2, tran1 set not null, tran2 failed to commit
statement ok con1
DROP TABLE IF EXISTS t
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con2
INSERT INTO t VALUES(7777, NULL)
statement ok con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok con1
COMMIT
statement error con2
COMMIT
----
statement error con1
INSERT INTO t VALUES(7777, NULL)
----
query I con1
SELECT COUNT(*) FROM t
----
0
# Scenario #3, cannot insert if one connection alter column
statement ok con1
DROP TABLE IF EXISTS t
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok con2
BEGIN TRANSACTION
statement error con2
INSERT INTO t VALUES(1, 1)
----
statement ok con1
COMMIT
statement ok con2
ROLLBACK
query I con1
SELECT count(*) from t
----
0
# For following tests:
# begin t1 and begin t2
# a1 = alter in t1;
# c1 = commint t1;
# i2 = insert in t1;
# c2 = commit t2
#
# Scenario #4, a1+c1+i2+c2
# i2 failed with following error:
# Transaction conflict: adding entries to a table that has been altered!
statement ok con1
DROP TABLE IF EXISTS t
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok con1
COMMIT
statement error con2
INSERT INTO t VALUES(1, NULL)
----
statement ok con2
ROLLBACK
query I con1
SELECT count(*) from t
----
0
# Scenario #5, i2+a1+c1+c2
# c2 failed with following error
# Transaction conflict: adding entries to a table that has been altered!
statement ok con1
DROP TABLE IF EXISTS t
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con2
INSERT INTO t VALUES(1, NULL)
statement ok con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement ok con1
COMMIT
#Failed to commit
statement error con2
COMMIT
----
statement error con2
INSERT INTO t VALUES(2, NULL)
----
query I con1
SELECT count(*) from t
----
0
# Scenario #6, i2+a1+c2+c1
# c2 failed with following error
# Transaction conflict: adding entries to a table that has been altered!
statement ok con1
DROP TABLE IF EXISTS t
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con2
INSERT INTO t VALUES(1, NULL)
statement ok con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
# Failed to commit
statement error con2
COMMIT
----
statement ok con1
COMMIT
# Failed to insert null
statement error con2
INSERT INTO t VALUES(2, NULL)
----
query I con1
SELECT count(*) from t
----
0
# Scenario #7, i2+c2+a1+c1
# a1 should failed!
statement ok con1
DROP TABLE IF EXISTS t
statement ok con1
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok con1
BEGIN TRANSACTION
statement ok con2
BEGIN TRANSACTION
statement ok con2
INSERT INTO t VALUES(1, NULL)
statement ok con2
COMMIT
statement error con1
ALTER TABLE t ALTER COLUMN j SET NOT NULL
----
statement ok con1
ROLLBACK
query I con1
SELECT count(*) from t
----
1

View File

@@ -0,0 +1,156 @@
# name: test/sql/alter/alter_col/test_set_not_null.test
# description: Test ALTER TABLE ALTER COLUMN column_name SET NOT NULL
# group: [alter_col]
# Happy path
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok
INSERT INTO t VALUES (1, 1), (2, 2)
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement error
INSERT INTO t VALUES (3, NULL)
----
# SET again
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement error
INSERT INTO t VALUES (3, NULL)
----
query II
SELECT * FROM t
----
1 1
2 2
# Large table
statement ok
INSERT INTO t SELECT 5,5 from range(65534)
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
statement error
INSERT INTO t VALUES (6, NULL)
----
query I
SELECT COUNT(*) FROM t WHERE j IS NULL
----
0
# SET NOT NULL failed if contains null value
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok
INSERT INTO t VALUES (1, 1), (2, 2), (3, null)
statement ok
INSERT INTO t SELECT 4,4 FROM RANGE(65536)
statement error
ALTER TABLE t ALTER COLUMN j SET NOT NULL
----
statement ok
INSERT INTO t VALUES (5, null)
query II
SELECT * FROM t WHERE j IS NULL
----
3 NULL
5 NULL
# Insert null before&after drop constraint
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i INTEGER, j INTEGER)
statement ok
INSERT INTO t SELECT 1,1 FROM RANGE(65536)
# Set not null
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
# Failed to insert before drop constraint
statement error
INSERT INTO t VALUES (2, null)
----
# Drop not null
statement ok
ALTER TABLE t ALTER COLUMN j DROP NOT NULL
# Insert after drop constraint
statement ok
INSERT INTO t VALUES (3, null)
# Only 1 null
query II
SELECT * FROM t WHERE j IS NULL
----
3 NULL
# Basic test with generated column
statement ok
CREATE TABLE t0(c0 AS (1), c1 INT);
statement ok
ALTER TABLE t0 ALTER c1 SET NOT NULL;
# Insert null before&after drop constraint with generated column
statement ok
DROP TABLE IF EXISTS t
statement ok
CREATE TABLE t(i AS (1), j INTEGER)
statement ok
INSERT INTO t SELECT 1 FROM RANGE(65536)
# Set not null
statement error
ALTER TABLE t ALTER COLUMN i SET NOT NULL
----
# Set not null
statement ok
ALTER TABLE t ALTER COLUMN j SET NOT NULL
# Failed to insert before drop constraint
statement error
INSERT INTO t VALUES (null)
----
# Drop not null
statement ok
ALTER TABLE t ALTER COLUMN j DROP NOT NULL
# Insert after drop constraint
statement ok
INSERT INTO t VALUES (null)
# Only 1 null
query II
SELECT * FROM t WHERE j IS NULL
----
1 NULL