Skip to content

Commit cd3a590

Browse files
committed
Make tests for ibase_field_info() (#88)
1 parent d314f56 commit cd3a590

12 files changed

+275
-11
lines changed

ibase_query.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -800,9 +800,12 @@ static void _php_ibase_alloc_xsqlda_vars(XSQLDA *sqlda, ISC_SHORT *nullinds) /*
800800
for (i = 0; i < sqlda->sqld; i++) {
801801
XSQLVAR *var = &sqlda->sqlvar[i];
802802

803-
if ((var->sqltype & ~1) == SQL_TEXT) {
804-
var->sqltype = SQL_VARYING | (var->sqltype & 1);
805-
}
803+
// Convert CHAR to VARCHAR to avoid dealiong with padding with
804+
// multi character charsets
805+
806+
if ((var->sqltype & ~1) == SQL_TEXT) {
807+
var->sqltype = SQL_VARYING | (var->sqltype & 1);
808+
}
806809

807810
switch (var->sqltype & ~1) {
808811
case SQL_TEXT:
@@ -1958,16 +1961,16 @@ static void _php_ibase_field_info(zval *return_value, ibase_query *ib_query, int
19581961
s = "QUAD";
19591962
break;
19601963
#if FB_API_VER >= 40
1961-
// These are converted to VARCHAR via isc_dpb_set_bind tag at connect and will appear to clients as VARCHAR
1962-
// TODO: add info regardless
1964+
// These are converted to VARCHAR via isc_dpb_set_bind tag at
1965+
// connect and will appear to clients as VARCHAR
19631966
// case SQL_DEC16:
19641967
// case SQL_DEC34:
19651968
// case SQL_INT128:
19661969
case SQL_TIMESTAMP_TZ:
1967-
s = "TIMESTAMP_TZ";
1970+
s = "TIMESTAMP WITH TIME ZONE";
19681971
break;
19691972
case SQL_TIME_TZ:
1970-
s = "TIME_TZ";
1973+
s = "TIME WITH TIME ZONE";
19711974
break;
19721975
#endif
19731976
}

tests/001-FIELDS25.sql

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
RECREATE TABLE FIELDS25 (
2+
ID INTEGER NOT NULL PRIMARY KEY,
3+
4+
-- 3.141592653589793238462643383279502
5+
-- Numeric types
6+
SMALLINT_1 SMALLINT DEFAULT -32768,
7+
INTEGER_FIELD INTEGER DEFAULT -2147483648,
8+
BIGINT_FIELD BIGINT DEFAULT -9223372036854775808,
9+
NUMERIC_1 NUMERIC(4, 4) DEFAULT 3.1415,
10+
DECIMAL_1 DECIMAL(4, 4) DEFAULT 3.1415,
11+
NUMERIC_2 NUMERIC(9, 8) DEFAULT 3.14159265,
12+
DECIMAL_2 DECIMAL(9, 8) DEFAULT 3.14159265,
13+
NUMERIC_3 NUMERIC(18, 16) DEFAULT 3.141592653589793,
14+
DECIMAL_3 DECIMAL(18, 16) DEFAULT 3.141592653589793,
15+
FLOAT_FIELD FLOAT DEFAULT 3.14,
16+
DOUBLE_FIELD DOUBLE PRECISION DEFAULT 3.14,
17+
18+
-- Character types
19+
CHAR_FIXED CHAR(10) DEFAULT 'ABCDE',
20+
VARCHAR_FIELD VARCHAR(50) DEFAULT 'Default varchar text',
21+
CHAR_UTF8 CHAR(10) CHARACTER SET UTF8 DEFAULT 'テスト',
22+
VARCHAR_UTF8 VARCHAR(50) CHARACTER SET UTF8 DEFAULT 'Glāžšķūņu rūķīši',
23+
24+
-- Date/Time types
25+
DATE_FIELD DATE DEFAULT '2025-11-10',
26+
TIME_FIELD TIME DEFAULT '15:16:59',
27+
TIMESTAMP_FIELD TIMESTAMP DEFAULT '2025-11-10 15:16:59',
28+
29+
-- Binary types
30+
BINARY_FIXED CHAR(16) CHARACTER SET OCTETS DEFAULT x'000102030405060708090A0B0C0D0E0F',
31+
VARBINARY_FIELD VARCHAR(100) CHARACTER SET OCTETS DEFAULT x'DEADBEEF',
32+
33+
-- Blob types
34+
BLOB_TEXT BLOB SUB_TYPE TEXT DEFAULT 'Hello from text blob',
35+
BLOB_BINARY BLOB SUB_TYPE 0 DEFAULT 'Hello from binary blob'
36+
);

tests/001-FIELDS30.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
RECREATE TABLE FIELDS30 (
2+
ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
3+
BOOL_FIELD BOOLEAN DEFAULT TRUE
4+
);

tests/001-FIELDS40.sql

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
RECREATE TABLE FIELDS40 (
2+
ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
3+
-- 3.141592653589793238462643383279502884197169399375105820974944592307816406286
4+
NUMERIC_4 NUMERIC(38, 37) DEFAULT 3.1415926535897932384626433832795028841,
5+
DECIMAL_4 DECIMAL(38, 37) DEFAULT 3.1415926535897932384626433832795028841,
6+
DECFLOAT_16 DECFLOAT(16) DEFAULT 3.141592653589793,
7+
DECFLOAT_34 DECFLOAT(34) DEFAULT 3.141592653589793238462643383279502,
8+
INT128_FIELD INT128 DEFAULT -170141183460469231731687303715884105727,
9+
TIME_TZ TIME WITH TIME ZONE DEFAULT '15:45:59 Europe/Berlin',
10+
TIMESTAMP_TZ TIMESTAMP WITH TIME ZONE DEFAULT '2025-11-06 15:45:59 Europe/Berlin'
11+
);

tests/common.inc

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,29 @@ function test_time_tz_unixtime(): void {
5959
dump_table_rows("TTEST");
6060
dump_table_rows("TTEST", null, IBASE_UNIXTIME);
6161
}
62+
63+
function test_fields25(): void {
64+
ibase_query(file_get_contents(__DIR__."/001-FIELDS25.sql"));
65+
ibase_commit();
66+
67+
ibase_query("INSERT INTO FIELDS25 (ID) VALUES (1)");
68+
$q = ibase_query("SELECT * FROM FIELDS25");
69+
$num_fields = ibase_num_fields($q);
70+
for($i = 0; $i < $num_fields; $i++){
71+
$info = ibase_field_info($q, $i);
72+
printf("%s/%s/%d\n", $info["name"], $info["type"], $info["length"]);
73+
}
74+
}
75+
76+
function test_fields40(): void {
77+
ibase_query(file_get_contents(__DIR__."/001-FIELDS40.sql"));
78+
ibase_commit();
79+
80+
ibase_query("INSERT INTO FIELDS40 (ID) VALUES (DEFAULT)");
81+
$q = ibase_query("SELECT * FROM FIELDS40");
82+
$num_fields = ibase_num_fields($q);
83+
for($i = 0; $i < $num_fields; $i++){
84+
$info = ibase_field_info($q, $i);
85+
printf("%s/%s/%d\n", $info["name"], $info["type"], $info["length"]);
86+
}
87+
}

tests/functions.inc

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,17 @@ function skip_if_fb_gte($v) {
131131
if(($cv = get_fb_version()) >= $v)die("skip Firebird server version $cv >= $v");
132132
}
133133

134-
/** @var float $v */
135-
function skip_if_fbclient_lt($v) {
134+
function skip_if_fbclient_lt(float $v): void {
136135
if(!function_exists("ibase_get_client_version"))die("skip Firebird client library version (undefined) < $v");
137136
if(($cv = ibase_get_client_version()) < $v)die("skip Firebird client library version $cv < $v");
138137
}
139138

139+
function skip_if_fbclient_gte(float $v): void {
140+
if(function_exists("ibase_get_client_version")) {
141+
if(($cv = ibase_get_client_version()) >= $v)die("skip Firebird client library version $cv >= $v");
142+
}
143+
}
144+
140145
function skip_if_ext_lt(int $v): void {
141146
if(!defined('IBASE_VER'))die("Skip IBASE_VER (not defined) < $v");
142147
if(IBASE_VER < $v)die("Skip IBASE_VER ".IBASE_VER." < $v");

tests/ibase_field_info_001.phpt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
--TEST--
2+
ibase_field_info(): basic fields
3+
--SKIPIF--
4+
<?php
5+
include("skipif.inc");
6+
?>
7+
--FILE--
8+
<?php
9+
10+
require_once('config.inc');
11+
ini_set('ibase.default_charset', "NONE");
12+
13+
require("interbase.inc");
14+
require("common.inc");
15+
16+
ibase_connect($test_base);
17+
test_fields25();
18+
19+
?>
20+
--EXPECT--
21+
ID/INTEGER/4
22+
SMALLINT_1/SMALLINT/2
23+
INTEGER_FIELD/INTEGER/4
24+
BIGINT_FIELD/BIGINT/8
25+
NUMERIC_1/NUMERIC(4,4)/2
26+
DECIMAL_1/NUMERIC(9,4)/4
27+
NUMERIC_2/NUMERIC(9,8)/4
28+
DECIMAL_2/NUMERIC(9,8)/4
29+
NUMERIC_3/NUMERIC(18,16)/8
30+
DECIMAL_3/NUMERIC(18,16)/8
31+
FLOAT_FIELD/FLOAT/4
32+
DOUBLE_FIELD/DOUBLE PRECISION/8
33+
CHAR_FIXED/VARCHAR/10
34+
VARCHAR_FIELD/VARCHAR/50
35+
CHAR_UTF8/VARCHAR/40
36+
VARCHAR_UTF8/VARCHAR/200
37+
DATE_FIELD/DATE/4
38+
TIME_FIELD/TIME/4
39+
TIMESTAMP_FIELD/TIMESTAMP/8
40+
BINARY_FIXED/VARCHAR/16
41+
VARBINARY_FIELD/VARCHAR/100
42+
BLOB_TEXT/BLOB/8
43+
BLOB_BINARY/BLOB/8

tests/ibase_field_info_002.phpt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
--TEST--
2+
ibase_field_info(): fields introduced in FB 3.0
3+
--SKIPIF--
4+
<?php
5+
include("skipif.inc");
6+
skip_if_fb_lt(3);
7+
?>
8+
--FILE--
9+
<?php
10+
11+
require("interbase.inc");
12+
ibase_connect($test_base);
13+
14+
(function(){
15+
ibase_query(file_get_contents(__DIR__."/001-FIELDS30.sql"));
16+
ibase_commit();
17+
18+
ibase_query("INSERT INTO FIELDS30 (ID) VALUES (1)");
19+
$q = ibase_query("SELECT * FROM FIELDS30");
20+
$num_fields = ibase_num_fields($q);
21+
for($i = 0; $i < $num_fields; $i++){
22+
$info = ibase_field_info($q, $i);
23+
printf("%s/%s/%d\n", $info["name"], $info["type"], $info["length"]);
24+
}
25+
})();
26+
27+
?>
28+
--EXPECT--
29+
ID/INTEGER/4
30+
BOOL_FIELD/BOOLEAN/1

tests/ibase_field_info_003.phpt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
--TEST--
2+
ibase_field_info(): fields introduced in FB 4.0
3+
--SKIPIF--
4+
<?php
5+
include("skipif.inc");
6+
skip_if_fb_lt(4);
7+
skip_if_fbclient_lt(4);
8+
?>
9+
--FILE--
10+
<?php
11+
12+
require("interbase.inc");
13+
ibase_connect($test_base);
14+
15+
(function(){
16+
ibase_query(file_get_contents(__DIR__."/001-FIELDS40.sql"));
17+
ibase_commit();
18+
19+
ibase_query("INSERT INTO FIELDS40 (ID) VALUES (DEFAULT)");
20+
$q = ibase_query("SELECT * FROM FIELDS40");
21+
$num_fields = ibase_num_fields($q);
22+
for($i = 0; $i < $num_fields; $i++){
23+
$info = ibase_field_info($q, $i);
24+
printf("%s/%s/%d\n", $info["name"], $info["type"], $info["length"]);
25+
}
26+
})();
27+
28+
?>
29+
--EXPECT--
30+
ID/INTEGER/4
31+
NUMERIC_4/VARCHAR/188
32+
DECIMAL_4/VARCHAR/188
33+
DECFLOAT_16/VARCHAR/92
34+
DECFLOAT_34/VARCHAR/168
35+
INT128_FIELD/VARCHAR/188
36+
TIME_TZ/TIME WITH TIME ZONE/8
37+
TIMESTAMP_TZ/TIMESTAMP WITH TIME ZONE/12

tests/ibase_field_info_004.phpt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
--TEST--
2+
ibase_field_info(): basic fields - UTF8
3+
--SKIPIF--
4+
<?php
5+
include("skipif.inc");
6+
?>
7+
--FILE--
8+
<?php
9+
10+
require_once('config.inc');
11+
ini_set('ibase.default_charset', "UTF8");
12+
13+
require("interbase.inc");
14+
require("common.inc");
15+
16+
ibase_connect($test_base);
17+
test_fields25();
18+
19+
?>
20+
--EXPECT--
21+
ID/INTEGER/4
22+
SMALLINT_1/SMALLINT/2
23+
INTEGER_FIELD/INTEGER/4
24+
BIGINT_FIELD/BIGINT/8
25+
NUMERIC_1/NUMERIC(4,4)/2
26+
DECIMAL_1/NUMERIC(9,4)/4
27+
NUMERIC_2/NUMERIC(9,8)/4
28+
DECIMAL_2/NUMERIC(9,8)/4
29+
NUMERIC_3/NUMERIC(18,16)/8
30+
DECIMAL_3/NUMERIC(18,16)/8
31+
FLOAT_FIELD/FLOAT/4
32+
DOUBLE_FIELD/DOUBLE PRECISION/8
33+
CHAR_FIXED/VARCHAR/40
34+
VARCHAR_FIELD/VARCHAR/200
35+
CHAR_UTF8/VARCHAR/40
36+
VARCHAR_UTF8/VARCHAR/200
37+
DATE_FIELD/DATE/4
38+
TIME_FIELD/TIME/4
39+
TIMESTAMP_FIELD/TIMESTAMP/8
40+
BINARY_FIXED/VARCHAR/16
41+
VARBINARY_FIELD/VARCHAR/100
42+
BLOB_TEXT/BLOB/8
43+
BLOB_BINARY/BLOB/8

0 commit comments

Comments
 (0)