945
949
set_tuplefield_null(&tuple[12]);
947
951
/* These values can be NULL */
948
set_nullfield_int4(&tuple[2], pgtype_column_size(stmt, pgType, PG_STATIC, PG_STATIC));
949
set_nullfield_string(&tuple[3], pgtype_literal_prefix(stmt, pgType));
950
set_nullfield_string(&tuple[4], pgtype_literal_suffix(stmt, pgType));
951
set_nullfield_string(&tuple[5], pgtype_create_params(stmt, pgType));
952
set_nullfield_int4(&tuple[2], pgtype_column_size(stmt, pgType, PG_STATIC, UNKNOWNS_AS_DEFAULT));
953
set_nullfield_string(&tuple[3], pgtype_literal_prefix(conn, pgType));
954
set_nullfield_string(&tuple[4], pgtype_literal_suffix(conn, pgType));
955
set_nullfield_string(&tuple[5], pgtype_create_params(conn, pgType));
952
956
if (1 < pgtcount)
953
957
set_tuplefield_int2(&tuple[9], SQL_TRUE);
955
set_nullfield_int2(&tuple[9], pgtype_unsigned(stmt, pgType));
959
set_nullfield_int2(&tuple[9], pgtype_unsigned(conn, pgType));
956
960
if (aunq_match == cnt)
957
961
set_tuplefield_int2(&tuple[11], SQL_TRUE);
959
set_nullfield_int2(&tuple[11], pgtype_auto_increment(stmt, pgType));
960
set_nullfield_int2(&tuple[13], pgtype_min_decimal_digits(stmt, pgType));
961
set_nullfield_int2(&tuple[14], pgtype_max_decimal_digits(stmt, pgType));
963
set_nullfield_int2(&tuple[11], pgtype_auto_increment(conn, pgType));
964
set_nullfield_int2(&tuple[13], pgtype_min_decimal_digits(conn, pgType));
965
set_nullfield_int2(&tuple[14], pgtype_max_decimal_digits(conn, pgType));
962
966
#if (ODBCVER >=0x0300)
963
967
set_nullfield_int2(&tuple[15], pgtype_to_sqldesctype(stmt, pgType, PG_STATIC));
964
set_nullfield_int2(&tuple[16], pgtype_to_datetime_sub(stmt, pgType));
965
set_nullfield_int4(&tuple[17], pgtype_radix(stmt, pgType));
968
set_nullfield_int2(&tuple[16], pgtype_to_datetime_sub(stmt, pgType, PG_UNSPECIFIED));
969
set_nullfield_int4(&tuple[17], pgtype_radix(conn, pgType));
966
970
set_nullfield_int4(&tuple[18], 0);
967
971
#endif /* ODBCVER */
2529
2564
if (SQL_TYPE_NULL == sqltype)
2531
sqltype = pgtype_to_concise_type(stmt, field_type, PG_STATIC);
2532
concise_type = pgtype_to_sqldesctype(stmt, field_type, PG_STATIC);
2566
sqltype = pgtype_attr_to_concise_type(conn, field_type, mod_length, -1);
2567
concise_type = pgtype_attr_to_sqldesctype(conn, field_type, mod_length);
2535
2570
concise_type = sqltype;
2571
#else /* USE_OLD_IMPL */
2572
/* Subtract the header length */
2575
case PG_TYPE_DATETIME:
2576
case PG_TYPE_TIMESTAMP_NO_TMZONE:
2578
case PG_TYPE_TIME_WITH_TMZONE:
2583
set_tuplefield_int4(&tuple[COLUMNS_PRECISION], pgtype_attr_column_size(conn, field_type, mod_length, PG_UNSPECIFIED, UNKNOWNS_AS_DEFAULT));
2584
set_tuplefield_int4(&tuple[COLUMNS_LENGTH], pgtype_attr_buffer_length(conn, field_type, mod_length, PG_UNSPECIFIED, UNKNOWNS_AS_DEFAULT));
2585
set_tuplefield_int4(&tuple[COLUMNS_DISPLAY_SIZE], pgtype_attr_display_size(conn, field_type, mod_length, PG_UNSPECIFIED, UNKNOWNS_AS_DEFAULT));
2586
set_nullfield_int2(&tuple[COLUMNS_SCALE], pgtype_attr_decimal_digits(conn, field_type, mod_length, PG_UNSPECIFIED, UNKNOWNS_AS_DEFAULT));
2588
sqltype = pgtype_attr_to_concise_type(conn, field_type, mod_length, PG_UNSPECIFIED);
2589
concise_type = pgtype_attr_to_sqldesctype(conn, field_type, mod_length);
2590
#endif /* USE_OLD_IMPL */
2536
2592
set_tuplefield_int2(&tuple[COLUMNS_DATA_TYPE], sqltype);
2538
set_nullfield_int2(&tuple[COLUMNS_RADIX], pgtype_radix(stmt, field_type));
2539
set_tuplefield_int2(&tuple[COLUMNS_NULLABLE], (Int2) (not_null[0] == '1' ? SQL_NO_NULLS : pgtype_nullable(stmt, field_type)));
2594
set_nullfield_int2(&tuple[COLUMNS_RADIX], pgtype_radix(conn, field_type));
2595
set_tuplefield_int2(&tuple[COLUMNS_NULLABLE], (Int2) (not_null[0] == '1' ? SQL_NO_NULLS : pgtype_nullable(conn, field_type)));
2540
2596
set_tuplefield_string(&tuple[COLUMNS_REMARKS], NULL_STRING);
2541
2597
#if (ODBCVER >= 0x0300)
2542
2598
if (attdef && strlen(attdef) > INFO_VARCHAR_SIZE)
4898
const SQLCHAR FAR * szPkTableQualifier, /* OA X*/
4899
SQLSMALLINT cbPkTableQualifier,
4900
const SQLCHAR FAR * szPkTableOwner, /* OA E*/
4901
SQLSMALLINT cbPkTableOwner,
4902
const SQLCHAR FAR * szPkTableName, /* OA(R) E*/
4903
SQLSMALLINT cbPkTableName,
4904
const SQLCHAR FAR * szFkTableQualifier, /* OA X*/
4905
SQLSMALLINT cbFkTableQualifier,
4906
const SQLCHAR FAR * szFkTableOwner, /* OA E*/
4907
SQLSMALLINT cbFkTableOwner,
4908
const SQLCHAR FAR * szFkTableName, /* OA(R) E*/
4909
SQLSMALLINT cbFkTableName)
4911
ConnectionClass *conn = SC_get_conn(((StatementClass *) hstmt));
4912
if (PG_VERSION_GE(conn, 8.1))
4913
return PGAPI_ForeignKeys_new(hstmt,
4914
szPkTableQualifier, cbPkTableQualifier,
4915
szPkTableOwner, cbPkTableOwner,
4916
szPkTableName, cbPkTableName,
4917
szFkTableQualifier, cbFkTableQualifier,
4918
szFkTableOwner, cbFkTableOwner,
4919
szFkTableName, cbFkTableName);
4921
return PGAPI_ForeignKeys_old(hstmt,
4922
szPkTableQualifier, cbPkTableQualifier,
4923
szPkTableOwner, cbPkTableOwner,
4924
szPkTableName, cbPkTableName,
4925
szFkTableQualifier, cbFkTableQualifier,
4926
szFkTableOwner, cbFkTableOwner,
4927
szFkTableName, cbFkTableName);
4840
4931
#define PRORET_COUNT
4841
4932
#define DISPLAY_ARGNAME
5045
5136
set_tuplefield_string(&tuple[PROCOLS_COLUMN_NAME], NULL_STRING);
5046
5137
set_tuplefield_int2(&tuple[PROCOLS_COLUMN_TYPE], SQL_RETURN_VALUE);
5047
5138
set_tuplefield_int2(&tuple[PROCOLS_DATA_TYPE], pgtype_to_concise_type(stmt, pgtype, PG_STATIC));
5048
set_tuplefield_string(&tuple[PROCOLS_TYPE_NAME], pgtype_to_name(stmt, pgtype, FALSE));
5049
set_nullfield_int4(&tuple[PROCOLS_COLUMN_SIZE], pgtype_column_size(stmt, pgtype, PG_STATIC, PG_STATIC));
5050
set_tuplefield_int4(&tuple[PROCOLS_BUFFER_LENGTH], pgtype_buffer_length(stmt, pgtype, PG_STATIC, PG_STATIC));
5139
set_tuplefield_string(&tuple[PROCOLS_TYPE_NAME], pgtype_to_name(stmt, pgtype, PG_UNSPECIFIED, FALSE));
5140
column_size = pgtype_column_size(stmt, pgtype, PG_STATIC, UNKNOWNS_AS_DEFAULT);
5141
set_nullfield_int4(&tuple[PROCOLS_COLUMN_SIZE], column_size);
5142
set_tuplefield_int4(&tuple[PROCOLS_BUFFER_LENGTH], pgtype_buffer_length(stmt, pgtype, PG_STATIC, UNKNOWNS_AS_DEFAULT));
5051
5143
set_nullfield_int2(&tuple[PROCOLS_DECIMAL_DIGITS], pgtype_decimal_digits(stmt, pgtype, PG_STATIC));
5052
set_nullfield_int2(&tuple[PROCOLS_NUM_PREC_RADIX], pgtype_radix(stmt, pgtype));
5144
set_nullfield_int2(&tuple[PROCOLS_NUM_PREC_RADIX], pgtype_radix(conn, pgtype));
5053
5145
set_tuplefield_int2(&tuple[PROCOLS_NULLABLE], SQL_NULLABLE_UNKNOWN);
5054
5146
set_tuplefield_null(&tuple[PROCOLS_REMARKS]);
5055
5147
#if (ODBCVER >= 0x0300)
5056
5148
set_tuplefield_null(&tuple[PROCOLS_COLUMN_DEF]);
5057
5149
set_nullfield_int2(&tuple[PROCOLS_SQL_DATA_TYPE], pgtype_to_sqldesctype(stmt, pgtype, PG_STATIC));
5058
set_nullfield_int2(&tuple[PROCOLS_SQL_DATETIME_SUB], pgtype_to_datetime_sub(stmt, pgtype));
5059
set_nullfield_int4(&tuple[PROCOLS_CHAR_OCTET_LENGTH], pgtype_transfer_octet_length(stmt, pgtype, PG_STATIC, PG_STATIC));
5150
set_nullfield_int2(&tuple[PROCOLS_SQL_DATETIME_SUB], pgtype_to_datetime_sub(stmt, pgtype, PG_UNSPECIFIED));
5151
set_nullfield_int4(&tuple[PROCOLS_CHAR_OCTET_LENGTH], pgtype_attr_transfer_octet_length(conn, pgtype, PG_UNSPECIFIED, UNKNOWNS_AS_DEFAULT));
5060
5152
set_tuplefield_int4(&tuple[PROCOLS_ORDINAL_POSITION], 0);
5061
5153
set_tuplefield_string(&tuple[PROCOLS_IS_NULLABLE], NULL_STRING);
5062
5154
#endif /* ODBCVER >= 0x0300 */
5171
5263
set_tuplefield_int2(&tuple[PROCOLS_COLUMN_TYPE], SQL_PARAM_INPUT);
5172
5264
set_tuplefield_int2(&tuple[PROCOLS_DATA_TYPE], pgtype_to_concise_type(stmt, pgtype, PG_STATIC));
5173
set_tuplefield_string(&tuple[PROCOLS_TYPE_NAME], pgtype_to_name(stmt, pgtype, FALSE));
5174
set_nullfield_int4(&tuple[PROCOLS_COLUMN_SIZE], pgtype_column_size(stmt, pgtype, PG_STATIC, PG_STATIC));
5175
set_tuplefield_int4(&tuple[PROCOLS_BUFFER_LENGTH], pgtype_buffer_length(stmt, pgtype, PG_STATIC, PG_STATIC));
5265
set_tuplefield_string(&tuple[PROCOLS_TYPE_NAME], pgtype_to_name(stmt, pgtype, PG_UNSPECIFIED, FALSE));
5266
column_size = pgtype_column_size(stmt, pgtype, PG_STATIC, UNKNOWNS_AS_DEFAULT);
5267
set_nullfield_int4(&tuple[PROCOLS_COLUMN_SIZE], column_size);
5268
set_tuplefield_int4(&tuple[PROCOLS_BUFFER_LENGTH], pgtype_buffer_length(stmt, pgtype, PG_STATIC, UNKNOWNS_AS_DEFAULT));
5176
5269
set_nullfield_int2(&tuple[PROCOLS_DECIMAL_DIGITS], pgtype_decimal_digits(stmt, pgtype, PG_STATIC));
5177
set_nullfield_int2(&tuple[PROCOLS_NUM_PREC_RADIX], pgtype_radix(stmt, pgtype));
5270
set_nullfield_int2(&tuple[PROCOLS_NUM_PREC_RADIX], pgtype_radix(conn, pgtype));
5178
5271
set_tuplefield_int2(&tuple[PROCOLS_NULLABLE], SQL_NULLABLE_UNKNOWN);
5179
5272
set_tuplefield_null(&tuple[PROCOLS_REMARKS]);
5180
5273
#if (ODBCVER >= 0x0300)
5181
5274
set_tuplefield_null(&tuple[PROCOLS_COLUMN_DEF]);
5182
5275
set_nullfield_int2(&tuple[PROCOLS_SQL_DATA_TYPE], pgtype_to_sqldesctype(stmt, pgtype, PG_STATIC));
5183
set_nullfield_int2(&tuple[PROCOLS_SQL_DATETIME_SUB], pgtype_to_datetime_sub(stmt, pgtype));
5184
set_nullfield_int4(&tuple[PROCOLS_CHAR_OCTET_LENGTH], pgtype_transfer_octet_length(stmt, pgtype, PG_STATIC, PG_STATIC));
5276
set_nullfield_int2(&tuple[PROCOLS_SQL_DATETIME_SUB], pgtype_to_datetime_sub(stmt, pgtype, PG_UNSPECIFIED));
5277
set_nullfield_int4(&tuple[PROCOLS_CHAR_OCTET_LENGTH], pgtype_attr_transfer_octet_length(conn, pgtype, PG_UNSPECIFIED, UNKNOWNS_AS_DEFAULT));
5185
5278
set_tuplefield_int4(&tuple[PROCOLS_ORDINAL_POSITION], j + 1);
5186
5279
set_tuplefield_string(&tuple[PROCOLS_IS_NULLABLE], NULL_STRING);
5187
5280
#endif /* ODBCVER >= 0x0300 */
5209
5302
set_tuplefield_string(&tuple[PROCOLS_COLUMN_NAME], attname);
5210
5303
set_tuplefield_int2(&tuple[PROCOLS_COLUMN_TYPE], SQL_RESULT_COL);
5211
5304
set_tuplefield_int2(&tuple[PROCOLS_DATA_TYPE], pgtype_to_concise_type(stmt, typid, PG_STATIC));
5212
set_tuplefield_string(&tuple[PROCOLS_TYPE_NAME], pgtype_to_name(stmt, typid, FALSE));
5213
set_nullfield_int4(&tuple[PROCOLS_COLUMN_SIZE], pgtype_column_size(stmt, typid, PG_STATIC, PG_STATIC));
5214
set_tuplefield_int4(&tuple[PROCOLS_BUFFER_LENGTH], pgtype_buffer_length(stmt, typid, PG_STATIC, PG_STATIC));
5305
set_tuplefield_string(&tuple[PROCOLS_TYPE_NAME], pgtype_to_name(stmt, typid, PG_UNSPECIFIED, FALSE));
5306
column_size = pgtype_column_size(stmt, typid, PG_STATIC, UNKNOWNS_AS_DEFAULT);
5307
set_nullfield_int4(&tuple[PROCOLS_COLUMN_SIZE], column_size);
5308
set_tuplefield_int4(&tuple[PROCOLS_BUFFER_LENGTH], pgtype_buffer_length(stmt, typid, PG_STATIC, UNKNOWNS_AS_DEFAULT));
5215
5309
set_nullfield_int2(&tuple[PROCOLS_DECIMAL_DIGITS], pgtype_decimal_digits(stmt, typid, PG_STATIC));
5216
set_nullfield_int2(&tuple[PROCOLS_NUM_PREC_RADIX], pgtype_radix(stmt, typid));
5310
set_nullfield_int2(&tuple[PROCOLS_NUM_PREC_RADIX], pgtype_radix(conn, typid));
5217
5311
set_tuplefield_int2(&tuple[PROCOLS_NULLABLE], SQL_NULLABLE_UNKNOWN);
5218
5312
set_tuplefield_null(&tuple[PROCOLS_REMARKS]);
5219
5313
#if (ODBCVER >= 0x0300)
5220
5314
set_tuplefield_null(&tuple[PROCOLS_COLUMN_DEF]);
5221
5315
set_nullfield_int2(&tuple[PROCOLS_SQL_DATA_TYPE], pgtype_to_sqldesctype(stmt, typid, PG_STATIC));
5222
set_nullfield_int2(&tuple[PROCOLS_SQL_DATETIME_SUB], pgtype_to_datetime_sub(stmt, typid));
5223
set_nullfield_int4(&tuple[PROCOLS_CHAR_OCTET_LENGTH], pgtype_transfer_octet_length(stmt, typid, PG_STATIC, PG_STATIC));
5316
set_nullfield_int2(&tuple[PROCOLS_SQL_DATETIME_SUB], pgtype_to_datetime_sub(stmt, typid, PG_UNSPECIFIED));
5317
set_nullfield_int4(&tuple[PROCOLS_CHAR_OCTET_LENGTH], pgtype_attr_transfer_octet_length(conn, typid, PG_UNSPECIFIED, UNKNOWNS_AS_DEFAULT));
5224
5318
set_tuplefield_int4(&tuple[PROCOLS_ORDINAL_POSITION], 0);
5225
5319
set_tuplefield_string(&tuple[PROCOLS_IS_NULLABLE], NULL_STRING);
5226
5320
#endif /* ODBCVER >= 0x0300 */
5689
5772
ret = DiscardStatementSvp(stmt, ret, FALSE);
5777
static RETCODE SQL_API
5778
PGAPI_ForeignKeys_new(
5780
const SQLCHAR FAR * szPkTableQualifier, /* OA X*/
5781
SQLSMALLINT cbPkTableQualifier,
5782
const SQLCHAR FAR * szPkTableOwner, /* OA E*/
5783
SQLSMALLINT cbPkTableOwner,
5784
const SQLCHAR FAR * szPkTableName, /* OA(R) E*/
5785
SQLSMALLINT cbPkTableName,
5786
const SQLCHAR FAR * szFkTableQualifier, /* OA X*/
5787
SQLSMALLINT cbFkTableQualifier,
5788
const SQLCHAR FAR * szFkTableOwner, /* OA E*/
5789
SQLSMALLINT cbFkTableOwner,
5790
const SQLCHAR FAR * szFkTableName, /* OA(R) E*/
5791
SQLSMALLINT cbFkTableName)
5793
CSTR func = "PGAPI_ForeignKeys";
5794
StatementClass *stmt = (StatementClass *) hstmt;
5795
QResultClass *res = NULL;
5796
RETCODE ret = SQL_ERROR, result;
5797
char tables_query[INFO_INQUIRY_LEN];
5798
char *pk_table_needed = NULL, *escTableName = NULL;
5799
char *fk_table_needed = NULL;
5800
char schema_needed[SCHEMA_NAME_STORAGE_LEN + 1];
5801
char catName[SCHEMA_NAME_STORAGE_LEN],
5802
scmName1[SCHEMA_NAME_STORAGE_LEN],
5803
scmName2[SCHEMA_NAME_STORAGE_LEN];
5804
const char *relqual;
5805
ConnectionClass *conn = SC_get_conn(stmt);
5807
const char *eq_string;
5809
mylog("%s: entering...stmt=%p\n", func, stmt);
5811
if (result = SC_initialize_and_recycle(stmt), SQL_SUCCESS != result)
5814
schema_needed[0] = '\0';
5815
#define return DONT_CALL_RETURN_FROM_HERE???
5817
pk_table_needed = make_string(szPkTableName, cbPkTableName, NULL, 0);
5818
fk_table_needed = make_string(szFkTableName, cbFkTableName, NULL, 0);
5820
eq_string = gen_opestr(eqop, conn);
5823
* Case #2 -- Get the foreign keys in the specified table (fktab) that
5824
* refer to the primary keys of other table(s).
5826
if (NULL != fk_table_needed)
5828
mylog("%s: entering Foreign Key Case #2", func);
5829
escTableName = simpleCatalogEscape(fk_table_needed, SQL_NTS, NULL, conn);
5830
schema_strcat(schema_needed, "%.*s", szFkTableOwner, cbFkTableOwner, szFkTableName, cbFkTableName, conn);
5831
relqual = "\n and conrelid = c.oid";
5834
* Case #1 -- Get the foreign keys in other tables that refer to the
5835
* primary key in the specified table (pktab). i.e., Who points to
5838
else if (NULL != pk_table_needed)
5840
escTableName = simpleCatalogEscape(pk_table_needed, SQL_NTS, NULL, conn);
5841
schema_strcat(schema_needed, "%.*s", szPkTableOwner, cbPkTableOwner, szPkTableName, cbPkTableName, conn);
5842
relqual = "\n and confrelid = c.oid";
5846
SC_set_error(stmt, STMT_INTERNAL_ERROR, "No tables specified to PGAPI_ForeignKeys.", func);
5850
if (conn->schema_support)
5852
char *escSchemaName;
5854
if (NULL != CurrCat(conn))
5855
snprintf(catName, sizeof(catName), "'%s'::name", CurrCat(conn));
5857
strcpy(catName, "NULL::name");
5858
strcpy(scmName1, "n2.nspname");
5859
strcpy(scmName2, "n1.nspname");
5860
escSchemaName = simpleCatalogEscape(schema_needed, SQL_NTS, NULL, conn);
5862
snprintf(tables_query, sizeof(tables_query),
5864
" %s as PKTABLE_CAT"
5865
",\n %s as PKTABLE_SCHEM"
5866
",\n c2.relname as PKTABLE_NAME"
5867
",\n a2.attname as PKCOLUMN_NAME"
5868
",\n %s as FKTABLE_CAT"
5869
",\n %s as FKTABLE_SCHEM"
5870
",\n c1.relname as FKTABLE_NAME"
5871
",\n a1.attname as FKCOLUMN_NAME"
5872
",\n i::int2 as KEY_SEQ"
5873
",\n case ref.confupdtype"
5874
"\n when 'c' then %d::int2"
5875
"\n when 'n' then %d::int2"
5876
"\n when 'd' then %d::int2"
5877
"\n when 'r' then %d::int2"
5879
"\n end as UPDATE_RULE"
5880
",\n case ref.confdeltype"
5881
"\n when 'c' then %d::int2"
5882
"\n when 'n' then %d::int2"
5883
"\n when 'd' then %d::int2"
5884
"\n when 'r' then %d::int2"
5886
"\n end as DELETE_RULE"
5887
",\n ref.conname as FK_NAME"
5888
",\n cn.conname as PK_NAME"
5889
#if (ODBCVER >= 0x0300)
5891
"\n when ref.condeferrable then"
5893
"\n when ref.condeferred then %d::int2"
5897
"\n end as DEFERRABLITY"
5898
#endif /* ODBCVER */
5901
" (select cn.oid, conrelid, conkey, confrelid, confkey"
5902
",\n generate_series(array_lower(conkey, 1), array_upper(conkey, 1)) as i"
5903
",\n confupdtype, confdeltype, conname"
5904
",\n condeferrable, condeferred"
5905
"\n from pg_catalog.pg_constraint cn"
5906
",\n pg_catalog.pg_class c"
5907
",\n pg_catalog.pg_namespace n"
5908
"\n where contype = 'f' %s"
5909
"\n and relname %s'%s'"
5910
"\n and n.oid = c.relnamespace"
5911
"\n and n.nspname %s'%s'"
5913
"\n inner join pg_catalog.pg_class c1"
5914
"\n on c1.oid = ref.conrelid)"
5915
"\n inner join pg_catalog.pg_namespace n1"
5916
"\n on n1.oid = c1.relnamespace)"
5917
"\n inner join pg_catalog.pg_attribute a1"
5918
"\n on a1.attrelid = c1.oid"
5919
"\n and a1.attnum = conkey[i])"
5920
"\n inner join pg_catalog.pg_class c2"
5921
"\n on c2.oid = ref.confrelid)"
5922
"\n inner join pg_catalog.pg_namespace n2"
5923
"\n on n2.oid = c2.relnamespace)"
5924
"\n inner join pg_catalog.pg_attribute a2"
5925
"\n on a2.attrelid = c2.oid"
5926
"\n and a2.attnum = confkey[i])"
5927
"\n left outer join pg_catalog.pg_constraint cn"
5928
"\n on cn.conrelid = ref.confrelid"
5929
"\n and cn.contype = 'p')"
5944
#if (ODBCVER >= 0x0300)
5945
, SQL_INITIALLY_DEFERRED
5946
, SQL_INITIALLY_IMMEDIATE
5947
, SQL_NOT_DEFERRABLE
5948
#endif /* ODBCVER */
5950
, eq_string, escTableName
5951
, eq_string, escSchemaName);
5953
free(escSchemaName);
5954
if (NULL != pk_table_needed &&
5955
NULL != fk_table_needed)
5958
escTableName = simpleCatalogEscape(pk_table_needed, SQL_NTS, NULL, conn);
5959
snprintf_add(tables_query, sizeof(tables_query),
5960
"\n where c2.relname %s'%s'",
5961
eq_string, escTableName);
5963
strcat(tables_query, "\n order by ref.oid, ref.i");
5967
strcpy(catName, "NULL::name");
5968
strcpy(scmName1, "NULL::name");
5969
strcpy(scmName2, "NULL::name");
5971
snprintf(tables_query, sizeof(tables_query),
5972
"select %s as PKTABLE_CAT"
5973
",\n %s as PKTABLE_SCHEM"
5974
",\n c2.relname as PKTABLE_NAME"
5975
",\n a2.attname as PKCOLUMN_NAME"
5976
",\n %s as FKTABLE_CAT"
5977
",\n %s as FKTABLE_SCHEM"
5978
",\n c1.relname as FKTABLE_NAME"
5979
",\n a1.attname as FKCOLUMN_NAME"
5980
",\n i::int2 as KEY_SEQ"
5981
",\n case confupdtype"
5982
"\n when 'c' then %d::int2"
5983
"\n when 'n' then %d::int2"
5984
"\n when 'd' then %d::int2"
5985
"\n when 'r' then %d::int2"
5987
"\n end as UPDATE_RULE"
5988
",\n case confdeltype"
5989
"\n when 'c' then %d::int2"
5990
"\n when 'n' then %d::int2"
5991
"\n when 'd' then %d::int2"
5992
"\n when 'r' then %d::int2"
5994
"\n end as DELETE_RULE"
5995
",\n conname as FK_NAME"
5996
",\n NULL::name as PK_NAME"
5997
#if (ODBCVER >= 0x0300)
5999
"\n when condeferrable then"
6001
"\n when condeferred then %d::int2"
6005
"\n end as DEFERRABLITY"
6006
#endif /* ODBCVER */
6008
"\n (select conrelid, conkey, confrelid, confkey"
6009
",\n generate_series(array_lower(conkey, 1), array_upper(conkey, 1)) as i"
6010
",\n confupdtype, confdeltype, conname"
6011
",\n condeferrable, condeferred"
6012
"\n from pg_catalog.pg_constraint cn"
6013
",\n pg_catalog.pg_class c"
6014
"\n where contype = 'f' %s"
6015
"\n and relname %s'%s'"
6017
",\n pg_catalog.pg_class c1"
6018
",\n pg_catalog.pg_attribute a1"
6019
",\n pg_catalog.pg_class c2"
6020
",\n pg_catalog.pg_attribute a2"
6021
"\n where c1.oid = ref.conrelid"
6022
"\n and c2.oid = ref.confrelid"
6023
"\n and a1.attrelid = c1.oid"
6024
"\n and a1.attnum = conkey[i]"
6025
"\n and a2.attrelid = c2.oid"
6026
"\n and a2.attnum = confkey[i]"
6027
"\n order by ref.oid, ref.i"
6042
#if (ODBCVER >= 0x0300)
6043
, SQL_INITIALLY_DEFERRED
6044
, SQL_INITIALLY_IMMEDIATE
6045
, SQL_NOT_DEFERRABLE
6046
#endif /* ODBCVER */
6047
, relqual, eq_string, escTableName);
6050
if (res = CC_send_query(conn, tables_query, NULL, IGNORE_ABORT_ON_CONN, stmt), !QR_command_maybe_successful(res))
6052
SC_set_error(stmt, STMT_EXEC_ERROR, "PGAPI_ForeignKeys query error", func);
6056
SC_set_Result(stmt, res);
6063
* also, things need to think that this statement is finished so the
6064
* results can be retrieved.
6066
if (SQL_SUCCEEDED(ret))
6068
stmt->status = STMT_FINISHED;
6069
extend_column_bindings(SC_get_ARDF(stmt), QR_NumResultCols(res));
6071
if (pk_table_needed)
6072
free(pk_table_needed);
6075
if (fk_table_needed)
6076
free(fk_table_needed);
6077
/* set up the current tuple pointer for SQLFetch */
6078
stmt->currTuple = -1;
6079
SC_set_rowset_start(stmt, -1, FALSE);
6080
SC_set_current_col(stmt, -1);
6083
ret = DiscardStatementSvp(stmt, ret, FALSE);
6084
mylog("%s(): EXIT, stmt=%p, ret=%d\n", func, stmt, ret);