2013-08-06 6 views
40

मेरी चुनिंदा बयानों मैं निम्न त्रुटि मिल गया है में से एक में अज्ञात से रूपांतरण समारोह ढूंढने में विफल:पाठ में

ERROR: failed to find conversion function from unknown to text 
********** Error ********** 
ERROR: failed to find conversion function from unknown to text 
SQL state: XX000 

यह cast का उपयोग कर ठीक करने के लिए आसान था, लेकिन मैं पूरी तरह से समझ में नहीं आता कि ऐसा क्यों हुआ । मैं दो सरल बयान के साथ अपने भ्रम को प्रभावित करूंगा।

यह एक ठीक है:

select 'text' 
union all 
select 'text'; 

यह वापस आ जाएगी त्रुटि:

with t as (select 'text')  
select * from t 
union all 
select 'text' 

मैं जानता हूँ कि मैं इसे आसानी से ठीक कर सकते हैं:

with t as (select 'text'::text)  
select * from t 
union all 
select 'text' 

रूपांतरण में क्यों असफल है दूसरा उदाहरण? क्या कोई तर्क है जो मुझे समझ में नहीं आता है या यह PostgreSQL के भविष्य के संस्करण में तय किया जाएगा?

PostgreSQL 9.1.9

PostgreSQL 9.2.4 (SQL Fiddle) पर एक ही व्यवहार

उत्तर

36

Postgres खुश है, अगर यह संदर्भ से untyped स्थिरांक के प्रकार का पता लगा सकते। लेकिन जब कोई संदर्भ संभव नहीं होता है, और जब क्वेरी छोटी से अधिक जटिल होती है, तो यह तंत्र विफल हो जाता है। ये नियम किसी भी चयन खंड के लिए विशिष्ट हैं, और कुछ कठोर हैं, कुछ नहीं। यदि मैं कह सकता हूं, तो पुरानी दिनचर्या अधिक सहनशील होती हैं (ओरेकल के साथ उच्च संगतता और शुरुआती लोगों पर कम नकारात्मक प्रभाव), आधुनिक कम सहनशील होते हैं (त्रुटियों को टाइप करने के लिए उच्च सुरक्षा के कारण)।

कुछ प्रस्ताव टेक्स्ट निरंतर जैसे किसी भी अज्ञात शाब्दिक स्थिरता के साथ काम करने का प्रयास करते थे, लेकिन अधिक कारणों से अस्वीकार कर दिया गया था। तो मुझे इस क्षेत्र में महत्वपूर्ण बदलाव की उम्मीद नहीं है। यह मुद्दा आम तौर पर सिंथेटिक परीक्षण से संबंधित होता है - और वास्तविक प्रश्नों से कम, जहां कॉलम प्रकारों से प्रकारों को कम किया जाता है।

+2

मैं देखता हूं। मुझे वास्तविक जीवन में अक्सर इस मुद्दे का सामना करना पड़ता है। हम विश्लेषिकी/द्वि/डेटा खनन और untyped स्थिरांक के संघ के लिए PostgreSQL का उपयोग कर रहे हैं आम है। लेकिन जैसा कि मैंने कहा, इसे कास्ट करना आसान है। –

+1

मुझे संख्यात्मक अक्षर जैसे '1 :: int' क्यों नहीं डालना है? –

+0

@IainElder - संख्यात्मक प्रकार छोटे वर्ग होते हैं - किसी भी शाब्दिक स्थिर (जिसे "अज्ञात" के रूप में नामित किया जाता है) को किसी भी प्रकार के नंबर पर डाला जा सकता है - संख्या नहीं - तो पाप ('2.34') काम कर रहा है, लेकिन लंबाई (1) नहीं –

संबंधित मुद्दे